RT-FOTA 基于 RTT 系统 bootloader 通用软件开源项目

我要开发同款
匿名用户2021年01月27日
44阅读
开发技术C/C++
所属分类其他开源、硬件驱动/工具
授权协议Apache-2.0

作品详情

RT-Thread官方推出了STM32系列单片机的通用bootloader,在其网站可以通过网页配置就可以生成bootloader的烧录文件,使广大嵌入式工程师不用编写一行代码,就能够轻松完成自己产品的bootloader功能。但是由于RTT官方的bootloader软件 RT-OTA 是商用性质,不公开源码,不仅仅限制了在其他平台的移植,而且也不方便加入产品的特定功能。本人软件水平有限,但是基于对开源精神的崇拜和RTT多年的感情,蒙发出利用业余时间编写一款开源的且基于RTT系统bootloader通用软件,贡献给大家。

由于RTT官方推出的bootloader名字叫RT-OTA,因此为了蹭点RTT的流量,我这个bootloader名字就叫RT-FOTA。

【RT-FOTA的需求分析】

开发基于RTOS的bootloader软件,网上很多牛人会说bootloader最好是裸机程序编写,就像u-boot一样稳定和可靠。但我个人认为目前32位单片机资源丰富,RT-Thread的稳定和可靠性不言而喻,加之RTT的组件丰富,后续功能拓展方便(比如加入网络和USB功能)。因此我使用RT-Thread的阉割版本rtt-nano实现。

兼容RTT官方的rbl文件:使用RTT官方的打包软件生成下载文件,可以实现加密压缩功能。由于个人水平问题,只能做到尽可能的兼容,比如RBL文件里面的HASH_CODE我就不知道怎么计算出来的。

移植方便:由于RT-FOTA基于RT-Thread开发,因此只要你的平台被RT-Thread支持,就可以很方便的移植到。

【RT-FOTA主要的功能】

支持RTT官方的RBL打包软件,使用方式也一致。目前支持包括CRC32、AES256、quicklz和fastlz功能;支持命令行模式(FINSH组件)和出厂固件恢复;支持FLASH分区(FAL组件);支持功能扩展(RTT组件);其他功能可自行方便扩展;软件开发目录

软件开发目录参照RTT的目录形式,如下图所示:

我原本计划添加SCONS进行编译,但目前对SCONS的使用还不熟悉,下次再实现,因此暂时使用 MDK 完成。

可以看到我并未按照RTT官方推荐的使用MDK或cube生成rtt-nano的工程,原因是我有强迫症,感觉IDE生成的目录很不爽。

软件配置说明

RT-FOTA的软件配置仍然集中在rtconfig.h中,其中一些.c文件中有一些默认的配置宏,但可以根据需求进行修改。

