1. 程式人生 > >一種嵌入式linux本地和遠端升級程式的方法

一種嵌入式linux本地和遠端升級程式的方法

    嵌入式linux裝置要進行軟體升級有很種多方式方法,總的來說可以分為本地升級和遠端升級。本地升級包括升級工具升級,儲存介質升級等,遠端升級是指通過網路進行程序升級。這裡介紹一種同時至此本地和遠端升級的方法,以供參考。

本地升級:

    (1)升級工具升級

    現在的升級工具有很多,不同的晶片支援不同的工具,比如jlink,串列埠等,海思的晶片提供Hitool升級工具。升級工具升級直接參考晶片手冊就可以了,這裡不再介紹。

    (2)儲存裝置升級

    常見的儲存裝置有SD卡,TF卡,U盤,硬碟等。將升級檔案拷貝到儲存裝置中,裝置啟動的時候,通過uboot去檢索儲存裝置中是否有升級檔案,如果有,則直接進行升級。

遠端升級:

    (1)uboot通過FTP服務下載升級檔案升級

    其實該方法可以說是本地升級也可以說是網路升級,uboot啟動之後,設定uboot的網路引數和FTP服務,通過網路將升級檔案下載到記憶體中,然後再通過uboot的flash擦除了寫入指令,將升級檔案直接寫入到flash的指定位置上。這種方式用來進行裝置除錯就可以,方便快捷,但它不能批量操作,也不能程式自動升級,需要人為的輔助。

    (2)通過應用程式網路升級

    該方法是嵌入式linux裝置遠端升級的最常用的方式。基本流程是:linux系統啟動之後,通過應用程式從伺服器中下載升級檔案進行程序升級。該方法不需要認為操作,可設計程式自動全部升級。

下面介紹一種可以同時至此本地升級和遠端升級的方法,首先看下圖:

Flash資料分佈示意圖
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的固定位置去,最後更新引數區的升級資訊。這樣就完成了遠端的升級操作。

    上面介紹的升級方法,只介紹了基本的思路,詳細實現內容太多不再介紹。如有更好的方法,歡迎評論指導。