Nordic--nrf52832--DFU(二)Sercure DFU bootloader

 安全DFU是nRF5 SDK v12提供的新DFU引導加載程序。SDKv11及更早版本中的舊引導加載程序現在稱爲Legacy DFU。安全DFU不與Legacy DFU向後兼容。


  • 準備工作
    1. 最新的nRF5 SDK(最低SDK v12)
    2. 安裝了pip的Python。如果你沒有Python的pip,請看這裏。
    3. 爲ARM安裝版本4.9-2015-q3-update GCC編譯器工具鏈。
    4. Make也是必需的(使用MinGW,GNU Make或Xcode)Make也是必需的(使用MinGW,GNU Make或Xcode)
    5. nRF5x DK或您自己的nRF5x板nRF5x DK或您自己的nRF5x板
    6. 帶有BLE或PC的手機,帶有額外的nRF5x DK或Dongle。帶有BLE或PC的手機,帶有額外的nRF5x DK或Dongle。

步驟A.生成密鑰

我們需要一對公鑰和私鑰來加密簽名,以使用ECDSA_P256_SHA256對DFU映像進行簽名。

Nordic提供nRFutil工具來生成這些密鑰。nRFutil.exe可以在這裏從github下載。

或者從python使用獲得pip install nrfutil。需要檢查更新:pip install nrfutil --upgrade

A1.生成您自己的私鑰
輸入以下命令行:

nrfutil.exe keys generate private.key

將生成private.key文件。

A2.根據您的私鑰生成您的公鑰

nrfutil keys display --key pk --format code private.key --out_file public_key.c

獲得public_key.c文件後,我們可以轉到下一步,構建引導加載程序。

步驟B.構建引導加載程序引導加載程序位於\ examples \ dfu \ bootloader_secure_ble

請注意,有兩種方式。有一個_debug週期。如果你想避免版本檢查,你可以使用這個_debug版本,我們稍後會介紹它。現在,我們將使用普通的bootloader

B1. 編譯uECC庫。

引導加載程序需要uECC庫來解密簽名。uECC是一個外部庫,必須從github下載。注意:附帶許可證要求。

您必須將庫克隆/下載到SDK文件夾:SDKFolder\external\micro-ecc\micro-ecc。它應該如下所示:
在這裏插入圖片描述

下一步,在內部SDKFolder\external\micro-ecc\選擇要用於構建引導加載程序的IDE和編譯器。在我的情況下,我選擇SDKFolder\external\micro-ecc\nrf52_keil\armgcc並輸入make以開始構建uECC。
在這裏插入圖片描述

B2. 將步驟A2中生成的public_key.c文件複製到您的引導加載程序文件夾或您選擇的文件夾中,並將其包含在項目中。刪除dfu_public_key.c項目中的虛擬對象,因爲它已被public_key.c替換

現在您已準備好構建引導加載程序。

B3. 構建引導加載程序。單擊構建。如果您已正確完成步驟B1,B2,則應成功構建引導加載程序。

請注意,每次生成一對新的公鑰和私鑰時,都需要更新public_key.c文件並重建引導加載程序。

步驟C.生成DFU .zip包

DFU主機需要DFU .zip數據包才能將新映像文件發送到DFU目標。.zip文件包含我們要更新的映像 hex文件,初始化數據和數據包的簽名。在本教程的主要部分中,我們只進行應用程序映像更新。有關引導加載程序和軟件設備更新,請參閱附錄。

C1. 準備應用程序hex文件。構建應用程序並在_build文件夾中找到.hex文件。通常它是nrf52832_xxaa.hex在編譯SDK的示例時命名的。將應用程序十六進制閃存,並在沒有引導加載程序的情況下驗證它是否正常工作

C2. 生成.zip文件。將步驟A1中生成的private.key複製到與.hex應用程序文件相同的文件夾中。

在我的情況下,我使用此腳本生成.zip文件:

nrfutil pkg generate --hw-version 52 --application-version 1 --application nrf52832_xxaa.hex --sd-req 0x98 --key-file private.key app_dfu_package.zip

說明:

  1. –hw-version:默認情況下,這應該與你的芯片匹配。如果使用nRF51芯片,則應使用“51”。如果您想擁有自己的hw-version代碼,可以使用在引導加載程序中定義#define NRF_DFU_HW_VERSION your_hw_number

  2. –application-version:默認情況下,應用程序版本的起始編號爲0.要能夠更新新應用程序,應用程序版本應等於或大於引導加載程序存儲的版本。這個案子我用的1。詳細瞭解版本規則。

  3. –sd-req:在我的情況下,我的應用程序使用Softdevice S132 v4.0.2運行。此軟設備版本的代碼編號爲0x98。您可以通過鍵入找到軟設備代碼編號nrfutil pkg generate --help。如果它還沒有在列表中,您可以使用nRFGo Studio找到代碼,只需打開包含軟設備的任何板。

  4. –application:告訴nrfutil您要更新應用程序,提供應用程序映像。