/*RT-Threadconfigfile*/#ifndefRT_CONFIG_H__#defineRT_CONFIG_H__#defineRT_THREAD_PRIORITY_MAX8#defineRT_TICK_PER_SECOND1000#defineRT_ALIGN_SIZE4#defineRT_NAME_MAX8/*KernelDeviceObject*/#defineRT_USING_DEVICE#defineRT_USING_CONSOLE#defineRT_CONSOLEBUF_SIZE512#defineRT_CONSOLE_DEVICE_NAME"uart1"#defineRT_VER_NUM0x30102#defineRT_USING_CPU_FFS/*RT-ThreadComponents*/#defineRT_USING_COMPONENTS_INIT#defineRT_USING_USER_MAIN#defineRT_DEBUG_INIT0#defineRT_USING_OVERFLOW_CHECK//#defineRT_USING_HOOK//#defineRT_USING_IDLE_HOOK/*SoftwaretimersConfiguration*/#defineRT_USING_TIMER_SOFT0#ifRT_USING_TIMER_SOFT==0#undefRT_USING_TIMER_SOFT#endif#defineRT_TIMER_THREAD_PRIO4#defineRT_TIMER_THREAD_STACK_SIZE512#defineRT_TIMER_TICK_PER_SECOND100/*IPC(Inter-processcommunication)Configuration*/#defineRT_USING_SEMAPHORE#defineRT_USING_MUTEX//#defineRT_USING_EVENT//#defineRT_USING_MAILBOX//#defineRT_USING_MESSAGEQUEUE/*MemoryManagementConfiguration*/#defineRT_USING_HEAP#defineRT_USING_MEMHEAP#defineRT_USING_SMALL_MEM/*FinshConfiguration*/#defineRT_USING_FINSH#defineFINSH_USING_MSH#defineFINSH_USING_MSH_ONLY#define__FINSH_THREAD_PRIORITY5#defineFINSH_THREAD_PRIORITY(RT_THREAD_PRIORITY_MAX/8*__FINSH_THREAD_PRIORITY+1)#defineFINSH_THREAD_STACK_SIZE2048#defineFINSH_USING_HISTORY#defineFINSH_HISTORY_LINES5#defineFINSH_USING_SYMTAB#defineFINSH_USING_AUTH/*可配置FINSH的authencation功能,防止随意使用FINSH*/#defineFINSH_DEFAULT_PASSWORD"radiation"#defineFINSH_PASSWORD_MIN6#defineFINSH_PASSWORD_MAX16/*DeviceDrivers*/#defineRT_USING_PIN#defineRT_USING_SERIAL//#defineRT_SERIAL_USING_DMA#defineRT_USING_RTC#defineRT_USING_SPI#defineRT_USING_SFUD#defineRT_SFUD_USING_SFDP#defineRT_SFUD_USING_FLASH_INFO_TABLE#defineRT_USING_WDT/*RTT组件配置*//*falpackage*/#definePKG_USING_FAL#defineFAL_DEBUG_CONFIG#defineFAL_DEBUG0#defineFAL_PART_HAS_TABLE_CFG#defineFAL_USING_SFUD_PORT#defineFAL_USING_NOR_FLASH_DEV_NAME"nor_flash0"#definePKG_USING_FAL_LATEST_VERSION#definePKG_FAL_VER_NUM0x99999/*Tinycryptpackage*/#defineTINY_CRYPT_AES/*Compresspackage*/#defineQLZ_COMPRESSION_LEVEL3/*HardwareDriversConfig*/#defineSOC_FAMILY_STM32#defineSOC_SERIES_STM32F4#defineSOC_STM32F407ZE/*On-chipPeripheralDrivers*/#defineBSP_USING_GPIO#defineBSP_USING_ON_CHIP_FLASH#defineBSP_USING_ONCHIP_RTC#defineBSP_USING_UART#defineBSP_USING_UART1#defineBSP_USING_SPI#defineBSP_USING_SPI1/*OnboardPeripheralDrivers*/#defineBSP_DATAFALSH_CS_PIN30/*BoardextendedmoduleDrivers*/#defineBSP_RS485_DIR_PIN52/*RT-FOTAmoduledefine*/#defineRT_FOTA_SW_VERSION"1.0.0"/*EnableYmodemOTA*/#definePKG_USING_YMODEM_OTA/*分区名字可以根据自己的需求而定*//*FOTAapplicationpartitionname*/#ifndefRT_FOTA_APP_PART_NAME#defineRT_FOTA_APP_PART_NAME"app"#endif/*FOTAdownloadpartitionname*/#ifndefRT_FOTA_FM_PART_NAME#defineRT_FOTA_FM_PART_NAME"fm_area"#endif/*FOTAdefaultpartitionname*/#ifndefRT_FOTA_DF_PART_NAME#defineRT_FOTA_DF_PART_NAME"df_area"#endif/*此两项密码必须与RTT的打包软件设置一致*//*AES256encryptionalgorithmoption*/#defineRT_FOTA_ALGO_AES_IV"0123456789ABCDEF"#defineRT_FOTA_ALGO_AES_KEY"0123456789ABCDEF0123456789ABCDEF"#endifRBL文件说明

使用过RTT官方的RT-OTA组件的朋友都知道,下载的不是bin文件,而是需要通过RTT打包软件“装饰”成rbl文件之后,才能被RT-OTA识别。

RTT的打包软件可以设置代码加密和压缩,其配置信息都存在rbl文件前96字节中:

rt-fota/>fotashowfm_area09600000000:52424C00000200005EA9A45D6170700000000010:000000000000000000000000312E302E00000020:3600000000000000000000000000000000000030:00000000312E302E360000000000000000000040:0000000000000000000000004333290A00000050:4708F6DA84BB00001C840000C43DE3B5

其具体含义如下:

