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