10.4.5. 设计说明¶
10.4.5.1. A/B 系统方案分区信息¶
 
注解
- ENV 分区,用来保存 env 环境变量,增加了一个备用 ENV 分区,确保在一份数据破坏后,另外一份数据还能继续使用 
- OS,RODATA分区各有一个备份分区,它们一起称为 A/B 系统 
10.4.5.3. 环境变量指导 A/B 系统升级和启动¶
10.4.5.3.1. OTA升级相关环境变量¶
osAB_next=A
osAB_now=A
upgrade_available=0
bootlimit=5
bootcount=0
10.4.5.3.2. 环境变量使用说明¶
| 环境变量名称 | 定义 | 注释说明 | 
|---|---|---|
| osAB_now | 启动分区 | osAB_now 为“A”表示 OS 本次从 OS_A 启动, 为“B”表示本次从 OS_B 分区启动 | 
| osAB_next | 升级分区 | osAB_next 为“A”表示更新 A 系统数据, 为“B”表示更新 B 系统数据 | 
| upgrade_available | OTA升级完成 | OTA升级完成,指导 boot 程序更新启动分区和版本回退 | 
| bootcount | 失败启动次数 | 启动分区启动os程序失败的次数 | 
| bootlimit | 失败启动次数限制 | 启动分区启动失败次数超过bootlimit会触发版本回退 | 
10.4.5.3.3. 环境变量在OTA升级过程中的作用¶
 
10.4.5.4. OTA 升级包制作过程¶
10.4.5.4.1. OTA升级包配置文件:ota-subimgs.cfg¶
相关文件路径如下:
target/d13x/per1-nor/pack/ota-subimgs.cfg
查看配置信息:
> cat ota-subimgs.cfg
os.aic
data.fatfs
10.4.5.4.2. OTA升级包生成工具: mkcpio.py¶
相关文件路径如下:
tools/scripts/mkcpio.py
执行编译命令,会自动执行 mkcpio.py 命令生成 ota.cpio。mkcpio.py 具体调用了cpio, cpio.exe命令进行打包。
10.4.5.4.3. OTA包数据组成格式¶
 
10.4.5.5. SPINOR OTA 流程¶
10.4.5.5.1. SPINOR 平台 OS 阶段 app OTA 执行流程¶
http_ota  //packages/third-party/ota_downloader/src/http_ota.c
|-> http_ota_fw_download(argv[1]);
    |-> aic_upgrade_start(); //packages/third-party/ota_downloader/absystem.c 升级前读取环境变量信息,获取将要升级的系统
    |-> webclient_session_create(GET_HEADER_BUFSZ);
    |-> webclient_shard_head_function(session, uri, &file_size);
    |-> webclient_register_shard_position_function(session, http_ota_shard_download_swu_handle);
    |-> webclient_shard_position_function(session, uri, file_offset, file_size, HTTP_OTA_BUFF_LEN);
        |-> http_ota_shard_download_swu_handle      //采用分片方式下载数据
        |-> ota_buf_push(&shdr, buffer, length);    //将下载的数据放到缓存区,供解析cpio头部信息
        |-> find_cpio_data(&fhdr, shdr.buf, shdr.buflen);   //解析cpio头部信息
        |-> swu_buf_pop(&bhdr, &shdr, &fhdr);               //将cpio头部信息后面的数据放到另外的缓存区,供升级使用
        |-> ota_buf_push(&bhdr, buffer, length);            //将下载的数据放到缓存区,供升级使用
        |-> fal_partition_find(partname[flag_cpio])         //获取分区信息
        |-> fal_partition_erase(dl_part, 0, dl_part->len)   //擦除分区
        |-> download_buf_pop(&bhdr, &fhdr)                  //将缓存区里面的数据取出来,升级到flash上
            |-> fal_partition_write                         //写入数据到flash上
            |-> cpio_file_checksum((unsigned char *)bhdr->buf, burn_len);       //升级完成以后,校验和信息
    |-> aic_upgrade_end(); //升级结束,更新环境变量信息
10.4.5.5.2. SPINOR 平台 boot 阶段新系统程序加载启动流程¶
do_nor_boot //application/baremetal/bootloader/cmd/nor_boot.c
|-> aic_ota_check();  //application/baremetal/bootloader/lib/absystem/absystem.c
    |-> aic_ota_version_fallback(); // OTA 升级失败,版本回退到之前的版本
|-> aic_get_os_to_startup(target); //获取新系统信息
|-> mtd_get_device(target); // 获取新系统 os 分区结构体
|-> spl_load_simple_fit(&info, &entry_point); // 加载 os 分区程序到缓存上
10.4.5.5.3. SPINOR 平台 OS 阶段判断 OTA 升级完成的流程¶
main //application/os/helloworld/main.c
|-> aic_ota_status_update // packages/third-party/ota_downloader/absystem.c 判断 OTA 升级成功
|-> aic_get_rodata_to_mount(target); // 获取新系统 rodata 分区
|-> dfs_mount(target, "/rodata", "elm", 0, 0) // 挂载新系统 rodata 分区
