nRF5 SDK Bootloader and DFU moudles(2)
镜像的验证
在执行设备固件更新之前,应验证新映像。 在传输实际固件(预验证)之前,可以检查某些信息(例如,兼容性)。 其他信息,例如图像的散列,应在传输(验证后)后进行验证。
Init packet
执行DFU时,必须提供包含固件映像的包(zip格式),init数据包和指示包格式的清单文件。 init数据包包含有关用于验证映像的固件映像的信息,必须对其进行签名以确保更新来自受信任的源。
init数据包的所需内容在协议缓冲文件dfu-cc.proto中定义。 在验证init数据包期间,将检查init数据包的以下字段:

验证
验证映像包括检查以验证映像是否来自可信来源,以及它是否与设备以及当前固件和硬件兼容。 如果在init数据包中设置了标志is_debug,则示例的调试版本会跳过版本验证。
这些检查在验证模块中实现。 验证按以下顺序进行:
- 签名,签名。
- 为了能够验证签名,验证代码需要与用于签署init数据包的私钥对应的公钥。
- 该密钥位于文件dfu_public_key.c中。
- 固件类型,fw_type。 可以使用NRF_DFU_APP_DOWNGRADE_PREVENTION配置启用/禁用版本检查。
- 硬件版本,hw_version。
- SoftDevice版本,sd_req。
- 固件版本,fw_version。
- 固件大小以查看更新是否合适。 双库和单库更新显示安全DFU引导加载程序的内存布局,指示将接受哪些大小。
版本号
版本号有三种类型:
- 硬件版本:硬件版本由设备决定。 在示例实现中,设备的硬件由sdk_config文件中的NRF_DFU_HW_VERSION宏指定。 对于nRF52系列,默认版本号定义为52.但是,您不应在产品中使用此默认版本号,而是使用您自己的版本编号方案。
- SoftDevice固件ID:SoftDevice固件ID存储在SoftDevice HEX文件中,并通过宏SD_FWID_GET检索。
- 固件版本:固件版本是指引导加载程序版本或应用程序版本,具体取决于传输的映像。 当前版本号存储在引导加载程序设置页面中。 可以从全局变量s_dfu_settings中检索应用程序版本(nrf_dfu_settings_t :: app_version)和引导加载程序版本(nrf_dfu_settings_t :: bootloader_version)。
note:请注意,编程引导加载程序映像时,版本号将被擦除并进行零初始化。 因此,在首次对引导加载程序进行编程之后,必须使用当前版本号生成引导加载程序设置页面。 有关详细信息,请参阅“Bootloader设置”页面和nrfutil文档。
版本的验收规则:
除非跳过版本验证,否则dfu_handle_prevalidate()函数将应用以下接受规则来确定是否接受图像:
- 硬件版本:如果init数据包中指定的硬件版本与设备的硬件匹配,则接受该映像。
- SoftDevice固件ID:如果其中一个指定的固件ID与当前SoftDevice的ID匹配,则接受该图像。 sd_req列表中的固件ID为0x00表示“更新不依赖于SoftDevice”。有关此问题的含义,请参见没有软件设备的更新部分。
- 固件版本:如果映像包含引导加载程序,则如果新固件版本大于(>)现有版本的引导加载程序,则接受映像。如果图像包含应用程序,则如果新固件版本大于或等于(> =)现有版本的应用程序,则接受该图像。如果映像包含SoftDevice并且不存在SoftDevice,则会根据现有应用程序的版本检查fw_version,以确定更新是否可以覆盖它。
Dual-bank and single-bank updates
为了安全地执行设备固件更新,新的固件映像不会被复制到内存中的最终位置,直到它被验证为止。 这可确保仅激活完整且有效的图像。 如果在传输过程中发生错误,则不会更新固件并且旧固件仍可用。
将接收到的固件存储在空闲存储器中然后在激活期间将其复制到预期存储位置的过程称为双库更新。 双库更新是更新固件的首选方法,因为在验证和激活新固件之前,将保留当前应用程序。
只有当前应用程序的末尾与应用程序数据的开头之间有足够的可用空间才能存储新的固件映像时,才能进行双库更新。 如果新固件映像大于可用空间,则必须在单个库更新中传输。 在此过程中,固件映像将覆盖现有应用程序。 如果在单库更新期间发生错误,则设备上不会保留有效的应用程序。 在这种情况下,设备在引导加载程序中保持DFU模式,并且可以重试固件更新过程。
如果设置了NRF_DFU_SINGLE_BANK_APP_UPDATES,则首选单库更新。 否则,所有固件更新都将作为双库更新执行。 但是,如果新映像(SoftDevice,SoftDevice和引导加载程序或应用程序)大于可用空间,则删除应用程序以为固件映像腾出空间,并执行单组更新。
出于安全原因,您可以在DFU配置中禁用单组更新(请参阅NRF_DFU_FORCE_DUAL_BANK_APP_UPDATES)。 但是,禁用单个存储区更新将限制可以更新到应用程序和保留的应用程序数据之间的空闲页面的大小。 此可用空间可能不足以组合更新SoftDevice和引导加载程序。
Dual-bank updates
在双库更新期间,将保留现有应用程序,直到激活新固件映像。 如果固件更新过程失败,您仍可以重新启动设备以启动现有应用程序。
SoftDevice末尾和应用程序数据开头之间的内存区域分为两个库。 Bank 0保存现有应用程序,bank 1用于存储接收到的图像。
SoftDevice和bootloader
下图显示了Bootloader和SoftDevice的组合映像的DFU过程。 如果传输的映像仅包含SoftDevice或仅包含引导加载程序,则一般过程相同,但仅替换SoftDevice或引导加载程序。

