嵌入式Linux設備要進行軟件升級有很種多方式方法,總的來說可以分為本地升級和遠程升級。
本地升級包括升級工具升級,存儲介質升級等,遠程升級是指通過網絡進行程序升級。
這里介紹一種同時至此本地和遠程升級的方法,以供參考。
本地升級
(1)升級工具升級
現在的升級工具有很多,不同的芯片支持不同的工具,比如jlink,串口等,海思的芯片提供Hitool升級工具。升級工具升級直接參考芯片手冊就可以了,這里不再介紹。
(2)存儲設備升級
常見的存儲設備有SD卡,TF卡,U盤,硬盤等。將升級文件拷貝到存儲設備中,設備啟動的時候,通過uboot去檢索存儲設備中是否有升級文件,如果有,則直接進行升級。
遠程升級:
(1)uboot通過FTP服務下載升級文件升級
其實該方法可以說是本地升級也可以說是網絡升級,uboot啟動之后,設置uboot的網絡參數和FTP服務,通過網絡將升級文件下載到內存中,然后再通過uboot的flash擦除了寫入指令,將升級文件直接寫入到flash的指定位置上。
這種方式用來進行設備調試就可以,方便快捷,但它不能批量操作,也不能程序自動升級,需要人為的輔助。
(2)通過應用程序網絡升級
該方法是嵌入式linux設備遠程升級的最常用的方式。基本流程是:linux系統啟動之后,通過應用程序從服務器中下載升級文件進行程序升級。該方法不需要認為操作,可設計程序自動全部升級。
本地和遠程同時升級
下面介紹一種可以同時至此本地升級和遠程升級的方法,首先看下圖:
Flash數據分布示意圖
假設有個64M的flash,間Flash分成uboot,kernel,roootfs,app,para 五個分區。然后我們在參數區para分區的開始一段空間用來存儲升級文件的版本信息。
參數區的深藍色區域用來存儲軟件的版本信息,橙色區域用來存儲網絡升級參數。下面以kernel升級為例,具體說明本地升級與網絡升級的流程,其它模塊升級于此相同。
(1)制作升級文件
編譯器或是交叉編譯工具編譯生成的文件多數是二進制文件,也就是單純的一個升級文件,不包含其他信息。攜帶更多的升級信息,我們可以將二進制升級文件.bin 打包成img 文件。
在Linux系統中可以直接使用mkimage命令,該命令可以指定CPU類型,img類型,壓縮類型,內核的入口地址,頭結構的名字,image的載入地址等等信息。
(2)本地升級實現
將img文件拷貝到U盤中插入設備。uboot需要為升級做如下操作:uboot起來之后,去掃描是否有插入存儲設備,如果有存儲設備,則掃描存儲設備中是否有升級文件,以升級kernel為例,假設升級文件名為update_kernl.img。
當uboot檢測到update_kernel.img文件后,去解析該img文件的文件頭。將有用信息提取出來,比如文件頭里的時間,img的創建時間等。
以這些作為升級參數,與上面flash圖參數區中的Kernel Para版本做比較,如果一樣則不進行升級操作,如果不一樣,則將img文件中的升級文件數據寫入到flash的指定位置中去。
最后更新Flash參數區kernel的版本信息。也就是上面圖中參數區深藍色中的Kernel Para。到此就完成了本地升級的操作。
(3)遠程升級實現
首先將升級文件update_kernel.img從服務器中下載下來,與本地升級類似,提取update_kernel.img的頭文件信息與Kernel Para參數做比較,如果不一樣就升級。
一般升級地址是存在uboot的參數里,所以我們可以先將升級文件放到內存中(Hi3520芯片有一部分內存是用來做編解碼的,軟重啟內存的數據不會被清空),uboot重啟之后再進行升級操作。
在重啟之前,將升級文件存放的地址AddrPhy,升級文件的校驗信息DataCrc32,版本信息Version存放到flash的參數區去。
也就是上圖參數區的橙色位置。uboot重啟之后,去讀取上圖中flash參數區的橙色區域信息,看是否有需要升級的文件,如果有就按照升級參數的地址去讀取升級文件,然后再將升級文件寫到flash的固定位置去,最后更新參數區的升級信息。這樣就完成了遠程的升級操作。
上面介紹的升級方法,只介紹了基本的思路,詳細實現內容太多不再介紹。如有更好的方法,歡迎評論指導。
審核編輯 :李倩
-
嵌入式
+關注
關注
5087文章
19148瀏覽量
306171 -
Linux
+關注
關注
87文章
11322瀏覽量
209862
原文標題:嵌入式本地和遠程升級程序的方法
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論