1. 程式人生 > >固件空中升級(OTA)與固件二次引導的原理和設計

固件空中升級(OTA)與固件二次引導的原理和設計

vid data 公眾 iss 畢業 hit clas 設計思想 andro

藍牙固件空中升級(OTA)涉及到藍牙無線通信、固件外存分布、固件內存分布(定制鏈接腳本)、固件二次引導等技術,須要開發者深入理解藍牙單芯片的存儲架構、啟動引導流程、外存設備驅動和產品電路設計等領域知識。完整和完美地設計和實現OTA,是一名嵌入式物聯網軟件project師最好的技術體現。

本文以Dialog公司研發的號稱全球最低功耗藍牙單芯片DA14580平臺為基礎進行分析和設計,但設計思想能夠推廣到其它藍牙單芯片平臺,甚至也適用於wifi固件空中升級。

一、OTA意義

固件空中升級是如此重要,在於:

1.修復產品缺陷。

2.豐富產品功能,添加用戶粘性。

3.叠代的產品升級,也有助於高速切入市場,減少總體開發成本。

二、場景和問題分析

技術分享

我們以常見的通過手機藍牙來升級藍牙設備固件這樣的方式來分析OTA會遇到什麽問題:

1.固件的形式。我們一般在調試時使用HEX格式來燒寫,HEX帶有地址信息。因此能夠燒寫到隨意地方,也即是固件的代碼和數據的分布是能夠不連續的。可是在OTA裏面。假設藍牙的OTA profile在接收到數據後還要進行hex到bin的轉換,那效率無疑是相當低的。因此一般的OTA都要求固件為bin格式,也意味著固件的代碼和數據要連續存放。

這裏說的數據是指const data和.data的初始化值。它們和.bss的執行時地址並不要求跟代碼的地址是連續的。程序執行起來,能夠將初始化數據搬到相應的執行時地址所相應的地方。Hex是標準格式,因此也有標準的Hex2bin工具來支持完畢轉換。

2.固件的頭。

除了代碼和數據,在無線傳輸中。怎樣讓對方覺得這是一份完整無錯誤的固件?這就須要在代碼和數據之外定義一個固件頭,它至少要包含校驗(通常是CRC)字段和代碼數據的長度字段。

這樣,對方能夠對代碼數據進行校驗。並將結果和校驗字段比較,以確定是否完整。另外,為了讓引導程序高速推斷是否是固件,宜在固件頭部進入固件標識字段,如0x7050是DA14580的第一次引導辨別的固件標識。而0x7051是二次引導辨別的固件標識。

3.OTA後藍牙設備是一份固件還是兩份固件?我們可能會想,反正在OTA過程中,原來的代碼數據已經執行在內存中,新固件能夠直接燒到原固件所在的地方,因此設備永遠都是僅僅存一份。假設是這樣,那我就不是必需在這裏巴拉巴拉那麽多了。

這樣的方法確實是可行的,可是萬一在傳輸的過程中出現意外(掉電,幹擾等等,這概率可不是萬一了),那就相當於設備裏面沒有固件。直接變成垃圾。所以支持OTA的設備必須要在外存中開辟不同的區域來存儲新、舊兩份固件。

4.兩份固件就夠了嗎?系統ROM中的一次引導程序是必讀某個外存地址的,兩份固件在不同的地方。一次引導怎麽知道要Run哪份固件呢?ROM的一次引導之前可沒有考慮OTA這檔子事的。所以我們自然應該要添加二次引導程序,讓二次引導程序放在ROM必讀的起始地址上,由二次引導程序(開發者能夠定制開發的)來推斷哪份固件是新的且是完整無誤的,再選擇性引導新固件。

5.二次引導加上兩份固件夠了嗎?事實上是夠的。可是不夠靈活。假如是這樣,那麽兩份固件一定要放置在二次引導程序指定的兩個地方,這顯然是很笨的方法,假如兩份代碼間隔設置大了會浪費,設置小了,萬一固件長度超了不就歇菜了。我們能夠考慮在二次引導程序指定的一個地方燒寫進一個簡單的配置文件,由該配置文件來指定兩份固件的起始點。


三、設備的外存固件分布

依據以上分析,我們能夠得出藍牙設備的外存固件分布圖,假設flash:

技術分享


四、設備芯片的內存框架和執行時內存分布

1.一般無線單芯片SOC

一般無線(藍牙和wifi)單芯片SOC都內置ROM和RAM。並支持多種外存引導。如nor flash、eerom,有些還可能有OTP等存儲類型。也可能支持SPI、I2C等總線接口方式。

二次引導程序被ROM中的一次引導程序從flash中引導到RAM中執行。而二次引導程序執行過程中也要將最新固件引導到RAM。因此,二次引導程序和固件所執行的RAM中是不能夠反復的,必須分布獨立的內存空間。

二次引導程序在引導出固件後,它的使命就完畢了,因此它所占有的內存空間應該被定義為固件的數據執行空間(如.bss段)。否則就浪費了。

綜上所述。一般的內存框架和執行時分布的圖演示樣例如以下:

技術分享

2.DA14580的內存框架和執行時內存分布

DA14580的內存框架應該說在低端電子產品SOC的設計領域是很經典的。它不僅在設計時因考慮OTA而將內存分塊為兩個區域(當然,當中也有深度睡眠時保存數據的原因),也為了低成本設計了OTP。

產品在公布能夠不要不論什麽外存。直接將固件燒進OTP就可以,當然沒有外存是不能夠OTA的。

假設支持OTA,那一般的方式是將二次引導程序燒寫到OTP。由於DA14580的一次引導程序支持多種方式引導,其嘗試引導的順序為OTP、SPI接口、I2C接口。所以放到OTP有利於加快啟動時間。

執行時圖演示樣例如以下:

技術分享

五、引導過程

有了以上分析,相信對引導過程很清晰了。

技術分享

六、藍牙OTA profile設計和實現

待下一篇文章再做具體解說。

嵌入式企鵝圈原創團隊迎來第四位重量級專家——NVIDIA資深project師Terry加盟。其2009年碩士畢業於華南理工大學通信與信息專業,一直在NVIDIA深耕GPU、自己主動駕駛、Android底層系統功耗優化等領域技術。現任研發經理。很多其它的嵌入式linux和android、物聯網原創技術分享請關註微信公眾號:

技術分享


固件空中升級(OTA)與固件二次引導的原理和設計