Edit online

测试指南

25 Dec 2024
Read time: 11 minute(s)

准备测试环境

  • 硬件
    • 开发板

    • TF 卡

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

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

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

测试流程

详细流程如下

  1. 打开 OTA 相关配置后,保存退出。
    注:
    按照参数配置流程可打开 OTA 相关配置。
  2. 重新编译和烧录镜像。
    以下为一个制作 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. 确认系统启动位置(上电默认打印)
    下列示例表示从 os 升级:
    Start-up from os
  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)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 指令查看当前挂载的文件系统信息。
    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 升级。
    test_ota
    • 确认 cpio 文件信息。
    • 擦除 nand flash 分区。
    • 分别升级 d21x_os.itbrodata.fatfsdata.fatfs 文件。
    • 验证文件完整性。
    • 升级完成后,系统会自动重启并加载新的固件。
    结果输出示例如下:
    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. 测试网络连通状态。
    ping 192.168.31.22
    Reply from 192.168.31.22: time=2ms
    注:
    ping 通网络,需要等待一段时间
  4. 执行 help 命令查看 OTA 升级,命令如下:
    ...
    http_ota         - Use HTTP to download the firmware
    ...
    
  5. 执行下列命令启动 OTA 升级:
    http_ota
    或者
    http_ota http://192.168.31.22/ota.cpio
    注:

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

    以下是相关升级信息:
    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 或者 BootLoader 方式设置系统和文件系统的启动分区来实现。

以下是详细的版本回退步骤和注意事项说明:
  1. 在进行任何操作之前,确保已经备份了设备上的重要数据,以防数据丢失。
    • 在回退过程中,设备可能会短暂失去响应,耐心等待设备重启并加载旧版本固件。
    • 如果回退后设备无法正常启动,可能需要重新进行 OTA 升级或联系技术支持。
  2. 在 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。
  3. 使用 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 分区
  4. 输入 reboot 命令重启设备,使新的设置生效:
    reboot

在 RTT 中进行回退操作

  1. 通过 fw_setenv 命令设置下次启动时系统、只读文件系统和读写文件系统的分区。
    • 将系统设置为下次从 B 分区启动:
      fw_setenv osAB_next B
    • 将只读文件系统设置为下次从 B 分区启动:
      fw_setenv rodataAB_next B
    • 将读写文件系统设置为下次从 A 分区启动:
      fw_setenv dataAB_next 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=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 分区
    
  3. 重启设备,使设置生效。
    reboot

如果需要回退到之前的分区配置,只需再次设置相应的环境变量即可。

在 Boot 中进行回退操作

  1. 使用 fw_setenv 命令设置下次启动时系统、只读文件系统和读写文件系统的分区。
    • 将系统设置为下次从 A 分区启动。
      fw_setenv osAB_next A
    • 将只读文件系统设置为下次 A 分区启动。
      fw_setenv rodataAB_next A
    • 将读写文件系统设置为下次 B 分区启动。
      fw_setenv dataAB_next B
  2. 使用 reboot 命令重启设备,使设置生效。
    reboot

    如果需要回退到之前的分区配置,只需再次设置相应的环境变量即可。