当前文档版本为 v1.2.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

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 工程,详情见下图

BootLoader 编译界面

注意:

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.2 升级过程

如下图选择传输协议1K XmodemS,打开需要传输的文件,点击发送即可。

image

xmodem 传输界面

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 工程,详情见下图

BootLoader 编译界面

编译前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 工程,详情见下图

BootLoader 编译界面

编译前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代码参考