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函数,以 ...
随机推荐
- 使用PHP读取PHP文件并输出到屏幕上
看完这篇文章,你一定忘不掉htmlentities的用法 背景 今天有个需求,就是一个PHP开发的网址中,有一个页面可以提供给用户修改已经存在的PHP文件中的代码,并POST到服务器上保存. 每次将读 ...
- Unable to copy file, Access to the path is denied
Unable to copy file, Access to the path is denied http://stackoverflow.com/questions/7130136/unable- ...
- webuploader+上传文件夹
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
- php 一段 shmop
$size = 1024*1024; $shm_key = ftok(__FILE__, 't'); $shm_id = shmop_open($shm_key, "c", 064 ...
- SQLAlchemy框架
Python 的 ORM 框架 SQLAlchemy 有些同学已经听说过这个框架的大名了,也听说了 SQLAlchemy 没有 Django 的 Models 好用 我在这里官宣辟谣一下啊, Mode ...
- python合并两个字典
1.借助dict(d1.items() + d2.items())的方法 2.借助字典的update()方法,没有返回值 3.借助字典的dict(d1, **d2)方法 4.d3={**d1,**d2 ...
- ubuntu下最好用的防火墙shadaarp ,带主动防御
shada-arpfirewall-1.0alpha3.i386.rpm 所有基于rpm的x86 Linux(内核版本>=2.6.27) Mar 11 82.9 KB sha ...
- Access denied for user 'root'@'localhost'问题的解决
mysql> grant all privileges on *.* to root@'localhost' identified by '密码'; mysql> flush privil ...
- 图及其衍生算法(Graphs and graph algorithms)
1. 图的相关概念 树是一种特殊的图,相比树,图更能用来表示现实世界中的的实体,如路线图,网络节点图,课程体系图等,一旦能用图来描述实体,能模拟和解决一些非常复杂的任务.图的相关概念和词汇如下: 顶点 ...
- 查一张表占多少空间Bytes
SELECT SUM(BYTES)/1024/1024||'MB' 占用空间 FROM dba_segments WHERE segment_name = '表名' AND owner = '用户名' ...