Edit online

SPI NOR OTA 流程

  1. 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(); //升级结束,更新环境变量信息
  2. 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 分区程序到缓存上
  3. 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 分区