藍牙固件升級(OTA升級)原理設計

轉:http://blog.csdn.net/yueqian_scut/article/details/50849033架構

 

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

原創 2016年03月10日 18:31:33

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

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

1、OTA意義post

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

1.修復產品缺陷。.net

2.豐富產品功能,增長用戶粘性。設計

3.迭代的產品升級,也有助於快速切入市場,下降總體開發成本。調試

2、場景和問題分析blog

咱們以常見的經過手機藍牙來升級藍牙設備固件這種方式來分析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.二次引導加上兩份固件夠了嗎?實際上是夠的,可是不夠靈活。假如是這樣,那麼兩份固件必定要放置在二次引導程序指定的兩個地方,這顯然是很笨的方法,假如兩份代碼間隔設置大了會浪費,設置小了,萬一固件長度超了不就歇菜了。咱們能夠考慮在二次引導程序指定的一個地方燒寫進一個簡單的配置文件,由該配置文件來指定兩份固件的起始點。

 

3、設備的外存固件分佈

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

 

4、設備芯片的內存框架和運行時內存分佈

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有利於加快啓動時間。

      運行時圖示以下:

5、引導過程

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

6、藍牙OTA profile設計和實現

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

相關文章
相關標籤/搜索