DFU(有线)固件升级¶
ZDK 适配了多种 DFU(Device Firmware Upgrate)功能,以应对不同的场景,客户可以根据自己产品选择或者优化合适的 dfu 功能。从代码实现的角度分为 dfu In BootLoader 和 dfu in app,从升级的物理媒介可分为 usb,uart,spi。本文会从代码实现位置和物理媒介2个角度,阐述开发流程和指南。
1 DFU In BootLoader¶
dfu in BootLoader 意味着 dfu 实现的流程基本完全在 BootLoader。相比于升级流程实现在 app 中,此方案的兼容性和稳定性最高,一般不会随着版本升级或者交叉升级出现兼容性的错误。此方法是比较推荐的方法。
BootLoader 相关知识请参考 BootLoader 开发指南,BootLoader 开发指南详细解释了 flash 的划分,image 签名等技术。
1.1 通用开发流程¶
当我们用 ZephyrAppLauncher-v1.5.0.exe
编译某个工程的时候,会自动链接一个 bootloader image 文件,例如 mcuboot_pan108xxb1.bin
,该文件目录位于 modules\hal\panchip\panplat\pan1080\bootloader\images
下。但是 BootLoader image 支持 dfu 可能会和 app 有一定的关系,一般都是支持不全的,例如没有默认的程序能够直接使用 uart 升级功能,之所以这样做因为进入串口升级的条件,以及串口号都是不能固定死,所以默认不支持。用户如果要支持串口 dfu 请手动编译 BootLoader。
1.1.1 编译流程¶
打开ZephyrAppLauncher-v1.5.0.exe
,选择 boot 工程,详情见下图
注意:
board 一定要选择和你的应用一样,这样编译完成后会自动替换 modules\hal\panchip\panplat\pan1080\bootloader\images
下的 boot 文件
1.1.2 开发流程¶
开发流程主要修改 BootLoader 的源码,前面章节已经说明了为什么需要手动编译来支持特定dfu功能,也说明了如何编译的 BootLoader。这一章节主要解释一下在编译之前,如何修改源码来支持 dfu。因为不同的 dfu 修改的不一样,但是基本思路都是修改 prj 的宏来支持的。
1.2 Xmodem 串口 DFU 升级¶
BootLoader 内嵌了基于Xmodem 协议的串口升级功能, 支持 128与 1024 传输。Xmodem 是一个串口的文件传输的协议,典型的串口工具都支持,例如:secure CRT 等,SDK 提供了 ECOMV280
串口工具,目录在 05_TOOLS\串口通信工具
。
1.2.1 进入串口 OTA 模式¶
串口升级的功能默认是关闭的,因为考虑实际的场景的复杂性和不确定性,所有需要用户自己手动编译BootLoader。
在prj.conf 使能 CONFIG_MCUBOOT_PAN_SERIAL=y
,打开了串口 OTA 的功能。
串口升级默认使用 uart0{p00,p01},波特率是961200,进入OTA模式需要让 P01 保持低电平上电或者复位,。进入 OTA 模式过后串口会不断发出下面HEX尝试建立Xmodem 连接。
43 43 15 15 18 18 18 43 43 15 15 18 18 18
进入BootLoader uart DFU 后,P01 连接的串口RX,之所以这样做,是因为P01 同时扮演了串口RX 和 模式检测的功能。
1.2.3 用户修改模式检测和串口引脚¶
模式检测搜索在main.c 搜索 CONFIG_MCUBOOT_PAN_SERIAL
,修改下面的逻辑
if defined(CONFIG_MCUBOOT_PAN_SERIAL)
GPIO_EnablePullupPath(P0, BIT1);
GPIO_SetMode(P0, BIT1, GPIO_MODE_INPUT);
bool uart_bootload_flag = 0;
for (uint8_t i = 0; i < 100; i++) {
if (P01 == true) {
uart_bootload_flag = 0;
break;
}
uart_bootload_flag = 1;
}
if (uart_bootload_flag == 1) { /*trigger uart bootloader procedure */
串口引脚修改,请修改xmodem.c 中串口相关的初始化。
1.3 USB 私有 DFU升级¶
mcuboot中usb私有dfu升级基于协议panchip_usb_protocol
,配合工具量产烧录工具\Panchip DFU Tool
(操作方式参考工具内帮助文档)
可以实现应用区写入flag0x5a @0xf000(mcutoot固件最后一页) reboot后跳转停留于mcuboot
并通过usb进行直接升级(通过USB把数据直接搬运到指定程序运行区域),升级结束后跳转应用层进行flag擦除,主要用于键鼠方案
1.3.1 特殊mcuboot固件¶
支持mcuboot内 usb dfu升级 为键鼠预留了简易编译宏,应用层prj.conf
选择CONFIG_MCUBOOT_IMAGE_TYPE=1
或者CONFIG_MCUBOOT_IMAGE_TYPE=2
rebuild编译时可以直接链接01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images
内的特殊mcuboot固件
bootdfu_for_mouse
bootdfu_for_keyboard
分别对应
CONFIG_MCUBOOT_IMAGE_TYPE=1
:支持xxa1编译所有鼠标工程及键盘dongle工程,支持boot内usb升级,支持boot内4k dongle或者8k鼠标的spi透传升级
CONFIG_MCUBOOT_IMAGE_TYPE=2
:支持xxb1编译的keyboard工程,支持boot内usb升级
1.3.2 生成mcuboot固件¶
下文先介绍特殊mcuboot的生成方式,再介绍开发过程中,如果需要主动维护更新usb dfu代码的流程
打开ZephyrAppLauncher-v1.5.0.exe
,选择 boot 工程,详情见下图
编译前mcuboot\boot\zephyr\prj.conf
开启下列宏
# open panusb dfu need CONFIG_MCUBOOT_PAN_USB_DFU=y
CONFIG_MCUBOOT_PAN_USB_DFU=y
编译支持对应的board的xxx1版本(ex:鼠标编译xxa1,键盘编译xxb1)
生成的固件会替换原有01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images
路径下的文件
如果需要维护可以应用层灵活选择的宏CONFIG_MCUBOOT_IMAGE_TYPE
可以参考键鼠特殊mcuboot固件自定义文件目录并更新01_SDK\modules\hal\panchip\panplat\pan1080\bootloaderCMakeLists.txt
1.3.3 keil Boot USB dfu版本¶
裸机usb dfu in Bootloader keil版本
参考文档:\03_MCU\mcu_samples_docPAN1080_DFU例程说明.pdf
参考工程:03_MCU\mcu_samples\BOOT_DFU
配合03_MCU\mcu_samples\USB_DFU
1.4 SPI 私有DFU升级¶
mcuboot中spi私有dfu升级基于协议panchip_usb_protocol
的扩展,配合高速USB芯片透传SPI 64B升级
配合工具量产烧录工具\Panchip DFU Tool
(操作方式参考工具内帮助文档)
可以实现应用区写入flag 0x5b(SPI0)/0x5c(SPI1) @0xf000(mcutoot固件最后一页) reboot后跳转停留于boot
并通过usb透传spi进行直接升级(通过USB把数据直接搬运到指定程序运行区域),升级结束后跳转应用层进行flag擦除,主要用于高速鼠标方案
1.4.1 特殊mcuboot固件¶
支持mcuboot内 usb-spi dfu升级 为键鼠预留了简易编译宏,应用层prj.conf
选择CONFIG_MCUBOOT_IMAGE_TYPE=1
rebuild编译时可以直接链接01_SDK\modules\hal\panchip\panplat\pan1080\bootloader
内的特殊mcuboot固件,bootdfu_for_mouse
对应
CONFIG_MCUBOOT_IMAGE_TYPE=1
:支持xxa1编译所有鼠标工程及键盘dongle工程,支持boot内usb升级,支持boot内4k dongle或者8k鼠标的spi透传升级
1.4.2 生成mcuboot固件¶
下文先介绍特殊mcuboot的生成方式,再介绍开发过程中,如果需要主动维护更新usb-spi dfu代码的流程
打开ZephyrAppLauncher-v1.6.0.exe
,选择 boot 工程,详情见下图
编译前mcuboot\boot\zephyr\prj.conf
开启下列宏
# open panusb dfu need CONFIG_MCUBOOT_PAN_SPI_DFU=y
CONFIG_MCUBOOT_PAN_SPI_DFU=y
编译支持对应的board的xxx1版本(ex:高速鼠标+高速鼠标dongle 编译xxa1)
生成的固件会替换原有01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images
路径下的文件
如果需要维护可以应用层灵活选择的宏CONFIG_MCUBOOT_IMAGE_TYPE
可以参考高速鼠标特殊mcuboot固件自定义文件目录并更新01_SDK\modules\hal\panchip\panplat\pan1080\bootloaderCMakeLists.txt
1.4.3 用户修改spi引脚规则¶
高速鼠标工程为例,4k_mouse_dongle
连接SPI 0
管脚进行通信,8k_mouse
连接SPI 1
管脚进行通信,引脚对应也不相同;
特殊固件01_SDK\modules\hal\panchip\panplat\pan1080\bootloader\images\bootdfu_for_mouse
支持2套引脚,并通过flash flag进行区分选择
flag 0x5b对应SPI0、flag 0x5c对应 SPI1 ,用户如果需要自定义修改引脚,可在编译mcuboot前对mcuboot进行修改,并对照1.3.2章节更新 mcuboot固件即可。
2. DFU in APP¶
dfu in app 意味升级流程是在 app 种实现的,BootLoader 只负责校验数据和搬移数据。在升级新程序之前一定要保证兼容性,防止升级失败,特别是在一些跳版本升级的情况。
2.1 USB 私有 DFU升级¶
应用层升级协议继承boot内usb升级协议,公共版本参考例程
参考文档:04_DOC\docs-zdk\03_samples\subsys\usb
参考例程:01_SDK\zephyr\samples_panchip\subsys\usb\panchip_dfu
键鼠solution目前均支持usb app升级+mcuboot升级,可以联系我司获取键鼠solution代码参考
2.2 SPI 私有 DFU升级¶
应用层升级协议继承boot内spi升级协议
高速鼠标solution目前均支持usb app升级+mcuboot升级,可以联系我司获取高速鼠标solution代码参考