传输的图像存储在空闲存储区中。 可保留现有的申请数据; 有关更多信息,请参阅保留应用程序数据 验证后,将复制新的SoftDevice和新的引导加载程序以替换现有固件。 在此过程中会保留应用程序,但由于SoftDevice中的API更改,或者因为新的SoftDevice具有与现有软件不同的大小,因此它可能无效。
应用
在双库更新中更新应用程序时,将保留现有应用程序。

原始应用程序位于存储库0中。传送的图像存储在存储库1中。在接收到新的应用程序图像之后,旧的和新的应用程序都存在。 这可确保在无法激活新应用程序时可以回退到旧应用程序。 如果可以激活新应用程序,则将其从库1复制到库0.可以保留现有应用程序数据; 有关更多信息,请参阅保留应用程序数据
nRF5 SDK Bootloader and DFU moudles(2)的更多相关文章
- nRF5 SDK Bootloader and DFU moudles(1)
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境. 在嵌 ...
- nRF5 SDK Bootloader and DFU moudles(3)
DFU控制点特性用于控制DFU过程的状态. 通过写入该特征来请求所有DFU程序. 标记过程结束的响应将作为通知收到. BLE传输 Transfer of an init packet DFU控制器首先 ...
- nRF5 SDK for Mesh(三) Installing the mesh toolchain 安装编译工具链
Installing the mesh toolchain To build the example applications, a toolchain based on either CMake o ...
- nRF5 SDK for Mesh(二) Getting started 快速开始
Getting started To get started, take a look at the Light switch demo. It shows how a simple applicat ...
- nRF5 SDK软件架构及softdevice工作原理
本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试. 如果你刚开始接触nRF5 S ...
- Nordic nRF5 SDK和softdevice介绍
SDK和Softdevice的区别是什么?怎么选择SDK和softdevice版本?芯片,SDK和softdevice有没有版本兼容问题?怎么理解SDK目录结构?SDK帮助文档在哪里?Softdevi ...
- nRF5 SDK for Mesh(四) 源码编译
官方文档教程编译源码: http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk%2Fdita%2Fs ...
- nRF5 SDK for Mesh(一) 介绍和下载源码
一: 官网介绍地址:http://www.nordicsemi.com/Products/Bluetooth-low-energy/nRF5-SDK-for-Mesh Nordic offers a ...
- 如何调试nRF5 SDK
本文将讲述Nordic nRF5 SDK的主要调试手段,以帮助大家快速定位问题,并解决问题.一般来说,你可以通过打log方式,IDE的debug模式,SDK自带的app_error_check函数,以 ...
随机推荐
- Huffman树、霍夫曼编码
Huffman树指的是带权路径长度WPL最小的二叉树 WPL=路径*权值 Huffman常用于压缩编码,正常传输ABCDEF这些字母需要3位二进制树来描述,但由于一篇文章中ABCDEF这些字母出现的概 ...
- SP4546 ANARC08A - Tobo or not Tobo IDA*
题意:
- Could not load file or assembly "\win32_x86\dotnet1\crdb_adoplus.dll' or one of its dependencies.
Could not load file or assembly 'file:///C:\Program Files (x86)\SAP BusinessObjects\Crystal Repor ...
- Codeforces 55D. Beautiful numbers(数位DP,离散化)
Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得 ...
- 2016 ACM-ICPC NEERC F. Foreign Postcards (概率DP)
2016 ACM-ICPC NEERC F. Foreign Postcards 题意:有一串由C.W组成的字符串,每次截取长度为k(1<=k<=n且k随机)的前缀,如果该前缀首位为W,则 ...
- HA 模式 Hadoop+ZooKeeper+Hbase启动顺序
一. 背景(原http://blog.csdn.net/u011414200/article/details/50437356 ,对其进行了一定更改) 1.1 网络上的大部分教程 都是机器间含有SSH ...
- KDC添加加密
零售KDC管理的域为TESTA.COM 华为集群管理的域为hadoop.com (目前测试了hdfs cli,下午在UAT集群测试下distcp) 一. 零售KDC升级支持AES ...
- Postgres copy命令导入导出数据
最近有需要对数据进行迁移的需求,由于postgres性能的关系,单表3000W的数据量查询起来有一些慢,需要对大表进行切割,拆成若干个子表,涉及到原有数据要迁移到子表的需求.起初的想法是使用存储过程, ...
- Python中调用shell
1 简单调用shell命令 os.system(command) 在一个子shell中运行command命令, 并返回command命令执行完毕后的退出状态. 这实际上是使用C标准库函数system( ...
- sentinel控制台监控数据持久化【InfluxDB】
根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alibaba/Sentinel/ ...