CC2640之OAD固件升級及合併方法

文章轉自https://blog.csdn.net/zzfenglin/article/details/52336612#comments

經過原文作者同意後轉載

什麼是OAD

OAD是TI在BLE協議棧基礎上擴展的一種無線更新技術。OAD使用客戶端-服務器的機制工作。需要固件更新的目標芯片叫做OAD Target/Client,用來管理OAD功能的一端叫做OAD Manager/Server。

 

配置OAD的目標設備,如果需要更新軟件的話,不用連接仿真器,通過BLE無線就可以更新軟件,方便用戶升級。

 

有些人會覺得OAD很複雜,其實並不複雜,本質就是OAD Manager/Server端將需要升級的bin文件字節流取出來,然後按照特定的長度(因爲BLE每個包的長度是受限的)通過write方法,將數據通過帶有寫權限的特徵值發送給OAD Target/Client端,然後OAD Target/Client 端將收到的數據寫到特定的flash地址上。

 

CC2640的OAD固件升級支持內置Flash和外置Flash兩種,我們先來了解下內置Flash的OAD配置方式,至於外置Flash的情況,後期再繼續更新。

CC2640內置Flash OAD

內置Flash的OAD固件升級配置之後,整個Flash中地址分配情況如下圖:


下面,我們來具體瞭解一下內置Flash的設備配置OAD的方法。


編譯ImageA

ImageA在官方文檔中是指OAD Target Application,因爲CC2640的工程燒錄的時候是將BIM、BLE STACK和OAD Target Application這三者hex文件合併成“OAD_merge.hex”文件,所以我們在下面的介紹文檔中用ImageA來統稱這三者合併之後的“OAD_merge.hex”文件,希望大家不要混淆了,這裏這樣統稱,只是爲了方便下述流程的說明。

 

下面,我們一起來看看編譯的方法和編譯過程中出現的問題及解決辦法:

1.先打開IAR開發工具,然後將

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR”

目錄下的“OADTarget.eww”拖到IAR的左側工作區,打開“OADTarget”工程,打開之後顯示如下:

我們可以看到,打開的工程包含了BIM、CC2640App和CC2640Stack,編譯過程爲:首先編譯BIM,然後編譯CC2640Stack,最後編譯CC2640App,編譯CC2640App的時候會在編譯完成的時候調用Python執行“hexmerge.py”腳本來將編譯生成的三個hex文件合併成一個。

 

2.BIM和CC2640Stack的編譯沒有什麼問題,我們不再講述,下面重點來看一下CC2640App編譯之後執行合成腳本的時候出現的問題,沒有進行任何配置的情況下,會提示下面截圖的信息:


這個錯誤是因爲沒有安裝Python或者你安裝的目錄不是“C:\Python27\”下,導致找不到該執行文件,Python的安裝過程可以參考下面鏈接中的博文:

點擊打開Python安裝配置博文鏈接

Python安裝完成並配置環境變量之後,我們還需要下載合成腳本,並複製到Python的安裝目錄下,合成腳本“hexmerge.py”的下載鏈接如下:

https://launchpad.net/intelhex/+download


打開上述下載鏈接之後截圖如下:


上面鏈接中列出了很多不同時期的版本,我下載的是上述截圖中的紅圈圈中的這個,下載到電腦上之後,解壓縮顯示如下:


我們需要的腳本在解壓出來的文件夾的“scripts”目錄下,將該目錄下的所有py腳本都複製到“C:\Python27\Scripts”目錄下。

 

3.重新編譯“CC2640App”,但是這個時候又會出現下面的編譯錯誤:

從上面截圖中的編譯錯誤提示,我們看不出什麼原因,這個時候,我們可以將錯誤提示中的那些命令複製出來,刪掉換行符和不必要的空格,剩下的內容如下:

 

