Edit online

测试指南

5 Dec 2024
Read time: 11 minute(s)

准备测试环境

  • 硬件
    • 开发板

    • TF 卡

    • 网线(如需测试网络 OTA )

  • 软件
    • PC 端的串口终端软件,用于 PC 和开发板进行串口通信。

    • HTTP 服务器工具,用于网络 OTA 测试。如不需测试,可略过。

测试流程

详细流程如下

  1. 打开 OTA 相关配置后,保存退出。
    注: 按照参数配置流程可打开 OTA 相关配置。
  2. 重新编译和烧录镜像。
    以下为一个制作 CPIO 镜像的示例,在编译过程中可以看到如下 ota.cpio 包的打包信息,表示编译过程已经完成且更新了 ota.cpio 的大小:
    make CPIO image begin...
    ota_info.bin
    d21x_os.itb
    rodata.fatfs
    data.fatfs
    14663 blocks
    Successfully updated size to ota.cpio
    make CPIO image done...
    
    三个需升级的文件如下所示:
    • d21x_os.itb:系统文件系统
    • rodata.fatfs:只读文件系统
    • data.fatfs:读写文件系统
  3. ota.cpio 放到 TF 卡根目录中。

    测试程序 test_ota 默认从 TF 卡根目录读取,源码路径为 packages\artinchip\ota\test_ota.c。

  4. 搭建 HTTP 服务器,准备网络 OTA。
    注: 推荐使用 NGINX 工具在 Windows 环境下搭建 HTTP 服务器。
    1. 从官网下载 NGINX 软件包,地址:https://nginx.org/en/download.html。
    2. 解压缩下载的软件包。
      注: 解压包的路径不能包含中文字符。
    3. CMD 环境下,启动 NGINX 服务。

      服务启动成功后,使用任务管理器中的两个 nginx 进程,测试服务器是否正常工作。

    4. 适配 nginx.conf 文件配置后重新加载配置,并开放服务器目录。

      HTTP 服务器窗口如下所示:


      http

    5. 执行命令 co 进入 images 目录下,找到 ota.cpio 升级包并将其复制到 NGINX 服务器目录。
Edit online

测试验证

在执行升级之前,需要先确认当前环境变量、文件挂载信息和系统信息等,具体流程如下:
  1. 确认系统启动位置(上电默认打印)。
    Start-up from os #说明从 os 升级
  2. 输入 fw_printenv 命令查看当前的环境变量设置。
    aic /> fw_printenv
    MTD=spi0.0:1m(spl),256k(env),256k(env_r),4m(os),4m(os_r),12m(rodata),12m(rodata_r),40m(data),40m(data_r)osAB_next=A
    rodataAB_next=A
    dataAB_next=A
    upgrade_available=0bootlimit=5bootcount=0rodata_partname=blk_rodata
    rodata_partname_r=blk_rodata_r
    data_partname=blk_data
    data_partname_r=blk_data_r
    osAB_now=A
    rodataAB_now=A
    dataAB_now=A
    
  3. 使用 mount 指令查看当前挂载的文件系统信息。
    aic /> mount
    filesystem     device     mountpoint
    ----------  ------------  ----------
    devfs       (NULL)        /dev
    rom         (NULL)        /
    elm         blk_rodata    /rodata
    elm         blk_data      /data
    elm         sd0           /sdcard
    

