镜像烧录
本章节主要描述 ArtInChip 平台上支持的镜像升级和烧录方式。
1. AICUPG 烧录
Artinchip 平台支持通过 USB 进行裸机烧录的功能。通常情况下,该功能在 BROM 阶段通过检测特定按键的方式,或者启动失败时进入。
完整的升级过程分为两个阶段:
-
BROM 阶段
仅支持下载数据和组件到 SRAM/DRAM,以及执行下载的组件。不支持烧录组件到存储介质。
-
U-Boot 阶段
支持从主机端下载数据和组件,并且支持将组件烧录到指定的存储介质。
目前的实现流程是先下载 SPL 组件到 SRAM 并执行,对 DRAM 进行初始化;然后下载 U-Boot 到 DRAM 并执行,进入 U-Boot AICUPG 升级模式。
1.1. 基本协议
AICUPG 镜像升级和烧录功能使用自定义的通信协议,该通信协议基于 USB Bulk 传输进行了自定义 扩展。
从协议层次架构上看,通信协议分为两层,分别为:
- 传输层
- 应用层

图 3.6 通信协议:主机发送

图 3.7 通信协议:主机接收
USB Bulk 传输协议仅定义了 Bulk 传输的基本行为和数据格式,其他具体应用协议可以在其基础之上进行扩展。
AICUPG 的传输层对 USB Bulk 的 CBW(Command Block Wrapper) 中自定义的命令数据块(Command Block) 部分进行了扩展定义,实现了WRITE/READ 两个基本操作命令。具体如 表 3.18 中 bCommand 所示。WRITE 操作用于主机发送数据包,READ 操作用于主机读取数据包。 每个数据包的最大长度为 4KB。
表 3.18 CBW 扩展定义
| 域 | 字节 | 说明 |
|---|---|---|
| dCBWSignature | 0 ~ 3 | 魔数,标识 CBW 数据包,值为 “USBC” |
| dCBWTag | 4 ~ 7 | CBW 包的编号 |
| dCBWDataTransferLength | 8 ~ 11 | CBW 之后紧跟的传输数据长度 |
| bmCBWFlags | 12 | 0x00:数据传输方向为主机到设备0x80:数据传输方向为设备到主机 |
| bCBWLUN | 13 | 没有使用,可忽略 |
| bCBWCBLength | 14 | CBW 命令块有效 长度,这里固定为 0x01 |
| bCommand | 15 | 0x01: WRITE 表示写操作0x02: READ 表示读操作 |
| Reserved | 16 ~ 30 |
AICUPG 应用层协议中,对 CMD HEADER 和 RESP HEADER 定义如下表所示。
| 域 | 字节 | 说明 |
|---|---|---|
| dMagic | 0 ~ 3 | 魔数,值为 “UPGC” |
| bProtocol | 4 | 自定义协议类型0x01: USB 升级协议 |
| bVersion | 5 | 自定义协议的版本0x01: Version 1 |
| bCommand | 6 | 命令控制字 |
| Reserved | 7 | |
| dDataLength | 8 ~ 11 | CMD HEADER 之后传输给设备的数据长度 |
| dCheckSum | 12 ~ 15 | CMD HEADER 前 12 字节 32-bit Checksum |
| 域 | 字节 | 说明 |
|---|---|---|
| dMagic | 0 ~ 3 | 魔数,值为 “UPGR” |
| bProtocol | 4 | 自定义协议类型0x01: USB 升级协议 |
| bVersion | 5 | 自定义协议的版本0x01: Version 1 |
| bRespCommand | 6 | 所响应的命令 |
| bStatus | 7 | 命令执行状态0x00: OK0x01: Failed |
| dDataLength | 8 ~ 11 | RESP HEADER 之后传输的数据长度 |
| dCheckSum | 12 ~ 15 | RESP HEADER 前 12 字节 32-bit Checksum |
应用层协议定义了下列用于镜像升级的命令。
| 命令 | 值 | 说明 |
|---|---|---|
| GET_HWINFO | 0x00 | 获取硬件相关信息 |
| SET_FWC_META | 0x10 | 发送组件(Firmware Component)的描述信息 |
| GET_BLOCK_SIZE | 0x11 | 获取传输的数据块大小, 发送的有效数据须以该块大小为单位 |
| SEND_FWC_DATA | 0x12 | 发送组件数据 |
| GET_FWC_CRC | 0x13 | 获取设备端对所接收数据计算的CRC值, 以确认传输是否出错 |
| GET_FWC_BURN_RESULT | 0x14 | 获取组件烧录后,设备端的校验结果 |
| GET_FWC_RUN_RESULT | 0x15 | 获取组件在运行之后的返回结果 |
1.2. Gadget 实现

图 3.8 Gadget 实现框架图
USB 升级过程中,平台端是一个 USB 设备,因此在 U-Boot 中需要实现对应的 Gadget, 在 Gadget 中实现对相应的 USB 命令进行处理。
U-Boot 的 USB 驱动框架支持实现自定义的 Gadget 设备,只需按照框架定义的方式实现相应函数, 并且提供相应的描述符信息即可。Gadget 实现的源码在:
drivers/usb/gadget/f_aicupgusb.c
Gadget 设备通过下面的宏进行 Declare:
DECLARE_GADGET_BIND_CALLBACK(usb_dnl_aicupg, aicupg_add);