Edit online

AICUPG 烧录

4 Dec 2024
Read time: 2 minute(s)

ArtInChip 平台支持通过 USB 进行裸机烧录的功能。通常情况下,该功能在 BROM 阶段通过检测特定按键的方式,或者启动失败时进入。

完整的升级过程分为两个阶段:

  • BROM 阶段

    仅支持下载数据和组件到 SRAM/DRAM,以及执行下载的组件。不支持烧录组件到存储介质。

  • U-Boot 阶段

    支持从主机端下载数据和组件,并且支持将组件烧录到指定的存储介质。

USB 裸机烧录的实现流程:
  1. 下载 SPL 组件到 SRAM 并执行,对 DRAM 进行初始化。
  2. 下载 U-Boot 到 DRAM 并执行。
  3. 进入 U-Boot AICUPG 升级模式。
遵照以下流程完成 AICUPG 烧录:
  1. 进入升级模式。

    U-Boot 中新增了用于镜像升级的命令 aicupg ,可以通过该命令手动进入升级模式, 或者 env.txt 启动脚本中通过检测启动设备信息,在启动过程中主动进入升级模式。该命令的源码实现在 cmd/aicupg.c

  2. 执行下列命令开始 USB 升级初始化:
    aicupgusb0
    具体流程:
    注: 此处注册的 usb_dnl_aicupg即为 f_aicupgusb.c 中实现的 Gadget。 通过注册添加 Gadget 到系统之后,即可循环检查和处理 USB 数据。
    do_aicupg(); // cmd/aicupg.c
    |-> do_usb_protocol_upg(intf); // cmd/aicupg.c
        |-> usb_gadget_initialize(intf); // drivers/usb/gadget/udc/udc-uclass.c
        |-> g_dnl_register("usb_dnl_aicupg"); // drivers/usb/gadget/g_dnl.c
        |
        |   // 接下进入循环,不停调用下面的函数进行数据处理
        |-> usb_gadget_handle_interrupts(intf);
  3. 使用下列命令,按顺序将镜像文件中的组件逐个发送给设备端:
    注: 主机端在制作用于烧录的镜像时,根据 image_cfg.json 的配置,为每一个组件生成 meta 信息,然后按照 image_cfg.json 中的顺序将组件打包为一个镜像文件。
    1. 镜像升级所用的命令
    顺序 命令 说明
    1 GET_HWINFO 获取当前状态
    2 SET_FWC_META 发送 Meta 数据
    3 GET_BLOCK_SIZE 获取发送数据的对齐大小
    4 SEND_FWC_DATA 发送组件数据
    5 GET_FWC_CRC 获取设备端计算的 CRC 值
    6 GET_FWC_BURN_RESULT 检查烧录是否成功
    7 GET_FWC_RUN_RESULT 对于烧录的组件,该命令总是返回 1

    组件发送的顺序如图所示。



  4. 进入 U-Boot 烧录阶段,U-Boot 将按照下列流程完成烧录。
    1. 获取关于升级镜像的基本信息

      一个平台可能支持多个存储介质。升级开始时,平台端首先需要知道本次升级需要烧录的目标存储介质, 这样 U-Boot 才能提前做好相应驱动的初始化。

      此阶段,U-Boot 通过接收和解析名为 image.info 的组件数据,来获取本次升级要烧录的存储介质信息。 下面是交互过程中 SEND_FWC_DATA 的写数据流程:
      aicupg_data_packet_write(data, len);
      |   // arch/arm/mach-artinchip/aicupg/upg_main.c
      |-> cmd = get_current_command();
          |-> CMD_SEND_FWC_DATA_write_input_data();
              |   // arch/arm/mach-artinchip/aicupg/fwc_cmd.c
              |-> ram_fwc_data_write(fwc, buf, len);
                  // arch/arm/mach-artinchip/aicupg/ram_fwc.c
    2. 下载和烧录所有的组件

      主机按顺序发送组件数据,U-Boot 将数据烧录到指定的分区/位置。

      此阶段中,U-Boot 接收组件数据,并且烧录到具体的存储介质。以 NAND 为例,数据接收流程如下:
      aicupg_data_packet_write(data, len);
      |   // arch/arm/mach-artinchip/aicupg/upg_main.c
      |-> cmd = get_current_command();
          |-> CMD_SEND_FWC_DATA_write_input_data();
              |   // arch/arm/mach-artinchip/aicupg/fwc_cmd.c
              |-> nand_fwc_data_write(fwc, buf, len);
                  |   // arch/arm/mach-artinchip/aicupg/nand_fwc.c
                  |-> nand_fwc_mtd_writer(fwc, buf, len);
                      |-> mtd_write(mtd, offs, len, &retlen, buf);

    关于 U-Boot 的具体功能介绍,可查看U-Boot章节。