验证 TF 卡 OTA

  1. 烧录完成后,断开电源,上电,插入 TF 卡。
  2. 在串口中直接输入升级命令 test_ota,开始 OTA 升级。
    • 确认 cpio 文件信息。
    • 擦除 nand flash 分区。
    • 分别升级 d21x_os.itbrodata.fatfsdata.fatfs 文件。
    • 验证文件完整性。
    • 升级完成后,系统会自动重启并加载新的固件。
    结果输出示例如下:
    aic /> test_ota
    
    01-01 15:59:27 I/NO_TAG: find file ota_info.bin cpio data success
    
    01-01 15:59:27 I/NO_TAG: cpio file size:10538496
    01-01 15:59:27 I/NO_TAG: cpio file version:1.0.0
    01-01 15:59:27 I/NO_TAG: Parsing cpio file info is successful!
    01-01 15:59:27 I/NO_TAG: find file d21x_os.itb cpio data success
    
    01-01 15:59:27 I/NO_TAG: osAB_now= A
    01-01 15:59:27 I/NO_TAG: Upgrade B system
    01-01 15:59:27 I/NO_TAG: Start upgrade to os_r, flag_cpio:1!
    01-01 15:59:27 I/NO_TAG: Partition (os_r) find success!
    01-01 15:59:27 I/NO_TAG: Start erase nand flash partition!
    01-01 15:59:27 I/NO_TAG: Erase nand flash partition success! len=3201-01 15:59:27 I/NO_TAG: Start upgrade d21x_os.itb!
    01-01 15:59:27 I/NO_TAG: Download: [=>
    01-01 15:59:27 I/NO_TAG: Download: [==>
    
    ......
    
    01-01 15:59:29 I/NO_TAG: Sum check success!
    01-01 15:59:29 I/NO_TAG: download d21x_os.itb success!
    
    01-01 15:59:29 I/NO_TAG: Incomplete header info! shdr.buflen =801-01 15:59:29 I/NO_TAG: find file rodata.fatfs cpio data success
    
    01-01 15:59:29 I/NO_TAG: rodataAB_now= A
    01-01 15:59:29 I/NO_TAG: Upgrade B rodatafs
    01-01 15:59:29 I/NO_TAG: Start upgrade to rodata_r, flag_cpio:2!
    01-01 15:59:29 I/NO_TAG: Partition (rodata_r) find success!
    01-01 15:59:29 I/NO_TAG: Start erase nand flash partition!
    01-01 15:59:29 I/NO_TAG: Erase nand flash partition success! len=9601-01 15:59:29 I/NO_TAG: Start upgrade rodata.fatfs!
    01-01 15:59:29 I/NO_TAG: Download: [>
    01-01 15:59:29 I/NO_TAG: Download: [=>
    01-01 15:59:29 I/NO_TAG: Download: [==>
    
    ......
    
    01-01 15:59:33 I/NO_TAG: Sum check success!
    01-01 15:59:33 I/NO_TAG: download rodata.fatfs success!
    
    01-01 15:59:33 I/NO_TAG: find file data.fatfs cpio data success
    
    01-01 15:59:33 I/NO_TAG: dataAB_now= A
    01-01 15:59:33 I/NO_TAG: Upgrade B datafs
    01-01 15:59:33 I/NO_TAG: Start upgrade to blk_data_r, flag_cpio:3!
    01-01 15:59:33 I/NO_TAG: Partition (blk_data_r) find success!
    01-01 15:59:33 I/NO_TAG: NFTL partition not need to erase!
    01-01 15:59:33 I/NO_TAG: Start upgrade data.fatfs!
    [ND]nftl start:320,51
    [ND]nftl ok!
    01-01 15:59:33 I/NO_TAG: Download: [>
    01-01 15:59:33 I/NO_TAG: Download: [=>
    01-01 15:59:33 I/NO_TAG: Download: [==>
    01-01 15:59:33 I/NO_TAG: Download: [===>
    
    01-01 15:59:36 I/NO_TAG: Sum check success!
    01-01 15:59:36 I/NO_TAG: download data.fatfs success!
    
    01-01 15:59:36 I/NO_TAG: Incomplete header info! shdr.buflen =1601-01 15:59:36 I/NO_TAG: find file TRAILER!!! cpio data success
    
    01-01 15:59:36 I/NO_TAG: find file TRAILER!!! cpio data success
    
    01-01 15:59:36 I/NO_TAG: os Next startup in B system
    01-01 15:59:36 I/NO_TAG: rodata Next mount in B system
    01-01 15:59:36 I/NO_TAG: data Next mount in B system
    01-01 15:59:36 I/NO_TAG: Restarting system ...
    

验证网络 OTA

  1. 烧录完成后,断开电源,上电,插入网线。
  2. 查看启动打印信息。
    ai:
        IPv4 Address   : 192.168.31.200
        Default Gateway: 192.168.31.1
        Subnet mask    : 255.255.255.0
        MAC addr       : 00:22:44:88:77:66
    [I] aicphy_poll_thread()635  Port 0 link UP! autoneg mode: speed 100M, full duplex, flow control off.
    
  3. 测试网络连通状态。
    aic/> ping 192.168.31.22
    aic/> Reply from 192.168.31.22: time=2ms
    
    注: ping 通网络,需要等待一段时间
  4. 执行 help 命令查看 OTA 升级,命令如下:
    ...
    http_ota         - Use HTTP to download the firmware
    ...
    
  5. 执行命令 http_ota 或者 http_ota http://192.168.31.22/ota.cpio 启动 OTA 升级。
    注:

    升级完成以后,自动重启,加载新代码启动。

    以下是相关升级信息:
    aic /> http_ota
    using uri: http://192.168.31.20/ota.cpio
    01-01 16:10:08 I/NO_TAG: OTA file size is (10538496)01-01 16:10:08 I/NO_TAG: find file ota_info.bin cpio data success
    01-01 16:10:08 I/NO_TAG: cpio file size:10538496
    01-01 16:10:08 I/NO_TAG: cpio file version:1.0.0
    01-01 16:10:08 I/NO_TAG: Parsing cpio file info once is sufficient and successful!
    01-01 16:10:08 I/NO_TAG: find file d21x_os.itb cpio data success
    01-01 16:10:08 I/NO_TAG: osAB_now= B
    01-01 16:10:08 I/NO_TAG: Upgrade A system
    01-01 16:10:08 I/NO_TAG: Start upgrade to os, flag_cpio:1!
    01-01 16:10:08 I/NO_TAG: Partition (os) find success!
    01-01 16:10:08 I/NO_TAG: Start erase nand flash partition!
    01-01 16:10:09 I/NO_TAG: Erase nand flash partition success! len=3201-01 16:10:09 I/NO_TAG: Start upgrade d21x_os.itb!
    01-01 08:08:50 I/NO_TAG: Download: [==>
    01-01 08:08:50 I/NO_TAG: Download: [===>
    ......
    01-01 16:10:11 I/NO_TAG: Sum check success!
    01-01 16:10:11 I/NO_TAG: download d21x_os.itb success!
    01-01 16:10:11 I/NO_TAG: find file rodata.fatfs cpio data success
    01-01 16:10:11 I/NO_TAG: rodataAB_now= B
    01-01 16:10:11 I/NO_TAG: Upgrade A rodatafs
    01-01 16:10:11 I/NO_TAG: Start upgrade to rodata, flag_cpio:2!
    01-01 16:10:11 I/NO_TAG: Partition (rodata) find success!
    01-01 16:10:11 I/NO_TAG: Start erase nand flash partition!
    01-01 16:10:11 I/NO_TAG: Erase nand flash partition success! len=9601-01 16:10:11 I/NO_TAG: Start upgrade rodata.fatfs!
    01-01 16:10:11 I/NO_TAG: Download: [>
    01-01 16:10:11 I/NO_TAG: Download: [=>
    ......
    01-01 16:10:16 I/NO_TAG: find file data.fatfs cpio data success
    01-01 16:10:16 I/NO_TAG: dataAB_now= B
    01-01 16:10:16 I/NO_TAG: Upgrade A datafs
    01-01 16:10:16 I/NO_TAG: Start upgrade to blk_data, flag_cpio:3!
    01-01 16:10:16 I/NO_TAG: Partition (blk_data) find success!
    01-01 16:10:16 I/NO_TAG: NFTL partition not need to erase!
    01-01 16:10:16 I/NO_TAG: Start upgrade data.fatfs!
    [ND]nftl start:320,51
    [ND]nftl ok!
    01-01 16:10:16 I/NO_TAG: Download: [>
    01-01 16:10:16 I/NO_TAG: Download: [=>
    ......
    01-01 16:10:21 I/NO_TAG: download data.fatfs success!
    01-01 16:10:21 I/NO_TAG: find file TRAILER!!! cpio data success
    01-01 16:10:21 I/NO_TAG: Download firmware to flash success.
    01-01 16:10:21 I/NO_TAG: System now will restart...
    01-01 16:10:21 I/NO_TAG: os Next startup in A system
    01-01 16:10:21 I/NO_TAG: rodata Next mount in A system
    01-01 16:10:21 I/NO_TAG: data Next mount in A system
    01-01 16:10:21 I/NO_TAG: Restarting system ...
    

升级判断

从程序打印 log 差异和文件系统中文件差异判断当前运行的版本。

Boot 相关打印信息
Start-up from os/os_r
  • os 表示从 os 分区读取数据启动 RTT 程序。

  • os_r 表示从 os_r 分区读取数据启动 RTT 程序。

RTT 相关打印信息
如果有进行文件系统升级,可以关注以下信息
Mount APP in blk blk_rodata_r
Mount APP in blk blk_data_r
  • blk_data 表示从 blk_data 分区挂载读写文件系统。

  • blk_data_r 表示从 blk_data_r 分区挂载读写文件系统。

  • blk_rodata 表示从 blk_rodata 分区挂载只读文件系统。

  • blk_rodata_r 表示从 blk_rodata_r 分区挂载只读文件系统。

提示:

可以再次输入 mount 命令查看文件系统挂载点。

版本回退

在 OTA 升级过程中,如果需要回退到先前的版本,可以通过 RTT 或者 Boot 方式设置系统和文件系统的启动分区来实现。版本回退时需注意以下事项:

  • 确保在执行回退操作前已备份重要数据,以防数据丢失。
  • 在回退过程中,设备可能会短暂失去响应,耐心等待设备重启并加载旧版本固件。
  • 如果回退后设备无法正常启动,可能需要重新进行 OTA 升级或联系技术支持。
以下是详细的回退步骤:
  1. 在 BootLoader 或系统中,输入fw_setenv 命令设置下次启动的系统和文件系统分区:
    fw_setenv osAB_next B
                                        fw_setenv rodataAB_next B
                                        fw_setenv dataAB_next A
    • osAB_next = B: 将下次系统启动分区设置为 B。
    • rodataAB_next = B: 将下次只读文件系统挂载分区设置为 B。
    • dataAB_next = A: 将下次读写文件系统挂载分区设置为 A。
  2. 使用 fw_printenv 命令查看当前的环境变量设置,确保上述设置已成功应用:
    fw_printenv
    系统输出如下:
    MTD=spi0.0:1m(spl),256k(env),256k(env_r),4m(os),4m(os_r),12m(rodata),12m(rodata_r),40m(data),40m(data_r)
                                        bootlimit=5
                                        rodata_partname=blk_rodata
                                        rodata_partname_r=blk_rodata_r
                                        data_partname=blk_data
                                        data_partname_r=blk_data_r
                                        bootcount=1
                                        upgrade_available=0
                                        osAB_now=A # 当前系统启动分区为 A 分区
                                        rodataAB_now=A # 当前只读系统挂载为 A 分区
                                        dataAB_now=B # 当前读写系统挂载为 B 分区
                                        osAB_next=B # 下次系统启动分区为 B 分区
                                        rodataAB_next=B # 下次只读系统挂载为 B 分区
                                        dataAB_next=A # 下次读写系统挂载为 A 分区
                                    
  3. 输入 reboot 命令重启设备,使新的设置生效:
    reboot
RTT 中进行回退示例
aic /> fw_setenv osAB_next B
aic /> fw_setenv rodataAB_next B
aic /> fw_setenv dataAB_next A
# 此处将系统、只读文件系统,读写文件系统,分别设置下次启动从 B、B、A 分区启动
aic /> fw_printenv
MTD=spi0.0:1m(spl),256k(env),256k(env_r),4m(os),4m(os_r),12m(rodata),12m(rodata_r),40m(data),40m(data_r)bootlimit=5rodata_partname=blk_rodata
rodata_partname_r=blk_rodata_r
data_partname=blk_data
data_partname_r=blk_data_r
bootcount=1upgrade_available=0osAB_now=A # 当前系统启动分区为 A 分区 rodataAB_now=A # 当前只读系统挂载为 A 分区 dataAB_now=B # 当前读写系统挂载为 B 分区 osAB_next=B # 下次系统启动分区为 B 分区 rodataAB_next=B # 下次只读系统挂载为 B 分区 dataAB_next=A # 下次读写系统挂载为 A 分区

aic /> reboot
Boot 中进行回退示例
aic@tinySPL # fw_setenv osAB_next A
aic@tinySPL # fw_setenv rodataAB_next A
aic@tinySPL # fw_setenv dataAB_next B
aic@tinySPL #
aic@tinySPL # reboot