python "C:\Python27\Scripts\hexmerge.py" -o "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\FlashROM\Exe\OAD_merge.hex" -r "0000:1FFFF" --overlap=error "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\FlashROM\Exe\OADTargetApp.hex":0100:1FFFF "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\..\..\..\..\..\util\BIM\CC26xx\FlashOnly\Exe\BIM.hex":0000:1F5FF "C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\CC2640\..\..\Stack\CC2640\FlashROM\Exe\OADTargetStackFlashROM.hex":F000:1EFFF 

這其實就是合併文件的命令,而且是絕對路徑的,那我們就可以在windows命令行中運行一下看看是否會提示更詳細的錯誤信息,運行結果截圖如下:


果然,不出所料的有更詳細的提示信息,提示錯誤是導入“intelhex”模塊的時候發現沒有該模塊,當然,我們也可以打開“hexmerge.py”腳本,然後看看錯誤提示中提到的139行的內容,來了解具體執行的地方,截圖如下:


解決辦法:將下載解壓的“intelhex-2.1”文件夾下的“intelhex”文件夾整個複製到“C:\Python27”目錄下,然後重新編譯,這樣就可以成功編譯了,編譯成功之後會在

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR\Application\

CC2640\FlashROM\Exe”

目錄下生成“OAD_merge.hex”文件,這就是我們需要的ImageA的hex文件。

 

注意:用這個ImageA升級ImageB的話,如果用PC端的BLE Device Monitor或者安卓手機端的APP都會出現連接失敗,或者搜索不到服務,或者搜索到服務之後過一會就斷開,或者升級過程中斷開連接等問題,這個問題的主要原因是ImageA的CC2640App開啓了BLE連接成功之後自動申請修改連接參數的功能,在

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\Source\Application”目錄下的“oadTargetApp.c”文件中,相關代碼截圖如下:


自動申請的連接參數最小是80,最大是800,這個連接間隔太長,會影響升級,所以我們將“DEFAULT_ENABLE_UPDATE_REQUEST”的值改爲“FALSE”來關閉自動申請連接參數更新,進而用默認的連接參數進行升級。這樣PC端的BLE Device Monitor才能正常連接並進行升級。如果爲了提高升級的速度,需要將連接間隔縮小,那用PC端的BLE Device Monitor的話可以用該工具進行設置;若用手機端進行升級的話,可以將需要的連接間隔通過某個特徵值發給從機,由從機來重新申請。


燒錄ImageA

將開發板通過XDS仿真器鏈接到電腦上,連接的方法、Flash Programmer工具以及驅動的安裝我們這裏不再講述,準備好之後,打開Flash Programmer 工具,然後按照下圖進行操作:


成功燒錄之後,我們用PC端的BLE Device Monitor工具進行搜索和連接,之後可以看到相應的服務和特徵值,截圖如下:

此處有一點需要注意,就是ImageA中固定了Mac地址,也就是,如果用協議棧中的Demo編譯ImageA,其Mac地址都是“0A:D0:AD:0A:D0:AD”,而後面編譯的ImageB用的是芯片本身的Mac地址,這樣可以避免用安卓手機等方式升級時,因爲藍牙緩存的原因導致設備名、服務和特性沒有改變的問題。

 

當然ImageA的Mac地址也可以根據自己的需求進行修改,但是要保證跟現有的已經分配的Mac地址不衝突,所以除非必須改,否則不要動這個地方。代碼中設置的地方截圖如下:


 

編譯ImageB

我們先用TI協議棧中的Demo進行測試和整個流程的熟悉。如何在一個沒有配置過OAD的工程中配置OAD ImageB的相關內容在另一篇博文中講解,鏈接如下所示:

點擊打開手動配置ImageB的博文

 

1.打開協議棧中的“SimpleBLEPeripheral”工程,“CC2640App”選擇“FlashOnly_OAD_ImgB”,截圖如下:

2.首先編譯“CC2640Stack”,然後編譯“CC2640App”,成功編譯之後,會在
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\IAR\Application\

CC2640\FlashOnly_OAD_ImgB\Exe”

目錄下生成“OADbin.bin”文件,這個就是ImageB的bin文件。


