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函数,以 ...
随机推荐
- python-platform模块:平台相关属性
import platform x=platform.machine() #返回平台架构 #AMD64 x=platform.node() #网络名称(主机名) #DESKTOP-KIK668C x= ...
- no suitable method found to override
no suitable method found to override http://bbs.csdn.net/topics/200001058
- http method
get: 获取资源get方法用来请求访问已被URL识别的资源 post: 传输实体主体POST方法用来传输实体的主体 put: 传输文件PUT方法用来传输文件. head: 获取报文首部head方法与 ...
- linux系统编程--文件IO
系统调用 什么是系统调用: 由操作系统实现并提供给外部应用程序的编程接口.(Application Programming Interface,API).是应用程序同系统之间数据交互的桥梁. C标准函 ...
- 【HTTP】无状态无连接的含义
无连接:服务器处理完客户的请求,并收到客户的应答后,即断开连接. 早期这么做的原因是HTTP协议产生于互联网,因此服务器需要处理同时面向全世界数十万.上百万客户端的网页访问,但每个客户端(即浏览器)与 ...
- Codevs 1169 传纸条 2008年NOIP全国联赛提高组
1169 传纸条 2008年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小渊和小轩是好朋友也是同班 ...
- Hbuilder快速代码技巧和常用快捷键
1.在body内输入div.abc按下tab键 效果:<divclass="abc"></div> 2.在body内输入div#abc按下tab键 效果:& ...
- c 判断一个字符是否为空格
#include <stdio.h> #include <wctype.h> int main () { wchar_t c; ; wchar_t str[] = L" ...
- php shmop windows 信号量锁
if (!function_exists('sem_get')) { function sem_get($key) { return fopen(__FILE__ . '.sem.' . $key, ...
- 如何优雅地防止MLE(for linux)
赛前最后一天模拟赛又有小伙伴MLE了--这里就讲一下如何较为精确地获取程序运行时间和空间. 资源统计当然是操作系统统计的最精确.所以可以这样写(noilinux实测通过,windows下应该不行): ...