步驟D.測試DFU

現在你已經準備好了DFU .zip文件和bootloader,是時候實際做DFU了。

D1. Flash引導程序和軟件設備。使用nRFGo Studio或nrfjprog或IDE首先刷新軟設備,然後使用bootloder。驗證引導加載程序是否以“DFUTarg”開始廣播。
在這裏插入圖片描述

D2. 將剛剛在C2中生成的DFU .zip文件複製到手機或您選擇的PC上的文件夾中。

D3. 使用手機或PC上的nRFConnect / nRFToolbox應用程序使用您複製的.zip文件連接和OTA DFU。

D4. 在DFU進程達到100%後驗證新應用程序是否運行,例如它使用您在應用程序中設置的名稱開始廣播。如果你能看到,祝賀你已經完成了第一個Secure OTA DFU!

步驟E.更新新的應用程序固件(可選)

E1. 生成新固件,例如修改廣告設備名稱或LED指示。

E2. 生成新的DFU .zip包。更新新的應用程序版本(至少等於或高於原始版本)

E3. 將設備切換到DFU模式,執行DFU更新並驗證新映像是否正在運

附錄1.高級功能

1.組合應用程序,引導加載程序,引導加載程序設置和軟件設備映像

引導加載程序使用其引導加載程序設置來檢測芯片上是否有閃存的有效應用程序。啓動時將執行CRC校驗。如果我們只是使用編程器使用引導加載程序刷新應用程序,則引導加載程序將無法檢測到有效應用程序已經閃存並且它將進入DFU模式,您的應用程序將無法啓動。

只有在成功完成DFU更新後,引導加載程序纔會寫入引導加載程序設置以標記有效的應用程序。但是在生產中,例如,您可能不希望通過爲成千上萬的設備執行OTA DFU來安裝應用程序,這需要花費大量時間。我們可以手動生成引導加載程序設置並將其與引導加載程序合併,以欺騙引導加載程序接受預先刷新的應用程序。我們可以使用nrfutil生成引導加載程序設置,並使用mergehex.exe工具合併hex文件。如果您不想合併,可以先刷新設置然後刷新引導加載程序。

生成引導加載程序設置的腳本是

nrfutil settings generate --family NRF52 --application yourApplication.hex --application-version 0 --bootloader-version 0 --bl-settings-version 1 bootloader_setting.hex

執行此命令後,將生成bootloader_setting.hex。它包括與您提供的yourApplication.hex匹配的應用程序版本和CRC。這應該用於覆蓋引導加載程序中的默認引導加載程序設置。

–bl-settings-version:對於SDK12和SDK13,我們只有相同的bootloader設置版本= 1

–application-version和–bootloader-version:您選擇的應用程序和引導加載程序的初始版本。在這種情況下,我選擇了0。

–family:設備系列,與您的芯片匹配。如果您有nRF52840,則必須使用NRF52840而不是NRF52。

之後,您可以使用merhex將bootloader與bootloader_setting.hex合併,如果需要,還可以使用應用程序和軟件設備。

用法:

mergehex --merge hexfile1.hex hexfile2.hex --output output.hex

注意:如果您的應用程序需要編寫UICR,最好使用此合併通過編程器而不是OTA編寫應用程序。當您執行OTA DFU時,引導加載程序將不會寫入UICR。

在我們有合併的十六進制之後,我們可以使用一個單一的十六進制來刷新多個設備,而不必使用OTA DFU來刷新應用程序。

2.無按鈕DFU

進入DFU引導加載程序模式的最簡單方法是按住Bootloader按鈕(DK上的按鈕4)並重置設備。但是您的設備可能沒有任何按鈕,或者您只是想在沒有任何物理接觸的情況下將應用程序切換到引導加載程序。如果是這種情況,您需要無按鈕DFU,只需告訴應用程序通過BLE數據包切換到引導加載程序。

我們在此文件夾中提供DFU Buttonless示例\examples\ble_peripheral\experimental_ble_app_buttonless_dfu