typedefstruct{chartype[4];/*RBL字符头*/rt_uint16_tfota_algo;/*算法配置:表示是否加密或者使用了压缩算法*/rt_uint8_tfm_time[6];/*原始bin文件的时间戳,6位时间戳,使用了4字节,包含年月日信息*/charapp_part_name[16];/*app执行分区名*/chardownload_version[24];/*固件代码版本号*/charcurrent_version[24];/*这个域在rbl文件生成时都是一样的,我用于表示app分区当前运行固件的版本号,判断是否固件需要升级*/rt_uint32_tcode_crc;/*代码的CRC32校验值,它是的打包后的校验值,即rbl文件96字节后的数据*/rt_uint32_thash_val;/*估计这个域是指的原始代码本身的校验值,但不知道算法,无法确认,故在程序中未使用*/rt_uint32_traw_size;/*原始代码的大小*/rt_uint32_tcom_size;/*打包代码的大小*/rt_uint32_thead_crc;/*rbl文件头的CRC32校验值,即rbl文件的前96字节*/}rt_fota_part_head,*rt_fota_part_head_t;开机界面

RT-FOTA开机界面如下图:

可以看出使用了RTT的SFUD和FAL组件,同时列出了分区变信息。

RT-FOTA源码公开,你想怎么改就怎么改,不在受限制:)

最后一行是表示在5秒钟内,按下Enter键,即0x0d,就可以进入命令行模式:

由于FINSH具备authencation功能,可以设置shell密码。具体详见RTT相关文档。

命令行模式

RT-FOTA的命令行模式使用的RTT的FINSH组件,除了RTT系统自带命令外,还增加fota和ymdown命令:

**fota命令**

键入fota命令后回车即可看到帮助命令:

rt-fota/>fotaUsage:fotaprobe-probeRBLfileofpartitonfotashowpartitionaddrsize-show'size'bytesstartingat'addr'fotaclonedes_partsrc_part-clonesrcpartitiontodespartitonfotaexec-executeapplicationprogram

probe参数可以打印出当分区的RBL信息:

rt-fota/>fotaprobe[I/fota]=====RBLoffm_areapartition=====[I/fota]|Apppartitionname|app|[I/fota]|Algorithmmode|AES&&QLZ|[I/fota]|Firmwareversion|1.0.3|[I/fota]|Coderawsize|48004|[I/fota]|Codepackagesize|33824|[I/fota]|BuildTimestamp|1571072350|[I/fota]=====RBLofdf_areapartition=====[I/fota]|Apppartitionname|app|[I/fota]|Algorithmmode|AES&&QLZ|[I/fota]|Firmwareversion|1.0.3|[I/fota]|Coderawsize|48004|[I/fota]|Codepackagesize|33824|[I/fota]|BuildTimestamp|1571072350|

这里列出了fm_area和df_area分区中RBL文件的主要信息项,便于开发者查询:

Apppartitionname:指的是RTT打包文件时设置的分区名

Algorithmmode :指的是RTT打包文件使用那些算法:AES256/Quicklz/Fastlz

Firmwareversion :指的是RTT打包文件设置的固件版本号

Coderawsize :指的代码原始大小

Codepackagesize :指的代码打包后的大小

BuildTimestamp :指的代码生成的时间戳

show参数可以显示分区的具体实际数据,方便调试与检查:

rt-fota/>fotashowapp09600000000:C0080020E55702085D0402085F04020800000010:63040208670402086B0402080000000000000020:0000000000000000000000006F04020800000030:7104020800000000730402087504020800000040:FF570208FF570208FF5702084955020800000050:FF570208FF570208FF570208FF570208

这里列出了app分区0到96字节的数据

**clone参数是实现分区数据克隆**

rt-fota/>fotaclonefm_areadf_areaClonedf_areapartitiontofm_areapartition:################################################################################################################################################################################################################################################################Clonepartitionsuccess,total1048576bytes!

这里是将df_area分区数据完整的克隆岛fm_area中。

**exec参数是用于执行app分区的应用代码**

rt-fota/>fotaexec[I/fota]Implementapplicationnow.LCDID:5510

**ymdown命令**

ymdown 是基于Ymodem协议的下载命令,使用RTT的ymodem和ymodem_ota组件实现,其中将ymodem_ota.c中的 DEFAULT_DOWNLOAD_PART 设置为需要默认使用分区名,即在使用 ymdown 不带参数的情况下就下载到 DEFAULT_DOWNLOAD_PART 分区,也可加分区名作为参数指定下载位置。

rt-fota/>ymdownDefaultsavefirmwareondownloadpartition.Warning:Ymodemhasstarted!Thisoperatorwillnotrecovery.PleaseselecttheotafirmwarefileanduseYmodemtosend.CCCCCCStartingymodemtransfer.PressCtrl+Ctocancel.100%33KB6KB/s00:00:050ErrorsDownloadfirmwaretoflashsuccess.Downloadfirmwareverify........[OK]Resetsystemandapplynewfirmware.

