最近研究到匠芯创这个超高性价比的平台,作为HMI的优秀解决方案,尤其是D12X系列,10块钱的价格,400M主频,720P/60帧的jpg解码能力,来取代F1C100简直是不二首选!而且官方提供的Luban-Lite SDK给出了一整套rtthread RTOS解决方案(配置、编译、打包、文件系统),也是我目前看到的比较完整的rtthread实践,用这个平台来学习rtthread或者开发项目还是非常不错的。
但美中不足的是官方提供的系统升级方案实在太慢了,即使是一个几百K的固件,也动辄一两分钟,而且经常失败,大大影响了调试效率。因此自己花了几天时间,摸索了一套高效的OTA升级方案,并做了专用下载工具,分享给大家,希望能够对热爱技术的人有所帮助。
首先说一下整体的设计思路:
该方案核心是利用A/B系统和Ymodem文件传输(具体参考: https://aicdoc.artinchip.com/topics/sdk/application-ota-luban-lite.html ),即采用两个os分区,通过环境变量来选择当前要加载的分区,每进行一次OTA升级,所加载的分区就切换一次。
接下来是具体操作方法:
1、修改bootloader配置,使支持env(否则不会进行A/B系统的失败和切换),并且使能A/B系统:
2、修改应用程序配置,使支持env
3、修改应用程序配置,使支持ota功能
4、修改应用程序配置,使支持ota_downloader功能,并支持Ymodem ota:
5、最最重要的,是修改ymodem_ota.c文件,使满足上位机的协议机制。
源码参考:https://gitee.com/keqian/Aic_d12x.git
6、最后修改分区配置文件image_cfg.json,增加os_r分区,如下图(为了节省空间,考虑到使用性,rodata仍采用单分区):
所有都修改完成后,开始编译固件,首先编译bootloader代码(会将编好的固件自动拷贝到target对应的pack文件夹下),然后再编译app程序,注意编译前先加载对应配置。
编译完成没有问题后,第一次先用官方工具完整升级一遍(可以不升级rodata和data):
升级完成后,就可以用我分享的工具来继续升级啦 (路径:https://gitee.com/keqian/Aic_d12x/tree/master/tools/ymodem_iap):
可以看到,选择1.5M波特率,升级340K的固件,全部只需要6s左右 ,是不是可以大大的节省生命了?
今天的分享就到这里了!
离线
串口3M我开不起来啊,1M都开不起来
离线
用ota升级115200波特率也比原来的3M快
离线
测试了,效果不错,官方下载差不多一分钟,真是要命的设计
离线
串口3M我开不起来啊,1M都开不起来
要用CH340、343这类才支持3M波特率。
如果用FLASH的话,差不多的大小升级要20多秒。但也比哪个烧录工具快很多。
离线
你好,我根据你的贴纸修改了配置。
1、打开bootload 配置的aic-env,使能A/B
2、打开应用配置的aic-env,使能A/B,使能aic-OTA,使能ota-downloader,使能ymodem OTA
3、修改ymodem_ota.c
4、修改json配置
编译会出现升级超时,发送ymoden os命令后只会回复两个C就出现升级超时。
[E] rtt_spinor_load_env_simple()318 Not found dev_current:1
[E] fw_env_open()1067 Warning: Bad CRC, using default environment
[E] rtt_spinor_load_env_simple()318 Not found dev_current:0
[E] rtt_spinor_load_env_simple()318 Not found dev_current:1
[E] fw_env_open()1067 Warning: Bad CRC, using default environment
Mount APP in blk blk_rodata
Failed to mount elm
[E] rtt_spinor_load_env_simple()318 Not found dev_current:0
[E] rtt_spinor_load_env_simple()318 Not found dev_current:1
[E] fw_env_open()1067 Warning: Bad CRC, using default environment
Mount APP in blk blk_data
Failed to mount elm
这是输出的log。
请教一下是不是因为我使能了SPI_ENC加密功能,和编译的img包都是经过加密的影响,导致fw_env_open无法正确读取flash的数据?
加密后的文件如下
d12x_os.itb.enc
rodata.fatfs.enc
ota-subimgs.cfg打包出来的cpio文件升级工具也不认。
请问该如何解决呢?官方升级的工具太慢了
离线
这么好的芯片,竟然没有个usb,或者以太网
离线