Nordic nRF52 OTA (BLE DFU)
透過藍牙傳輸做韌體更新的方法,我自己習慣用OTA(over the air)來稱呼。但其實不同的廠家有不同的名稱,有人叫SUOTA(software update over the air),Nordic則稱做DFU(device firmware update)。又有兩種管道可以使用:USB, BLE。透過藍牙傳輸做韌體更新的就是BLE DFU。
怎麼做到,有原廠文件說明,參考以下連結:
getting-started-with-nordics-secure-dfu-bootloader
其主要運作方式依靠secure bootloader提供服務,讓nRF Connect, nRF Toolbox等master code可以由藍牙將新韌體傳送給裝置做更新。而Nordic的nRFSDK裡的範例程式就有提供secure bootloader原始檔給大家使用,當然也不能讓任意人傳任意的韌體就可以更新你的裝置!所以secure bootloader在收到master code送來的dfu package時會先檢查其中的數位簽章,符合才會往下做。理論上這是不可能破解的!因為這個架構,所以secure bootloader存有public key,而在産生dfu package時就要使用private key來製作簽章。
那産生public key / private key的工具,nordic也幫大家準備好了,就是nrfutil,安裝方法:
Mac OSX:
pip3 install nrfutil --upgrade
Linux:
pip install nrfutil --upgrade
最好檢查一下版本不要太舊: (我裝的是6.1.0)
nrfutil version
産生private key的指令:
nrfutil.exe keys generate private.key
産生public key的指令:
nrfutil keys display --key pk --format code private.key --out_file public_key.c
-------------------------------------------------------------------------------
編譯secure bootloader
/examples/dfu/secure_bootloader/pca10056_s140_ble/ses/secure_bootloader....emProject
這個專案打開後把dfu_public_key.c檔刪除,加入之前做出來的public_key.c再進行編譯(F7)就可以做出secure bootloader的hex檔。這個是針對pca10056的開發板,也就是nrf52840 DK配合 software Device S140的情況下使用的。原廠文件中提到要先處理的uECC library,似乎此時並不需要。
那在使用nRF5281 Soc配合software device s112的話,那就打開這個專案檔:
/examples/dfu/secure_bootloader/pca10056e_s112_ble/ses/secure_bootloader....emProject
原想52811也是用52840 DK這板子模擬開發,應該也是不用uECC library吧!結果不是,一編譯就出現找不到uECC.h的錯誤訊息。
所以依原廠文件去下載micro-ecc,並放置到/external/micro-ecc目錄下,
然後要先編譯micro-ecc, 但是有許多媥譯器和整合環境工具的組合,那要選那一個呢?
簡單的方法,就是回到ses去繼續編譯secure bootloader,看到新出現的錯誤會告訴您找不到那個檔案,那就知道要去編那一個了。這裡我看到要去編nrf52nf_armgcc/armgcc/xxxx.a
於是:
cd/external/micro-ecc/nrf52_armgcc/armgcc
make
不料出現錯誤訊息:
make: /usr/local/gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc: Command not found
Cannot find: '/usr/local/gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc'.
Please set values in: "/media/ubuntu/usbdata/nRF5SDK_16.0.0/nRF5_SDK_16.0.0_98a08e2/components/toolchain/gcc/Makefile.posix"
according to the actual configuration of your system.
../../../../components/toolchain/gcc/Makefile.common:129: *** Cannot continue. Stop.
怎麼做到,有原廠文件說明,參考以下連結:
getting-started-with-nordics-secure-dfu-bootloader
其主要運作方式依靠secure bootloader提供服務,讓nRF Connect, nRF Toolbox等master code可以由藍牙將新韌體傳送給裝置做更新。而Nordic的nRFSDK裡的範例程式就有提供secure bootloader原始檔給大家使用,當然也不能讓任意人傳任意的韌體就可以更新你的裝置!所以secure bootloader在收到master code送來的dfu package時會先檢查其中的數位簽章,符合才會往下做。理論上這是不可能破解的!因為這個架構,所以secure bootloader存有public key,而在産生dfu package時就要使用private key來製作簽章。
那産生public key / private key的工具,nordic也幫大家準備好了,就是nrfutil,安裝方法:
Mac OSX:
pip3 install nrfutil --upgrade
Linux:
pip install nrfutil --upgrade
最好檢查一下版本不要太舊: (我裝的是6.1.0)
nrfutil version
産生private key的指令:
nrfutil.exe keys generate private.key
産生public key的指令:
nrfutil keys display --key pk --format code private.key --out_file public_key.c
-------------------------------------------------------------------------------
編譯secure bootloader
這個專案打開後把dfu_public_key.c檔刪除,加入之前做出來的public_key.c再進行編譯(F7)就可以做出secure bootloader的hex檔。這個是針對pca10056的開發板,也就是nrf52840 DK配合 software Device S140的情況下使用的。原廠文件中提到要先處理的uECC library,似乎此時並不需要。
那在使用nRF5281 Soc配合software device s112的話,那就打開這個專案檔:
原想52811也是用52840 DK這板子模擬開發,應該也是不用uECC library吧!結果不是,一編譯就出現找不到uECC.h的錯誤訊息。
所以依原廠文件去下載micro-ecc,並放置到
然後要先編譯micro-ecc, 但是有許多媥譯器和整合環境工具的組合,那要選那一個呢?
簡單的方法,就是回到ses去繼續編譯secure bootloader,看到新出現的錯誤會告訴您找不到那個檔案,那就知道要去編那一個了。這裡我看到要去編nrf52nf_armgcc/armgcc/xxxx.a
於是:
cd
make
不料出現錯誤訊息:
make: /usr/local/gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc: Command not found
Cannot find: '/usr/local/gcc-arm-none-eabi-7-2018-q2-update/bin/arm-none-eabi-gcc'.
Please set values in: "/media/ubuntu/usbdata/nRF5SDK_16.0.0/nRF5_SDK_16.0.0_98a08e2/components/toolchain/gcc/Makefile.posix"
according to the actual configuration of your system.
../../../../components/toolchain/gcc/Makefile.common:129: *** Cannot continue. Stop.
明顯是找不到arm-none-eabi-gcc這個程式,可其實系統是有安裝這支程式,其實就是路徑不對而已,錯誤訊息裡也說了要去/components/toolchain/gcc/Makefile.posix這個檔案更改設定。
依我自己的系統情況,把Makefile.posix檔案內容改為:
GNU_INSTALL_ROOT ?= /usr/bin/
GNU_VERSION ?= 6.3.1
GNU_PREFIX ?= arm-none-eabi
然後再重下make, 成功産生了一個micro_ecc_lib_nrf52.a檔,再回去ses編譯secure bootloader就成功了。
留言