下载完成后,会自动复位重新启动,将新固件搬运到app分区中:

_______________________|_\__||___/_\__|/\||_)|||_____||_||||||/_\|_<||_____|_|||_||||/___\|_|\_\|_||_|\___/|_/_/\_\2016-2019CopyrightbyRadiation@warfalconVersion:1.0.0buildOct182019[SFUD]FindaWinbondflashchip.Sizeis16777216bytes.[SFUD]nor_flash0flashdeviceisinitializesuccess.[I/FAL]====================FALpartitiontable====================[I/FAL]|name|flash_dev|offset|length|[I/FAL]-------------------------------------------------------------[I/FAL]|app|onchip_flash|0x00020000|0x000e0000|[I/FAL]|fm_area|nor_flash0|0x00000000|0x00100000|[I/FAL]|df_area|nor_flash0|0x00100000|0x00100000|[I/FAL]=============================================================[I/FAL]RT-ThreadFlashAbstractionLayer(V0.4.0)initializesuccess.Pleasepress[Enter]keyintoshellmodein5secs:[I/fota]Partition[app]erasestart:[I/fota]Starttocopyfirmwarefromfm_areatoapppartition:############[I/fota]Upgradesuccess,total48004bytes.[I/fota]CopyfirmwareversionSuccess![I/fota]Implementapplicationnow.LCDID:5510出厂固件恢复

恢复出厂固件的方式比较多,本人多年的工程实践经验,倾向于使用外部按键长按后进行出厂固件恢复。出厂固件存储在df_area分区中(分区名在代码中任意设置),长按按键10s后(长按时间在代码中任意设置),RT-FOTA会自动解密解压df_area分区代码,并搬运到app分区进行执行。

Defaultfirmwarekeypressed:>>>>>>>>>>[I/fota]Partition[app]erasestart:[I/fota]Starttocopyfirmwarefromdf_areatoapppartition:############[I/fota]Upgradesuccess,total48004bytes.[I/fota]Implementapplicationnow.LCDID:5510RT-FOTA移植

RT-FOTA移植很简单,只要RT-Thread源码包中有你的平台的BSP包即可:)

RT-FOTA中使用的各种组件的修改也很简单,比如FAL和SFUD就可以参照RTT官方说明,SignalLED参照源码包里的README.md即可。

RT-FOTA可以直接使用在RT-Thread的完整版搭载,只需要将*rt_fota.c*、*rt_fota.h*和*rt_fota_crc.c*放入工程中即可实现,然后用env配置相关组件即可。

编译下载

双击bootloader.uvprojx文件,打开MDK5工程,编译并下载程序到开发板。

工程默认配置使用JLINK仿真器下载程序,点击下载按钮即可下载程序到开发板

运行结果

下载程序成功之后,系统RT-FOTA会运行:

启动后LED会常亮;如果进入shell模式,LED会1Hz闪烁;如果进入upgrade模式,LED会10Hz闪烁;

连接目标板的串口1到PC,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到RT-FOTA的输出信息:

_______________________|_\__||___/_\__|/\||_)|||_____||_||||||/_\|_<||_____|_|||_||||/___\|_|\_\|_||_|\___/|_/_/\_\2016-2019CopyrightbyRadiation@warfalconVersion:1.0.0buildOct182019[SFUD]FindaWinbondflashchip.Sizeis16777216bytes.[SFUD]nor_flash0flashdeviceisinitializesuccess.[I/FAL]====================FALpartitiontable====================[I/FAL]|name|flash_dev|offset|length|[I/FAL]-------------------------------------------------------------[I/FAL]|app|onchip_flash|0x00020000|0x000e0000|[I/FAL]|fm_area|nor_flash0|0x00000000|0x00100000|[I/FAL]|df_area|nor_flash0|0x00100000|0x00100000|[I/FAL]=============================================================[I/FAL]RT-ThreadFlashAbstractionLayer(V0.4.0)initializesuccess.注意事项

RT-FOTA使用正点原子的探索者开发板,如果要运行到其他目标板,可能需要修改相关设置;

代码中使用的硬件有usart0、spi0、PE4(key0)、PF9(led0);

由于业余时间开发,文档逐步完善,但只要有一定编程基础的朋友,开代码注释即可知道如果进行相关修改;

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论