X2000 USB's CDC协议的OTA升级
[TOC]
一 支持的软硬件平台
1.1 支持的硬件平台
支持x1000、x1600、x2000、x2600、ad100系列CPU,已在ilock(x2000e & mmc0)、Halley6(x1600e &nand)、x2600_evb_v1.0(x2600e & nor)开发板上验证。
1.2 支持的软件平台
ota支持升级linux系统和Freertos系统。
二 OTA原理和介质介绍
2.1 OTA简介和实现方法
君正USB's CDC协议的OTA简单来说分为三个步骤。
-
第一步: 准备好需要更新的升级固件。
-
第二步:通过USB的CDC协议将升级固件传输到设备上。
-
第三步:设备将得到的OTA升级固件更新到自身的存储介质中,然后重启切换到最新升级的系统上,从而完成整个OTA流程。
君正基于Freertos系统,OTA升级的策略是采用创建一个rtos_ota分区,分区中放置具有ota升级功能的Freertos系统代码。SPL引导代码通过判断ota分区中的内容是否为"ota:kernel2", 来决定是否要进入具有ota升级功能的Freertos系统。也就是一台设备上具有ota升级功能的Freertos系统代码和用户的主系统,但是每次只运行其中的一套系统,两个系统共同使用一份SPL代码。
2.2 OTA升级支持的存储介质
君正USB's CDC协议的OTA目前支持的存储介质有mtd和mmc,mtd包含:nand和nor。
2.3 Freertos系统的ota功能使用流程

三 编译支持rtos_ota功能的SPL
3.1 uboot添加支持rtos_ota功能
3.1.1 MTD存储介质
以配备nor flash 的PD_X2600_EVB_V1.0开发板,主系统为Freertos的编译配置为例,编译需要支持rtos ota功能的uboot固件的步骤如下:
3.1.1.1 修改对应的板级配置文件
对应的SPL的编译配置为x2600e_base_rtos_sfc_nor,此配置对应的板级配置文件为x2600_base.h。 文件的路径如下:
[工程目录]/bootloader/uboot-x2000/include/configs/{board}.h
以x2600为例:[工程目录]/bootloader/uboot-x2000/include/configs/x2600_base.h
增加OTA的功能需要对x2600_base.h文件进行如下修改:
#ifndef __X2600_BASE_H__
#define __X2600_BASE_H__
#define CONFIG_ROOTFS_SQUASHFS
#define CONFIG_ROOTFS2_SQUASHFS
#define CONFIG_ARG_QUIET
#define CONFIG_SPL_SERIAL_SUPPORT
/* 添加以下宏定义 */
#define CONFIG_BOOT_RTOS_OTA
#include "x2600_base_common.h"
#endif /* __X2600_BASE_H__ */
uboot中与rtos的ota相关定义的文件路径如下:
[工程目录]/bootloader/uboot-x2000/include/configs/{soc}_base_common.h
以x2600为例: [工程目录]/bootloader/uboot-x2000/include/configs/x2600_base_common.h
对应的宏定义具体的解释如下:
#ifdef CONFIG_BOOT_RTOS_OTA
/* 定义放置具有升级功能的rtos的分区名 */
#define CONFIG_SPL_RTOS_OTA_NAME "rtos_ota"
#ifndef CONFIG_SPL_OTA_NAME
/* 定义放置升级信息的分区名 */
#define CONFIG_SPL_OTA_NAME "ota"
#endif
#ifndef CONFIG_SPL_RTOS_OTA_INFO
/* 定义判断是否要进入rtos_ota分区的条件 */
#define CONFIG_SPL_RTOS_OTA_INFO "ota:rtos_ota"
#endif
#ifdef CONFIG_SPL_RTOS_BOOT
#ifndef CONFIG_SPL_RTOS_NAME
/* 若另一分区也为Freertos系统,且CONFIG_SPL_RTOS_NAME宏未定义,定义CONFIG_SPL_RTOS_NAME为rtos */
#define CONFIG_SPL_RTOS_NAME "rtos"
#endif
#endif /* CONFIG_SPL_RTOS_BOOT */
#endif /* CONFIG_BOOT_RTOS_OTA */
3.1.1.2 编译uboot
- 配置编译uboot需要的环境变量
通过以下命令,确定对应的芯片的uboot编译工具链:
#获取对应的芯片的uboot的编译工具链版本
fy@hlf:~/work/x2670/build$ grep -nr "uboot" configs/x2600e_nor_5.10_defconfig
3:APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc720-glibc229
4:APP_uboot_dir=../bootloader/uboot-x2000
5:APP_uboot_config=x2600e_base_xImage_sfc_nor
#获取工具的绝对路径
fy@hlf:~/work/x2670/build$ cd ../tools/toolchains/mips-gcc720-glibc229
fy@hlf:~/work/x2670/tools/toolchains/mips-gcc720-glibc229$ pwd
/home/fy/work/x2670/tools/toolchains/mips-gcc720-glibc229
#回到对应的uboot代码的目录下
fy@hlf:~/work/x2670/tools/toolchains/mips-gcc720-glibc229$ cd ../../../bootloader/uboot-x2000/
#配置编译uboot需要的工具链的路径,注意路径要链接到bin文件夹
fy@hlf:~/work/x2670/bootloader/uboot-x2000$ export PATH=$PATH:/home/fy/work/x2670/tools/toolchains/mips-gcc720-glibc229/bin
- 编译对应的uboot配置
#清除之前make生成的所有文件
[工程目录]/bootloader/uboot-x2000$ make distclean
#编译对应的板级的uboot配置,此处以x2600e的nor flash的Freertos系统为例
[工程目录]/bootloader/uboot-x2000$ make x2600e_base_rtos_sfc_nor
编译成功后会在[工程目录]/bootloader/uboot-x2000/spl目录下生成目标文件:

