ROM
引言
概述
本文档对 ROM 功能及使用说明进行简单描述,供开发者和设计者理解 ROM 功能。
术语定义
术语 |
定义 |
CRC |
Cyclic Redundancy Check |
IMAGE |
Binary File |
MAC |
Medium Access Control |
QFLASH |
Quad-SPI Flash |
RAM |
Read-Write Memory |
ROM |
Read-Only Memory |
UART |
Universal asynchronous receiver-transmitter |
文献索引
ROM 基本功能
ROM 流程图

图 2-1
引导程序
QFLASH 自检
完成 QFLASH 工作状态检查
QFLASH 模式切换
ROM 启动后,QFLASH 默认是 1 线模式。要使得程序能够运行于 QFLASH,ROM 需要把 QFLASH 切换到 4 线模式。
IMAGE 校验
完成 IMAGE 头校验和 IMAGE 内容校验
向量表重定向
重定向地址规则:(异常向量+中断)总共是 64 个 word,根据 VBR 寄存器的要求,向量表地址必须是 0x400 的整数倍。
升级程序
利用 Xmodem 协议实现把 IMAGE 升级到 QFLASH 或内存区域,升级到内存区域的 Image 在升级完成后即跳转到内存执行,升级的 FLASH 的需要重启后跳转执行。
升级 IMAGE 格式:

图 2-2
ROM 程序根据 upgrade_area_addr 参数,判断第一个 header 的 img_type 是否为 sec boot,如果是,在校验 header 和 img 的 crc 和签名,比较版本号,如果校验通过并且版本更新,则将 header 搬到 img_header_addr 的地址,将 img 和 signature 搬到 img_addr 的地址。
ROM 程序根据 img_header_addr 参数,找到 bootloader 程序的 img header,校验 img header 和 img 的 crc 和签名成功后,跳转 img_addr 执行 bootloader。
bootloader 程序根据 upgrade_area_addr 参数,依次遍历 header,直至 img_type 是 img 的 header,然后类似 ROM 程序,搬运 header 到 next_img_addr 的地址,搬运 img 和 signature 到 img_addr 的地址。
升级区可以支持包含 bootloader 在内的多个 img 升级,仅需要将待升级程序首尾相接放在 upgrade_area_addr 的地址即可。
对于 header 中 zip_type=1 的 img , img 部分是将原始 img 的 header+img+signature 三部分压缩后的结果,搬运前先解压。bootloader 不支持压缩。
OTP 参数区
测试程序
操作指令
命令列表
功能 |
子命令(SubCmd) |
数据内容(Data Segment) |
说明 |
波特率切换 |
0x31 |
≤2000000 |
波特率最大支持到 2M 设置大于 2M,报 S(命令参数错) |
QFlash 擦除 |
0x32 |
4bytes |
struct {
}; index:起始位置(index 最高 bit 为 1 表示 Block 擦除,为 0 表示 Sector 擦除) count:擦除块数 |
设置 BT MAC 地址 |
0x33 |
6bytes~8bytes |
|
获取 BT MAC 地址 |
0x34 |
无 |
|
设置 GAIN 参数 |
0x35 |
84bytes |
Wi-Fi 发射时使用的增益参数( |
获取 GAIN 参数 |
0x36 |
无 |
读取设置长度的 Gain 值。 |
设置 MAC 地址 |
0x37 |
6bytes~8bytes |
|
获取 MAC 地址 |
0x38 |
无 |
|
获取上一个错误 |
0x3B |
无 |
获取上一个错误信息,直到下一个操作清除。 |
获取 QFLASH ID 和容量 |
0x3C |
无 |
例如 GD 32MB 返回:FID:C8,19 PUYA 8MB 返回:FID:85,17 |
获取 ROM 版本 |
0x3E |
无 |
|
系统重启 |
0x3F |
无 |
常用指令集合
波特率变更:
2M 设置指令: 21 0a 00 ef 2a 31 00 00 00 80 84 1e 00
1M 设置指令: 21 0a 00 5e 3d 31 00 00 00 40 42 0f 00
921600 设置指令: 21 0a 00 5d 50 31 00 00 00 00 10 0e 00
460800 设置指令: 21 0a 00 07 00 31 00 00 00 00 08 07 00
115200 设置指令: 21 0a 00 97 4b 31 00 00 00 00 c2 01 00
BT MAC 地址获取: 21 06 00 D8 62 34 00 00 00
WiFi MAC 地址获取: 21 06 00 ea 2d 38 00 00 00
获取上一个错误: 21 06 00 36 B6 3B 00 00 00
QFLASH ID 和容量获取: 21 06 00 1b e7 3c 00 00 00
获取 ROM 版本: 21 06 00 73 0a 3e 00 00 00
系统重启: 21 06 00 c7 7c 3f 00 00 00
QFlash 擦除(1M): 21 0a 00 e2 25 32 00 00 00 02 00 fe 00
QFlash 擦除(2M): 21 0a 00 c3 35 32 00 00 00 02 00 fe 01
ROM 的错误码
ROM 启动过程中,如果遇到异常,则会进入 ROM 右侧死循环程序,然后打印一个错误码,指示当前遇到的错误信息,供使用者分析遇到的问题。
错误码定义如下:
错误码 |
说明 |
---|---|
C |
正常 |
升级过程(XMODEM 协议) |
|
D |
主机取消 |
F |
超时没有收到数据 |
G |
包序号错 |
I |
IMAGE 过大 |
J |
IMAGE 烧录地址不合法 |
K |
IMAGE 烧录地址页不对齐 |
L |
IMAGE 头校验错误 |
M |
IMAGE 内容校验错 |
P |
IMAGE 内容不完整或者签名缺失 |
启动过程 |
|
N |
FLASH ID 自检失败 |
Q |
固件类型错误 |
L |
bootloader 头校验错 |
M |
bootloader 校验错 |
Y |
解密读 bootloader 失败 |
Z |
签名验证失败 |
功能模块 |
|
R |
命令校验错 |
S |
命令参数错 |
T |
获取 FT 参数失败(Mac 和 Gain 等) |
U |
设置增益失败 |
V |
设置 MAC 失败 |