3.用PC端的BLE Device Monitor工具或者安卓手機端工具將該文件更新到設備端之後,會發現設備端重啓之後不再廣播,程序跑不起來,如果出現這種情況,打開

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\IAR\Config”

目錄下的“appBLE.cfg”文件,將開頭的如下兩行代碼屏蔽掉:

//var ROM = xdc.useModule('ti.sysbios.rom.ROM');
//ROM.romName = ROM.CC2650;


操作截圖如下:


至於這個地方爲什麼要這樣,TI官方文檔其實有說明。官方文檔中的說明如下:

升級ImageB

ImageB用PC端BLE Device Monitor工具升級過程如下:

1.用BLE Device Monitor工具,搜索並連接我們要升級的設備,然後點擊菜單欄上的“File”,在下拉菜單中選擇“Program(OAD)”,操作截圖如下:


2.點擊“Program(OAD)”之後,會彈出如下所示的框框:


“File Image”裏面要選擇的文件就是我們要更新的固件,我的是在

“C:/ti/simplelink/ble_cc26xx_2_01_00_44423/Projects/ble/SimpleBLEPeripheral/CC26xx/IAR/Application/

CC2640/FlashOnly_OAD_ImgB/Exe/OADbin.bin”目錄下的該文件,選擇之後,點擊“Start”進行升級,升級過程如下:


待進度條走完,升級就完成了,該提示框會自動消隱。

 

3.升級完成之後,然後重新用PC端的BLE Device Monitor工具進行搜索和連接(如果搜索不到,就重啓下設備然後再試試),截圖如下:


ImageB的設備名我特意進行了修改,目的是與ImageA的進行區分,並且看右側跟之前ImageA的相比較也明顯能看出服務和特性都不一樣了,證明我們的升級成功了。

 

4.到了這一步,ImageB的固件就升級到我們的目標設備上了,但是ImageB本身不帶升級功能,所以沒有辦法來升級ImageA,有人會問,那我們要更新ImageB怎麼辦呢?也就是我們如何從ImageB切換到ImageA,然後重新升級新的固件ImageB呢?

 

TI考慮到了這一點,所以增加了一個UUID爲“FFD0”的服務和UUID爲“FFD1”的特徵值,用戶可以向該特徵值寫入任意值,設備端就會切換回ImageA,截圖如下:


重新搜索設備,就會發現設備切換到ImageA了。

因爲本人是個愛學習的小學生,所以我們再一起來看看上述切換的實現代碼及原理,實現代碼在

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\Profiles\OAD\CC26xx”

目錄下的“oadResetService.c”文件中,源碼截圖如下:


關鍵的部分就是紅圈裏面的內容,源碼如下:

uint16_t crc[2] = {0x0000, 0x0000};
 
// Invalidate the image.
OADTarget_writeFlash(OAD_IMG_R_PAGE, OAD_IMG_R_OSET + OAD_IMG_CRC_OSET,
        (uint8_t *)crc, 4);
 
// Reset.
HAL_SYSTEM_RESET();

從上述代碼中不難看出,所謂的ImageB切換回ImageA,其實就是將Flash中ImageB校驗字節寫成0,因爲重啓設備的時候運行到BIM中會先去判斷ImageB的校驗字節,如果全爲0,就認爲ImageB不完整或者沒有,然後去判斷ImageA的校驗字節,如果ImageA的校驗字節完整非0,就去運行ImageA。有的人覺得爲了這個功能單獨配置一個服務和特徵值太浪費了,那我們可以將這個服務和特徵值刪掉,然後在你必須要保留的特徵值中找一個帶有寫權限的,然後在主機通過該特徵值寫入某個命令的時候執行上述代碼即可。


到這裏,CC2640 OAD的整個過程就瞭解完了。


TI官方OAD文檔

TI官方OAD文檔在安裝的協議棧中,在

“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Documents”目錄下的“CC2640 BLE OAD User's Guide.pdf”文檔中。
 

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