SPI NOR OTA 流程
- SPI NOR 平台 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(); //升级结束,更新环境变量信息
- SPI NOR 平台 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 分区程序到缓存上
- SPI NOR 平台 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 分区