nRF51 DFU 初始化包
當升級數據包時,在應用程序映像傳輸之前,在DFU中需要初始化包來執行映像的安全檢測。這個初始化包作為升級流程的一部分提供了安全檢測機制,因此被升級的設備只能接收兼容的應用程序。
初始化包包括以下信息可用於安全檢測(參見dfu_init_packet_t)
l Device type:一個2個字節的值,可由開發者定義,以指示設備的類型,如Heart Rate Belt。
l Device revision:一個2個字節的值,用於限制一個設備只能使用一個定義的版本號進行升級。
l Application version:一個4字節的值,用來標識用於傳輸的應用程序的版本,這個值用來只允許軟件升級而不能降級。沒有示例代碼使用這個值。
l Supported SoftDevices:一個2個字節的列表標識與應用程序兼容的SoftDevices,如S110 v7.0 和 S110 v7.1。
l Checksum:2個字節的循環校驗碼,用於校驗映像。
SDK提供一個模板
dfu_init_template.c
用於執行初始化包的安全檢測。這個模板是為了增強DFU的安全性而增加的。
1 設備和版本類型
設備和版本類型在nRF51芯片的UICR(0x10001080)寄存器的用戶保留區中保存,如果這個區域用於其他目的,更新dfu_init.h中的偏移:UICR_CUSTOMER_DEVICE_INFO_OFFSET。
#defin UICR_CUSTOMER_DEVICE_INFO_OFFSET 0x0 /**< Device info offset inside the customer UICR reserved area. Customers may change this value to place the device information in a user-preferred location. */ |
在UICR中默認值為0xFFFF,這個值意味着初始化數據包中任何設備和版本信息的DFU數據都會被接收。
2 應用程序版本
DFU初始化數據包中支持檢測應用程序版本。當前的bootloader示例中沒有使用這個特性。但是,如果有必要可以實現應用程序版本檢測,並增加到dfu_init_template.c
中。
如果增加應用程序版本檢測,每一個應用程序必須使用一個版本ID進行編譯,這個版本ID必須存放在應用程序映像中一個預先定義的地方,例如在應用程序起始地址+0x0100的地方,類似於nordic SD的原理。
參見以下dfu_init_template.c中的代碼片段,它說明了DFU初始化包
如何處理一個應用程序版本的安全檢測。
// In order to support application versioning this check should be updated.
// This template allows for any application to be installed however customer could place a
// revision number at bottom of application to be verified by bootloader. This could be done at
// a relative location to this papplication for example Application start address + 0x0100.
3 SoftDevice列表
應用程序以特定的SoftDevice為目標專為某一nRF51芯片而編譯,例如S110 v7.1.0。如果API向后兼容,一些應用程序可能運行在多種SoftDevice版本上,例如,一個應用程序專為SoftDevice S110 v7.1.0而編譯,但也可以運行在SoftDevice S110 v7.0.0 上。
可以在DFU初始化包中提供一個支持應用程序的SoftDevice列表。DFU檢測該列表,看看是否與當前SoftDevice版本相對應,如果對應才繼續升級。
如果值為0xFFFE,那意味着任何應用程序都可以安裝而不管SoftDevice的版本,這個特性在開發中非常有用,但不要用在產品中。
當前SoftDevice的FWID值如下:
SoftDevice S110icS1 |
FWID |
S110 v7.0.0 |
0x004F |
S110 v7.1.0 |
0x005A |
Development/any |
0xFFFE |
4 DFU初始化包生成方法
Tan-v提供了DFU初始化包生成工具:make_dfu_initpacket.bat,生成的DFU init packet可直接用於手機APP升級,使用方法:
1. 把編譯生成的hex文件“nrf51422_xxac.hex”(官方示例默認生成的hex文件名)放到 make initpacket 文件夾路徑之下。注意:此hex文件名不可改變。
2. 點擊 make_dfu_initpacket.bat ,則生成 bin 文件:nrf51422_xxac.bin 和DFU Init packet 文件:bootloader_initpacket.dat。
3. 把 bootloader_initpacket.dat 和nrf51422_xxac.hex保存到手機中,可直接用手機 DFU APP 進行升級。
注意:生成的DFU Init packet文件默認配置是支持任何設備類型、支持任何設備版本、支持S110 V7.0.0 和S110 V7.1.0,若要更改,更改config.dat文件中對應字段。
DFU 初始化包生成工具下載鏈接:http://pan.baidu.com/s/1dDgZQMX
作者:tan-v 出處:http://www.cnblogs.com/tan-v/ 歡迎轉載或分享,但請務必聲明文章出處。