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

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

本文以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設計和實現

      待下一篇文章再做詳細講解。

      更多的嵌入式linux和android、物聯網原創技術分享請關注微信公衆號:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章