Nordic nRF52 OTA (BLE DFU) part II

前文提到nRF52實作OTA的方法,但只談了前半部,因為後半部較簡單,本來不想寫了!

只寫一半不太完整,以下簡單記錄後半部如何做。
前文提到以下:
1 做private key, public key
2 利用public key, 做出secure bootloader

接下來把secure bootloader燒錄到nRF52晶片去,可以用nRF Connect, 或IDE (例如SES)來做。

然後查看手機或電腦的nRF Connect App來查看裝置,應該可以看到DfuTarg這個名字的裝置,這就是在運作中的Secure bootloader了。

接下來要製作要更新的firmware包裝檔:
1 在IDE裡建置專案(例如,SES裡Build, F7),然後找到建置出來的.hex檔,複製到你要的目錄去,這個目錄裡放置你之前建立的private key檔案。
2 在這個目錄下指令:
nrfutil pkg generate --hw-version 52 --application-version 1 --application ble_app_xxx_pca10040_s132.hex --sd-req 0xcb --key-file private.key hid_dfu_package.zip
注意:
  --application-version 用來註記程式版本,要等於或大於之前的
  --application 用來指定建置出來的.hex檔
  --sd-req 用來指定使用的soft device, 可以使用以下指令查詢:
% nrfutil pkg generate --help
 ...
--sd-req TEXT                   The SoftDevice requirements. A comma-
                                  separated list of SoftDevice firmware IDs (1
                                  or more) of which one must be present on the
                                  target device. Each item on the list must be
                                  a two- or four-digit hex number prefixed
                                  with "0x" (e.g. "0x12", "0x1234"). A non-
                                  exhaustive list of well-known values to use
                                  with this option follows:
                                  |s112_nrf52_6.0.0|0xA7|
                                  |s112_nrf52_6.1.0|0xB0|
                                  |s112_nrf52_6.1.1|0xB8|
                                  |s112_nrf52_7.0.0|0xC4|
                                  |s112_nrf52_7.0.1|0xCD|
                                  |s113_nrf52_7.0.0|0xC3|
                                  |s113_nrf52_7.0.1|0xCC|
                                  |s130_nrf51_1.0.0|0x67|
                                  |s130_nrf51_2.0.0|0x80|
                                  |s132_nrf52_2.0.0|0x81|
                                  |s130_nrf51_2.0.1|0x87|
                                  |s132_nrf52_2.0.1|0x88|
                                  |s132_nrf52_3.0.0|0x8C|
                                  |s132_nrf52_3.1.0|0x91|
                                  |s132_nrf52_4.0.0|0x95|
                                  |s132_nrf52_4.0.2|0x98|
                                  |s132_nrf52_4.0.3|0x99|
                                  |s132_nrf52_4.0.4|0x9E|
                                  |s132_nrf52_4.0.5|0x9F|
                                  |s132_nrf52_5.0.0|0x9D|
                                  |s132_nrf52_5.1.0|0xA5|
                                  |s132_nrf52_6.0.0|0xA8|
                                  |s132_nrf52_6.1.0|0xAF|
                                  |s132_nrf52_6.1.1|0xB7|
                                  |s132_nrf52_7.0.0|0xC2|
                                  |s132_nrf52_7.0.1|0xCB|
                                  |s140_nrf52_6.0.0|0xA9|
                                  |s140_nrf52_6.1.0|0xAE|
                                  |s140_nrf52_6.1.1|0xB6|
                                  |s140_nrf52_7.0.0|0xC1|
                                  |s140_nrf52_7.0.1|0xCA|
                                  |s212_nrf52_6.1.1|0xBC|
                                  |s332_nrf52_6.1.1|0xBA|
                                  |s340_nrf52_6.1.1|0xB9|

以我的情況來說,查到0xCB。

所以下了這個指令後,得到 hid_dfu_package.zip 就是我們要用來OTA用的包裝檔了。

有了包裝檔,讓我們回到nRF Connect App, 看到前面的圖,在找到裝置DfuTarg後,連線上去,可以看到裝置名字右方多了一個DFU的圖示,按下去,出現下圖。
點選Choose, 選取剛才製做出來的包裝檔。出現下圖,按Start DFU。
就會開始進行OTA的工作了,如下圖:
等完成後,如下圖:
按Close就完成了。

如果用手機來操作的話,其實也差不多:
在用nRF Connect連上之後,同樣先找到DfuTarg裝置,連線上之後,往右滑到DFU頁面:

點按 Open Document Picker, 同樣去選取之前做出來的包裝檔(因為包裝檔是在電腦上做出來的,所以你自己要想辦法把包裝檔複製到手機去。可以用隨身碟,或者網路硬碟空間之類的。如果電腦和手機都是Apple的,就更簡單了,它的iCloud雲碟會自動同步手機和電腦的文件夾,所以只要把包裝檔放在文件這個目錄,待其同步後就可以在手機裡選到了)後,出現以下:

再按 Start 就會開始進行OTA了。下圖是進行中的樣子,動畫做的很好看,真是用心!

完成時的樣子,如下圖:

這樣應該就更新好了!可以重新尋找裝置,看是不是正常運作。

問題:下一次的OTA要如何做?
回答:同樣的開發好新的程式後,建置出新的.hex檔,用本文前面提到的方法和指令製作出新的包裝檔,記得要給等於或大於之前的 --application-version, 然後要將裝置放到可DFU的狀態,方法是按下Button 4不放, 再Reset裝置。如此nRF Connect就會看到DfuTarg, 此時就可進行OTA了。

對了,這個按下Button 4不放, 再Reset裝置的方法,有時不方便做,可能你的裝置沒有按鈕之類的原因。所以Nordic有提供一個Buttonless的做法,下次有空再來談了。




留言

這個網誌中的熱門文章

D-BUS學習筆記

Cisco Switch學習筆記: EtherChannel

Cisco Switch學習筆記: interface的封包錯誤統計