3.1.2 MMC存储介质
以配备emmc的x2000_iLock_v1.0开发板,主系统为Freertos的编译配置为例,编译需要支持rtos ota功能的uboot固件的步骤如下:
3.1.2.1 修改对应的板级配置文件
对应的SPL的编译配置为x2000_base_rtos_mmc0,此配置对应的板级配置文件为x2000_base.h。 文件的路径如下:
[工程目录]/bootloader/uboot-x2000/include/configs/{board}.h
以x2000为例:[工程目录]/bootloader/uboot-x2000/include/configs/x2000_base.h
增加OTA的功能需要对x2000_base.h文件进行如下修改:
#ifndef __X2000_BASE_H__
#define __X2000_BASE_H__
#define CONFIG_ROOTFS_SQUASHFS
#define CONFIG_ROOTFS2_SQUASHFS
#define CONFIG_ARG_QUIET
#define CONFIG_SPL_SERIAL_SUPPORT
/* 添加以下宏定义 */
#define CONFIG_BOOT_RTOS_OTA
#include "x2000_base_common.h"
#endif /* __X2000_BASE_H__ */
uboot中与rtos的ota相关定义的文件路径如下:
[工程目录]/bootloader/uboot-x2000/include/configs/{soc}_base_common.h
以x2000为例: [工程目录]/bootloader/uboot-x2000/include/configs/x2000_base_common.h
对应的宏定义具体的解释如下:
#ifdef CONFIG_BOOT_RTOS_OTA
/* 定义放置具有升级功能的rtos的分区名 */
#define CONFIG_SPL_RTOS_OTA_NAME "rtos_ota"
#ifndef CONFIG_SPL_OTA_NAME
/* 定义放置升级信息的分区名 */
#define CONFIG_SPL_OTA_NAME "ota"
#endif
#ifndef CONFIG_SPL_RTOS_OTA_INFO
/* 定义判断是否要进入rtos_ota分区的条件 */
#define CONFIG_SPL_RTOS_OTA_INFO "ota:rtos_ota"
#endif
#ifdef CONFIG_SPL_RTOS_BOOT
#ifndef CONFIG_SPL_RTOS_NAME
/* 若另一分区也为Freertos系统,且CONFIG_SPL_RTOS_NAME宏未定义,定义CONFIG_SPL_RTOS_NAME为rtos */
#define CONFIG_SPL_RTOS_NAME "rtos"
#endif
#endif /* CONFIG_SPL_RTOS_BOOT */
#endif /* CONFIG_BOOT_RTOS_OTA */
3.1.2.2 修改分区表
分区表的路径如下:[工程目录]/bootloader/uboot-x2000/board/ingenic/芯片名_base/ eg: /home/fy/work/x2670/bootloader/uboot-x2000/board/ingenic/x2000_base
- 主系统为Freertos系统的分区表:
property:
disk_size = 3728m
gpt_header_lba = 512
custom_signature = 0
partition:
#name = start, size, fstype
uboot = 0m, 1m,
rtos_ota = 1m, 1m, EMPTY
rtos = 2m, 5m, EMPTY
ota = 7m, 1m, EMPTY
#fstype could be: LINUX_FS, FAT_FS, EMPTY
- 主系统为Linux系统的分区表:
property:
disk_size = 3728m
gpt_header_lba = 512
custom_signature = 0
partition:
#name = start, size, fstype
uboot = 0m, 1m,
kernel = 1m, 8m, EMPTY
rootfs = 9m, 50m, LINUX_FS
rtos_ota = 59m, 1m, EMPTY
ota = 60m, 1m, EMPTY
#fstype could be: LINUX_FS, FAT_FS, EMPTY
3.1.2.3 编译uboot
- 配置编译uboot需要的环境变量
通过以下命令,确定对应的芯片的uboot编译工具链:
#获取对应的芯片的uboot的编译工具链版本
fy@hlf:~/work/x2670/build$ grep -nr "uboot" configs/x2000_mmc0_defconfig
2:APP_uboot_toolchain_dir=../tools/toolchains/mips-gcc720-glibc229
3:APP_uboot_dir=../bootloader/uboot-x2000
4:APP_uboot_config=x2000_base_xImage_mmc0
#获取工具的绝对路径
fy@hlf:~/work/x2670/build$ cd ../tools/toolchains/mips-gcc720-glibc229
fy@hlf:~/work/x2670/tools/toolchains/mips-gcc720-glibc229$ pwd
/home/fy/work/x2670/tools/toolchains/mips-gcc720-glibc229
#回到对应的uboot代码的目录下
fy@hlf:~/work/x2670/tools/toolchains/mips-gcc720-glibc229$ cd ../../../bootloader/uboot-x2000/
#配置编译uboot需要的工具链的路径,注意路径要到bin文件夹
fy@hlf:~/work/x2670/bootloader/uboot-x2000$ export PATH=$PATH:/home/fy/work/x2670/tools/toolchains/mips-gcc720-glibc229/bin
- 编译对应的uboot配置
#清除之前make生成的所有文件
[工程目录]/bootloader/uboot-x2000$ make distclean
#编译对应的板级的uboot配置,此处以x2000e的mmc flash的Freertos系统为例
[工程目录]/bootloader/uboot-x2000$ make x2000_base_rtos_mmc0
编译成功后会在[工程目录]/bootloader/uboot-x2000目录下生成目标文件:

四 编译带ota升级功能的zero.bin
4.1 IConfigTool配置
以x2600e_nor_defconfig为例,打开IConfigTool工具,选择配置文件

勾选以下配置:
- 选中USB驱动



- 选中SFC驱动,若为MMC介质不需要选中


- 选中rtos的ota升级


- 选中watchdog(看门狗)

4.2 增加ota升级代码
修改vendor/vendor.c文件(以存储介质nor flash为例):
#include <stdio.h>
#include "example/driver/ota_upgrade_nor_flash.c"//ota升级nor flash代码示例文件路径
void vendor_init(void *arg)
{
ota_upgrade_nor_flash_test();
}
4.3 编译
- 首先先要配置环境变量,再使用对应板级和存储介质的配置文件,如x2600的nor flash:

-
配置之后就可以make:
