目錄
1 引言
1.1 編寫目的
本文檔簡要說明了L182項目FOTA方案的原理及流程,爲後續FOTA功能的實現有指導性作用,閱讀者對方案的實現有大致的瞭解。
1.2 背景
L182使用的是ASR1820s項目代碼,硬件平臺是Marvell,所使用的嵌入式實時操作系統是ThreadX5.1,在小衆系統、存儲空間有限的硬件資源的情況下實現FOTA功能是一種挑戰。
1.3 定義與縮寫
本文檔中使用的術語如表1-1術語表所示。
表1-1 術語表
縮寫、術語 |
解 釋 |
FOTA |
Firmware Over-The-Air |
FTP |
File Transfer Protocol |
HTTP |
Hyper Text Transfer Protocol |
|
|
|
|
1.4 參考資料
本模塊概要設計的參考資料如表1-2 參考資料表所示。
表1-2 參考資料表
序號 |
文檔名稱 |
作者或資料來源 |
1 |
DFOTA介紹.pdf |
ARS document release |
2 |
Xdelta3原理 |
https://blog.csdn.net/add_ada/article/details/51232869 |
3 |
Xdelta3 bsdiff Courgette三種差分算法比較 |
https://blog.csdn.net/shangyexin/article/details/82885583 |
4 |
|
|
5 |
|
|
2 總體設計
2.1 設計原理
DFOTA實現採用xdelta項目,xdelta基於vcdiff算法,ASR1802S OBM移植了xdelta的decoding部分完成差分升級。
2.1.1 XDELTA
Xdelta是基於字節的Vcdiff編碼,一種優秀的、被廣泛使用的差量更新算法,它在操作上既有對新文件(targetfile)和舊文件(sourcefile)的差分(differencing)又有對產生的patch包進行壓縮(compression),我們將產生patch包的過程統稱爲加密(encoding),而將合成新文件的過程統稱爲解密(decoding)。Xdelta和經典的壓縮算法LZ’77一樣,也是將source file劃分成一個個不相交而又連續的window,然後進行encoding和decoding。
設target file的大小爲n,source file的大小爲m,window的大小爲w。由於Xdelta在合成target file所消耗的時間爲O(n),所消耗的內存大小爲O(w),所以該壓縮算法很適合被移植到嵌入式設備中。
2.1.2 VCDIFF算法介紹
Vcdiff可以實現文件的差分並壓縮的功能,當原文件爲空時,則相當於對新的文件直接壓縮。Vcdiff採用差分文件包含:ADD、COPY、RUN[、NOOP(空)]等操作方式。生成差分文件前,需要首先進行Vcdiff decoding,具體採用128進制來重新編碼,帶來的好處: 一是在不同的系統中統一採用8比特的字節編碼方式,二是對於小數字則可以節省存儲空間;在RF3284給出的示例將123456789,經過編碼後表示爲MSB+58,MSB+111,MSB+26,0+21,二進制值爲10111010 11101111 10011010 0010101,最高位MSB用來表示數據是否完成,1時表示下個字節仍屬於同一數據塊,即123456789 = 128*(128*(58 * 128 + 111) + 26) + 21。編碼完成後的文件生成差分格式包,也可進行壓縮後再進行傳輸。差分包執行過程示例如下,舊的文件內容爲a b c d e f g h i j k l m n o p,差分包包含指令COPY 4, 0;ADD 4, w x y z;COPY 4, 4;COPY 12, 24;RUN 4, z COPY指令帶有兩個參數,第一個爲長度,第二個爲地址;ADD指令帶有長度和,相應插入的符號信息;RUN指令將某字符重複多次。
在生成差分文件時需要進行字符串比較,有後綴樹及hash等方式,Vdelta中使用快速字符串比較算法(a fast string matching algorithm 可以使用相對其他算法較少的內存空間)。Vdelta的過程就是壓縮的過程,生成差分包的過程,可以理解爲原始包和新的包級聯,然後進行壓縮,只輸出新包部分的信息即爲差分包。理解生成差分包過程如下,採用最低3個字節匹配(需要使用合適前綴匹配,簡單理解當匹配字符串太長時,匹配成功可能性低,較短如一個字符比較時,索引開銷可能比存儲Index還大)。
VCDIFF可以在一種機器上encoding而在另一種機器上decoding,且encoding與decoding的過程相對獨立,可移植性強。Patch包被分爲三個獨立的部分,便於使用不同的技術來分別改進它們的編碼、壓縮,並且支持二次壓縮。Decoding的時間與內存消耗爲線性。而encoding的過程中,最主要的部分爲每次尋找最大匹配串的string matching過程,這個過程可採用hash,suffix trees,fast string matching等技術來優化,但其時間內存消耗對大文件而言仍不可接受,使用windows劃分這一技術有效的解決了問題。window的大小是一個重要的參數,window越大,
最長字符串匹配的結果越精確,產生的patch可能越小,而時間內存消耗則變大;window越小,則反之。
2.1.3XDELTA的選擇
爲什麼選擇xdelta而不是bsdiff ?
bsdiff and bspatch are tools for building and applying patches to binary files. By using suffix sorting (specifically, Larsson and Sadakane's qsufsort) and taking advantage of how executable files change, bsdiff routinely produces binary patches 50-80% smaller than those produced by Xdelta, and 15% smaller than those produced by .RTPatch (a $2750/seat commercial patch tool).
bsdiff is quite memory-hungry. It requires max(17*n,9*n+m)+O(1) bytes of memory, where n is the size of the old file and m is the size of the new file. bspatch requires n+m+O(1) bytes.
從這裏可以看出bsdiff比xdelta壓縮比更高,但是bsdiff消耗的內存非常大,只考慮在設備上做decoding的話,bsdiff需要n+m+O(1)的內存,這對於1802s的系統升級是不可接受的,而xdelta採用window方法,可以減小內存使用量,bsdiff看起來更適合系統中單個文件的升級,比如手機上的app。
2.2需求規定
自動定時檢測當前設備是否存在新的固件版本,若存在自動下載最新的固件進行系統升級;提供版本檢測、固件下載、固件下載進度等AT命令給第三方做升級相關的二次開發。
2.3運行環境
硬件平臺:Marvell MP1820
實時操作系統:ThreadX5.1
2.4 FOTA原理框圖
2.5系統軟件架構
2.6升級流程圖
3接口設計
3.1 AT命令
序號 |
名稱 |
輸入參數 |
功能描述 |
1 |
$MYFOTACHECK |
null |
檢查是否存在新的版本 |
2 |
$MYFOTA |
<channel>,<mode>,<dst_ip/url:port>,<username>,<password> |
下載升級包 |
3 |
$MYFOTA? |
null |
獲取升級包下載進度 |
Note:下載升級包時若服務器不要求username或password該項參數可以填空格或任意字串
下載進度的返回值爲0-100
Eg:
AT$MYFOTA=1,0,"182.151.214.173:1027/fbf_dfota_full.bin",ftpuser,ftpuser
AT$MYFOTA=1,1,"182.151.214.173:1883/fbf_dfota.bin", ,
AT$MYFOTA?
3.2關鍵數據結構
數據結構名 |
fotaSetOpenReq |
定義模塊 |
AT |
||
功能簡述 |
升級請求參數 |
類型 |
結構體 |
||
成員 |
成員名 |
類型 |
初始值 |
說明 |
|
host |
Char |
Null |
服務器url |
||
username |
Char |
Null |
用戶名 |
||
password |
Char |
Null |
密碼 |
||
mode |
unsigned char |
0 |
模式 |
||
詳細描述 |
Host:下載文件的地址(xx.xx.xx.xx:port, or URL) Mode:下載方式(0: ftp, 1: http) |
4 FOTA服務器要求
由於ARS1802S平臺DFOTA獲取固件的途徑是基於FTP/HTTP協議的,所以FOTA服務器只要是商用FTP或HTTP服務器即可(考慮多臺設備的)。
附錄:
1802S DFOTA
差分升級步驟如下:
1. 首先將CP,MSA,RF 等文件使用xdelta 工具分別做出兩個版本之間的差分文件;
2. 使用ASR 自帶的fbf 生成工具將上面的各個差分文件組成一個完整的fbf_dfota 升級文件;
3. 使用ftp 或者http 下載fbf_dfota 文件至flash 中;
4. 開機後OBM 將flash 中的fbf_dfota 解析並將原文件和差分組成新的文件,拷貝到對應flash 中;
5. 記錄相關狀態,斷電保護等,完成升級;
舉例:
- 輸出CP 的差分文件delta_file_cp.bin
xdelta3-3.1.0-x86_64.exe -S -f -v -W 1048576 -e -s NEZHAC_CP_SKL_MIFI_TX_old.bin NEZHAC_CP_SKL_MIFI_TX_new.bin delta_file_cp.bin
2.生成fbf_dfota.bin 文件,MakeFOTAImage.exe 工具如果帶上-d 參數代表生成的fbf 是dfota 文件,用於差分升級;否則代表完整的fbf,用於完整升級
MakeFOTAImage.exe -d -f NezhaC_MiFi_SPI_Nand_LWG_Only_Nontrusted.blf -o fbf_dfota.bin -v NeZhaC_MSA_1.012.000
3.1802S支持at命令的ftp和http升級,使用ftp下載
AT$MYFOTA=1,0,"192.168.0.100/fbf_dfota.bin",asrdfota,123456
使用AT$MYFOTA?查詢升級進度
4.下載成功後,重啓設備就會看到decoding過程:
DFOTA upgrade
DFOTA_Upgrade,DFota_nOfImages
0xffffffff
DFOTA_Upgrade,pDevHeader_11->nOfImages
0x00000004
DFOTA_Upgrade,FBF_Flash_Address =
0x041e0000
DFOTA_Upgrade,FBF_Size
0x0014c000
ChecksumFormatVersion2
0x00000000
ChecksumFormatVersion2
0x00000000
ChecksumFormatVersion2
0x00000000
ChecksumFormatVersion2
0x8a54c727
DFOTA_Upgrade,sfile_flash_address
0x00060000
DFOTA_Upgrade,ofile_flash_address
0x04340000
DFOTA_Upgrade,delta file size
0x00142380
[DFOTA],windows
0x00000000
in bytes:
0x0001579d
out bytes:
0x00100000
total in bytes:
0x0001579d
total out bytes:
0x00100000
[DFOTA],windows
0x00000001
in bytes:
0x00014a42
out bytes:
0x00100000
total in bytes:
0x0002a1df
total out bytes:
0x00200000
[DFOTA],windows
0x00000002
in bytes:
0x0002556f
out bytes:
0x00100000
total in bytes:
0x0004f74e
total out bytes:
0x00300000
[DFOTA],windows
0x00000003
in bytes:
0x0004116a
out bytes:
0x00100000
total in bytes:
0x000908b8
total out bytes:
0x00400000
[DFOTA],windows
0x00000004
in bytes:
0x00028e62
out bytes:
0x00100000
total in bytes:
0x000b971a
total out bytes:
0x00500000
[DFOTA],windows
0x00000005
in bytes:
0x0003105c
out bytes:
0x00100000
total in bytes:
0x000ea776
total out bytes:
0x00600000
[DFOTA],windows
0x00000006
in bytes:
0x00040816
out bytes:
0x00100000
total in bytes:
0x0012af8c
total out bytes:
0x00700000
[DFOTA],windows
0x00000007
in bytes:
0x00011f06
out bytes:
0x00100000
total in bytes:
0x0013ce92
total out bytes:
0x00800000
[DFOTA],windows
0x00000008
in bytes:
0x000054ed
out bytes:
0x000a3e64
total in bytes:
0x0014237f
total out bytes:
0x008a3e64
warning !!!may be FBF tool add,avail_in
0x00000001
decode finished !!!
input bytes:
0x00142380
output bytes:
0x008a3e64
DFOTA_Upgrade,Flash_erase_size =
0x00a00000
DFOTA_Upgrade,Flash_Start_Address =
0x00060000
DFOTA_Upgrade ofile_flash.file_offset
0x008a3e64
DFOTA_Upgrade ofile_flash.file_address
0x04340000
Clear upgrade flag OK
TR069 return
0x00000000
----------------------------- WDT rest --------------