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 在這個目錄下指令:
--application-version 用來註記程式版本,要等於或大於之前的
--application 用來指定建置出來的.hex檔
--sd-req 用來指定使用的soft device, 可以使用以下指令查詢:
以我的情況來說,查到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的做法,下次有空再來談了。
只寫一半不太完整,以下簡單記錄後半部如何做。
前文提到以下:
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|
所以下了這個指令後,得到 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的做法,下次有空再來談了。
留言