您可以按照鏈接瞭解如何測試它。在這裏,我們試着解釋它是如何工作的。無恥的例子與正常的應用程序沒有什麼不同。您仍然需要刷新引導加載程序。在我們開始使用無按鈕示例之前,確保引導加載程序在正常應用程序中正常工作非常重要。

它的工作方式非常簡單,切換時,我們向保留寄存器GPREGRET寫入一個標誌(BOOTLOADER_DFU_START = 0xB1),然後我們進行軟復位。這是在ble_dfu.c文件中的bootloader_start()中完成的。

由於保留寄存器在復位後保持其值,因此引導加載程序將在復位後啓動時檢查該值,然後可以進入DFU模式而不是啓動正常應用程序。這與我們按住Bootloader按鈕並觸發重置時相同。

請注意,在SDK v12上,我們寫入引導加載程序設置,而不是寫入GPREGRET寄存器。我認爲寫GPREGRET是一種更清潔的方式。

接下來我們發現調用bootloader_start()的時間。

從SDK v13我們引入了DFU無按鈕特性。該特徵具有指示和寫入屬性。我們需要做的只是在特性上啓用指示並向其寫入0x01。無按鈕設備將發送指示並等待來自DFU主機的確認。當來自中央的確認到來時,它將調用bootloader_start()(檢查ble_dfu.c中的on_hvc()函數)。之後連接將被刪除。

在撰寫此博客時,experimental_ble_app_buttonless_dfu不會進行任何綁定轉發。因此,如果手機和設備之間存在綁定,則可能會遇到問題。請看第4節。債券轉發如下。

有一個從Gaute一個偉大的GitHub的教程在這裏,您可以按照測試釦子DFU。

3.更新softdevice和bootloader

可以更新軟件設備,引導加載程序和應用程序,我們也支持更新這3個圖像的組合。但是,並非所有組合都是可能的。

下表總結了對不同組合的支持(來自這裏的nrfutil文檔)。

Combination Supported Note
Bootloader Yes
SoftDevice Yes SoftDevice must be of the same Major Version
APP Yes
Bootloader + SoftDevice Yes
Bootloader + APP No Create two.zip packages instead
Bootloader + SoftDevice + APP Yes
SoftDevice + APP Yes SoftDvice must be of the same Major Version

以下代碼將生成軟設備+應用程序組合:

nrfutil pkg generate --hw-version 52 --application-version 1 --application application.hex --sd-req 0x98 --softdevice softdevice.hex --key-file private.key app_dfu_package_softdevice.zip

4.使用無按鈕DFU進行綁定轉發

在您進入此步驟之前,請確保您已按照附錄2中的說明操作了無Button DFU無粘合。此部分基於撰寫本文時的最新SDK,即SDK v15.2。在這裏查看信息中心的指南。

您需要修改的是:

  • 在bootloader中的sdk_config.h中:

    • 將NRF_DFU_BLE_REQUIRES_BONDS更改爲1
    • 將NRF_SDH_BLE_SERVICE_CHANGED更改爲1
  • 在ble_app_buttonless_dfu中的sdk_config.h中

    • 將NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS更改爲1
    • 檢查 NRF_SDH_BLE_SERVICE_CHANGED是否不爲1,然後將其設置爲1

編譯這兩個項目。

爲剛剛生成的ble_app_buttonless-dfu 生成引導加載程序設置頁面。nRF52832的語法應該是:

nrfutil.exe settings generate --family NRF52 --application my_buttonless_app.hex --application-version 1 --bootloader-version 1 --bl-settings-version 1 setting.hex

我們需要生成引導加載程序設置的原因是,當您在引導加載程序上啓用綁定時,引導加載程序將無法在沒有任何綁定的情況下工作。因此,當您第一次啓動時,如果沒有綁定信息,引導程序將無法啓動,您無法使用DFU按鈕減少應用程序。所以我們需要創建一個bootloader設置,這樣我們就可以合併bootloader + bootloader設置+應用程序,並通過SWD一次性閃存。

下一步是合併它們:

mergehex -m bootloader.hex setting.hex -o bootloader_and_setting.hex

mergehex -m nrf52832_xxaa.hex bootloader_and_setting.hex -o app_bootloader_and_setting.hex

之後,您可以刷新app_bootloader_and_setting.hex(在刷新軟設備之後)。該設備應該以Nordic_Buttonless開始並宣傳。然後,您可以使用nRF Connect應用程序進行測試。觀察啓用指示時應用程序自動綁定,然後啓動DFU時,切換到引導加載程序時切換到引導加載程序模式而不更改地址(+1地址)。然後在綁定連接狀態時看到DFU進程正在完成。

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