测试指南
准备测试环境
-
硬件
-
开发板
-
TF 卡
-
网线(如需测试网络 OTA )
-
-
软件
-
PC 端的串口终端软件,用于 PC 和开发板进行串口通信。
-
HTTP 服务器工具,用于网络 OTA 测试。如不需测试,可略过。
-
测试流程
详细流程如下
- 打开
OTA
相关配置后,保存退出。注: 按照参数配置流程可打开 OTA 相关配置。
- 重新编译和烧录镜像。以下为一个制作 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:读写文件系统
- 将 ota.cpio 放到 TF 卡根目录中。
测试程序
test_ota
默认从 TF 卡根目录读取,源码路径为 packages\artinchip\ota\test_ota.c。 - 搭建 HTTP 服务器,准备网络 OTA。注: 推荐使用 NGINX 工具在 Windows 环境下搭建 HTTP 服务器。
- 从官网下载 NGINX 软件包,地址:https://nginx.org/en/download.html。
- 解压缩下载的软件包。注: 解压包的路径不能包含中文字符。
- 在 CMD 环境下,启动 NGINX 服务。
服务启动成功后,使用任务管理器中的两个 nginx 进程,测试服务器是否正常工作。
- 适配 nginx.conf 文件配置后重新加载配置,并开放服务器目录。
HTTP 服务器窗口如下所示:
- 执行命令 co 进入 images 目录下,找到 ota.cpio 升级包并将其复制到 NGINX 服务器目录。
测试验证
- 确认系统启动位置(上电默认打印)。
Start-up from os #说明从 os 升级
- 输入 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
- 使用 mount
指令查看当前挂载的文件系统信息。
aic /> mount filesystem device mountpoint ---------- ------------ ---------- devfs (NULL) /dev rom (NULL) / elm blk_rodata /rodata elm blk_data /data elm sd0 /sdcard
验证 TF 卡 OTA
- 烧录完成后,断开电源,上电,插入 TF 卡。
- 在串口中直接输入升级命令 test_ota,开始 OTA 升级。
- 确认 cpio 文件信息。
- 擦除 nand flash 分区。
- 分别升级 d21x_os.itb、rodata.fatfs、data.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
- 烧录完成后,断开电源,上电,插入网线。
- 查看启动打印信息。
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.
- 测试网络连通状态。
aic/> ping 192.168.31.22 aic/> Reply from 192.168.31.22: time=2ms
注: ping 通网络,需要等待一段时间 - 执行 help 命令查看 OTA
升级,命令如下:
... http_ota - Use HTTP to download the firmware ...
- 执行命令 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 差异和文件系统中文件差异判断当前运行的版本。
Start-up from os/os_r
-
os 表示从 os 分区读取数据启动 RTT 程序。
-
os_r 表示从 os_r 分区读取数据启动 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 升级或联系技术支持。
- 在 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。
- 使用 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 分区
- 输入 reboot
命令重启设备,使新的设置生效:
reboot
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
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