Firmware固件的打包、设计、实现与使用
基于rtthread的OTA功能实现
文章结构:
- 摘要
- BootLoader的设计与实现
- App的设计与实现
- Firmware固件的打包、设计、实现与使用
第三章 Firmware固件的打包、设计、实现与使用
文章目录
- 基于rtthread的OTA功能实现
- 第三章 Firmware固件的打包、设计、实现与使用
- 前言
- 关键步骤
- RBL打包器原理
- 打包验证
- 上传验证
- 打包器的设计
前言
在《App的设计与实现》一章中,编译器编译出来的应用程序rtthread.bin 属于原始固件,并不能用于 RT-Thread OTA的升级固件,需要用户使用 OTA 固件打包器 打包生成 .rbl 后缀名的固件,然后才能进行 OTA 升级。
关键步骤
可以根据需要,选择是否对固件进行加密和压缩,提供多种压缩算法和加密算法支持 ,基本操作步骤如下:
- 选择待打包的固件
- 选择生成固件的位置
- 选择压缩算法
- 选择加密算法
- 配置加密密钥(不加密则留空)
- 配置加密 IV (不加密则留空)
- 填写固件分区名
- 填写固件版本
- 开始打包
- OTA 升级
重要:
- 加密密钥和 加密 IV 必须与 BootLoader 程序中的一致,否则无法正确加密固件
- 固件打包过程中有 固件分区名 的填写,这里注意需要填入 Flash 分区表中对应分区的名称,不能有误
(本文中应用程序区名称为 app)
RBL打包器原理
打包软件可以设置代码加密和压缩,其配置信息都存在rbl文件前96字节中:
rt-fota />fota show fm_area 0 96
00000000: 52 42 4C 00 00 02 00 00 5E A9 A4 5D 61 70 70 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 31 2E 30 2E
00000020: 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000030: 00 00 00 00 31 2E 30 2E 36 00 00 00 00 00 00 00
00000040: 00 00 00 00 00 00 00 00 00 00 00 00 43 33 29 0A
00000050: 47 08 F6 DA 84 BB 00 00 1C 84 00 00 C4 3D E3 B5
typedef struct {char type[4]; /* RBL字符头 */ rt_uint16_t fota_algo; /* 算法配置: 表示是否加密或者使用了压缩算法 */rt_uint8_t fm_time[6]; /* 原始bin文件的时间戳, 6位时间戳, 使用了4字节, 包含年月日信息 */char app_part_name[16]; /* app执行分区名 */char download_version[24]; /* 固件代码版本号 */char current_version[24]; /* 这个域在rbl文件生成时都是一样的,用于表示app分区当前运行固件的版本号,判断是否固件需要升级 */rt_uint32_t code_crc; /* 代码的CRC32校验值,它是的打包后的校验值,即rbl文件96字节后的数据 */rt_uint32_t hash_val; /* 估计这个域是指的原始代码本身的校验值 */rt_uint32_t raw_size; /* 原始代码的大小 */rt_uint32_t com_size; /* 打包代码的大小 */rt_uint32_t head_crc; /* rbl文件头的CRC32校验值,即rbl文件的前96字节 */} rt_fota_part_head, *rt_fota_part_head_t;
打包验证
将《App的设计与实现》一章中生成的app应用程序文件rtthread.bin文件进行打包,打包信息图如图所示,为了方便验证我们将app1.0.1不加密,app1.0.2进行压缩解密(压缩算法:fastlz,加密算法AES256,加密秘钥和加密IV如图所示)
提示: 当使用打包器对app应用程序进行打包时,加密秘钥必须和设计BootLoader的密钥和key值相对应。
图示即为《BootLoader的设计与实现》一章中设定的加密密钥和key值,其值定义在rtconfig.h文件中。
上传验证
- 系统启动后BootLoader界面及打印信息,敲入回车按键,暂停BootLoader自启。
- 在终端中输入“ymodem_ota”命令,执行固件升级程序。
- 下载完毕后,系统重启,重新进入BootLoader进行固件程序引导。
可以看到BootLoader首先对app分区进行了擦除动作,然后释放新的固件程序到app分区,最后完成程序的跳转动作。当前的固件版本信息为1.0.1。
- 在终端中输入“reboot”命令,系统重启,重新进入BootLoader,敲入回车按键,暂停BootLoader自启,这里我们验证固件的恢复出厂设置功能和更新功能。
- 在终端中输入“qboot clone download fa
- 在终端中输入“ymodem_ota”命令,执行固件升级程序。将app1.0.2版本的固件更新到系统中。
- 系统启动后会打印固件app1.0.2的版本信息。
- 重新回到BootLoader界面下,在终端中输入“qboot probe”命令,打印当前系统app分区和factory分区所存储的固件信息。
说明:如图所示,当前app分区中存储的固件版本为1.0.2,使用了AES加密和fastlz压缩算法,factory分区中存储的固件版本为1.0.1,未使用加密和压缩算法。固件的CRC校验值和大小分别和打包器打包后的数值一一对应。
- 总结:至此,全流程的OTA固件升级动作已经全部完成,如果需要恢复出厂固件,可以使用“qboot clone factory download”命令,将factory分区固件复制到“download”分区,这样系统重启后就会自动将固件版本更新到1.0.1版本。
打包器的设计
在RT-Thread社区提供的打包工具rt_ota_packaging_tool.exe涉及到了fnv1a_r加密HASH算法的设定,因此是闭源的。基于对开源精神的崇拜和RT-Thread多年的感情,本人仿制一套新的打包工具,其在功能设定上与rt_ota_packaging_tool一致,现将其开放出来供大家学习借鉴(源码已上传至个人github:https://github.com/refugeer/rt_thread_ota)。
打包工具采用c#语言实现,基于Visual Studio 2019 开发。其关于hash的部分的关键算法如下:
public class fnv1a{public const uint FNV_SEED = 2166136261u;public static uint fnv1a_r(byte oneByte, uint hash){return (oneByte ^ hash) * 16777619;}public static uint calc(byte[] data, uint hash){for (int i = 0; i < data.Length; i++){hash = fnv1a_r(data[i], hash);}return hash;}
说明: 压缩部分调用fastlz.dll和quicklz150_32_3.dll实现,这里不在一一赘述,如需更多详情请下载C#源码了解。
警告: 加密算法涉及到商业产品应用的核心流程,仅作为个人学习研究和非商业用途,请务必传播和用于不正当竞争环节,因此造成的商业纠纷由个人承担,本人概不负责。
Firmware固件的打包、设计、实现与使用相关推荐
- 【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件
[SA8295P 源码分析]44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1.提取 NON-HLOS.bin 中的 Wifi Firmware 出来 2.把提取 ...
- a10 linux 烧写,全志 A10 A20 A31 A13固件配置,打包,烧写指南.pdf
全志 A10 A20 A31 A13固件配置,打包,烧写指南 SPR 用户手册 SPR 用户手册 Vers Data Author Change Description ion V1.00 2011- ...
- hikvision firmware/固件 upgrade WI for IP camera
hikvision firmware/固件 upgrade WI for IP camera Firmware download page: http://www1.hikvision.com/cn/ ...
- Firmware固件提取及分析技术
概念 固件(firmware)是一种写入硬件设备的软件,作用是对应用和各项系统功能实时控制.固件中包含底层代码,这些代码能实现软件对硬件的操作.运行固件的设备称为嵌入式系统,嵌入式系统的硬件资源在存储 ...
- 模块开发卷宗是什么_详论单片机固件模块化架构设计(精华)
[导读] 为什么写本文?做公号两月,遇到一些初学单片机的同学,刚刚入手做单片机开发,还没有涉及到使用RTOS,且刚入手直接上RTOS可能会有些难度,有的使用的相对较老单片机资源还有限,也不适合跑RTO ...
- gradle多版本打包设计
一. 打包简介 android的打包系列有:ant打包(eclipse),gradle打包(Android-studio)和python打包(美团打包方式)等.这里主要介绍gradle打包,通过设置b ...
- firmware linux 解包_官改固件解包打包 - 斐讯无线路由器以及其它斐迅网络设备 - 恩山无线论坛 - Powered by Discuz!...
本帖最后由 eaglepeng 于 2020-3-11 15:23 编辑 前段时间想重新修改下官改固件logo,找到了一份Linux下简单的解包打包工具,后来在逛帖子看到另一个工具.现总结如下,需要的 ...
- 固件firmware和驱动driver
目录 驱动driver 固件firmware firmware 出现的背景 为什么还需要驱动 什么是 firmware 固件的存储介质/载体 如何将固件写入到硬件 固件升级 其他 区别与联系 参考 驱 ...
- [ROC-RK3568-PC] 手把手教你编译Linux_SDK并打包Buildroot系统固件
✏️ROC-RK3568-PC入门篇连载进程: ✅ [ROC-RK3568-PC] 手把手教你把出厂的Android系统烧写为Ubuntu系统 ✅ [ROC-RK3568-PC] 手把手教你制作Ubu ...
最新文章
- 56.阶乘因式分解(一)
- 多元统计第二章证明题_2020年中南大学应用统计硕士考研成功经验分享
- 几种常见光端机的作用介绍
- mobile cpu上禁用alpha test的相关总结
- CSS 小结笔记之滑动门技术
- 移动混合应用HTML5数据查询优化
- ora optimizer
- Smoothy将于4月22日-27日在BSCPad等4个平台进行IDO
- 《C++程序设计POJ》《WEEK3 类和对象进阶》成员对象和封闭类/友元/this指针/常量成员函数...
- 基于springboot的民办职业学校缴费系统
- Linux命令之last
- Android自定义View之滑杆内部带数字的SeekBar
- xxx was compiled with optimization - stepping may behave oddly; variables may not be available.
- 计算机公开课课前互动小游戏,幼儿园10个师幼互动小游戏 让你的课堂马上活跃嗨起来!...
- Oracle SQL开发考试试题
- ROG 幻16无线网卡驱动无法更新
- 进入路由器linux系统时间长,如何用linux做路由器限速
- zookeeper开源客户端Curator介绍(六)
- quest3d通道英汉对照部分
- 从零学习Jenkins部署SpringBoot项目