admin 管理员组文章数量: 887007
W800
目录
内置SRAM 简介
内置QFLASH
W800_ROM功能简述
启动配置
ROM流程
IMAGE header 字段定义
IMAGE header 字段描述:
IMAGE Attribute 字段定义
IMAGE Attribute 字段描述
ROM升级步骤简述
ROM操作指令
ROM错误码
TIPS1:.什么是XIP
TIPS2:.Xmodem 协议
引自官方
WM_W800_寄存器手册v2.1
WM_W800_ROM功能简述_V1.0
内置SRAM 简介
W800内置288KB SRAM。其中160KB挂载一级AHB总线上,128KB 挂载在二级AHB总线上。CPU等一级总线设备可以访问所有内存区域,但是二级总线上的设备只能访问二级总线上128KB的内存。
分布如下:
内存块 | 功能 | 起始地址 | 终止地址 | 大小 | 说明 |
160Kbyte | Stack&Heap | 0x20000000 | 0x20003FFF | 16Kbyte | ROM 使用 |
NC | 0x20004000 | 0x20027FFF | 144Kbyte | NC | |
128Kbyte | NC | 0x20028000 | 0x20047FFF | 128Kbyte | NC |
内置QFLASH
W800内部集成2MBytes QFlash。通过芯片内部集成32KB cache实现XIP方式在QFlash上执行程序。程序运行过程中,CPU首先从Cache 中读取指令,当不能获取指令时,以 8Bytes一行的方式从QFlash读取指令,存入Cache 内。因此,当持续运行代码大小小于32K时,CPU将无需从QFlash读取指令,此时CPU可以运行在更高的频率。上述方式为读取指令操作方式,整个Image 的RO段都会以这种方式操作。此过程用户无需干预。
W800 支持四地址模式,最大支持 128MB Flash,但是,ROM 程序仅支持三地址模式,最大支持 16MB 地址访问。
ROM 视角的 QFLASH 布局:
W800_ROM功能简述
启动配置
W800芯片上电后,CPU会启动执行ROM中的固件,加载Flash中指定地址的用户 lmage。
ROM固件在开始运行时会读取BootMode(PAO)引脚,根据引脚的信号判断进入启动状态:
通常,BootMode引脚应该用于生产或者调试阶段。在生产阶段,用户通过将BootMode引脚持续拉低30ms 以上,进入功能模式,可以快速进行烧录Flash工作。
在产品返工或者维修的场景中,在芯片未进入“最高安全等级”(关于安全等级的描述请参考
《WM_W800_ROM功能简述》)时,可以通过该引脚进入功能模式,擦除旧的Image写入新的lmage。
在调试阶段,无论固件出现任何故障,都可以通过将BootMode引脚持续拉低30ms以上,进入串口下载功能,烧录新的固件。
ROM流程
1.1 QFLASH 自检,完成 QFLASH 工作状态检查
1.2 模式切换,ROM 启动后,QFLASH 默认是 1 线模式。要使得程序能够运行于 QFLASH,ROM 需要把 QFLASH 切换到 4 线模式。
1.3 IMAGE 校验,完成 IMAGE 头校验和 IMAGE 内容校验
1.4 向量表重定向,W800 的程序最终是要运行在 QFLASH 里(代码的运行基址:0x8000000),因此需要对向量表进行重定向。
重定向地址规则:(异常向量+中断)总共是 64 个 word,根据 VBR 寄存器的要求,向量表地址必须是 0x400 的整数倍。
第2阶段:升级程序
利用 Xmodem 协议实现把 IMAGE 升级到 QFLASH 或内存区域,升级到内存区域的Image 在升级完成后即跳转到内存执行,升级的 FLASH 的需要重启后跳转执行。
升级 IMAGE 格式在SDK中也能找到,
详见:.\W80X_SDK_v1.00.10\include\platform\wm_fwup.h:
IMAGE header 字段定义
typedef struct IMAGE_HEADER_PARAM{
unsigned int magic_no;
Img_Attr_Type img_attr;
unsigned int img_addr;
unsigned int img_len;
unsigned int img_header_addr;
unsigned int upgrade_img_addr;
unsigned int org_checksum;
unsigned int upd_no;
unsigned char ver[16];
unsigned int _reserved0;
unsigned int _reserved1;
struct IMAGE_HEADER_PARAM *next;
unsigned int hd_checksum;
}IMAGE_HEADER_PARAM_ST;
IMAGE header 字段描述:
字段 | 描述 |
magic_no | 魔术字,固定值 0xA0FFFF9F |
img_attr | Img_Attr_Type,IMAGE Attribute |
img_addr | Image area 在 flash 中的位置,运行位置 |
img_len | Image area 的字节数长度 |
img_header_addr | IMAGE header 在 flash 中的位置 |
upgrade_img_addr | 升级区地址,升级 IMAGE header 在 flash 中存放位置 |
org_checksum | Image area 的 crc32 结果 |
upd_no | 升级版本号,值较大的表示版本较新;当版本号为 0xFFFFFFFF 时,可升级任意版本号固件 |
ver | Image 版本号,字符串 |
next | 下一个 image header 在 flash 中的位置 |
hd_checksum | Image header 的以上字段的 crc32 的值 |
IMAGE Attribute 字段定义
typedef union {
struct {
uint32_t img_type: 4; /*!< bit: 0.. 3 IMAGE_TYPE_ENUM */
uint32_t code_encrypt:1; /*!< bit: 4 whether the code in flash encrypted */
uint32_t prikey_sel:3; /*!< bit: 5.. 7 private key selection */
uint32_t signature:1; /*!< bit: 8 whether signature flag, only indicates if img contains 128bytes signature in the end*/
uint32_t _reserved1: 7; /*!< bit: 9.. 15 Reserved */
uint32_t zip_type: 1; /*!< bit: 16 zip_type bit */
uint32_t psram_io: 1; /*!< bit: 17 psram_io bit */
uint32_t erase_block_en: 1; /*!< bit: 18 flash erase block enable bit */
uint32_t erase_always: 1; /*!< bit: 19 flash erase always bit */
uint32_t _reserved2: 12; /*!< bit: 20..31 Reserved */
} b; /*!< Structure Access by bit */
uint32_t w; /*!< Type Access by whole register */
} Img_Attr_Type;
IMAGE Attribute 字段描述
字段 | Bit | 描述 | ||||
img_type | 4 | 0x0:SECBOOT; 0xE:ft 测试程序;其它值:用户自定义 | ||||
code_encrypt | 1 | 0:固件明文存储;1:固件由客户加密后存储 | ||||
pricey_sel | 3 | 芯片内置 8 组 RSA 私钥用于解密固件加密的秘钥,用户可任选 一组使用,取值范围 0~7 | ||||
signature | 1 | 0:IMAGE 不包含签名部分;1:IMAGE 包含 128bytes 签名 | ||||
zip_type | 1 | 0:不压缩;1:image area 部分为压缩档 | ||||
Reserved | 1 | 当前未使用 | ||||
erase_block_en | 1 | 0:不支持 64KB Block 擦除;1:支持 Block 擦除 | ||||
erase_always | 1 | 0:Sector 或 Block 擦除前检查 flash 是否全 F,全 F 的Sector 或 Block 不进行擦除操作;1:始终先擦后写 | ||||
ROM升级步骤简述
ROM 程序根据 upgrade_area_addr 参数,判断第一个 header 的 img_type 是否为 sec boot,如果是,在校验 header 和 img 的 crc 和签名,比较版本号,如果校验通过并且版本更新,则将 header 搬到 img_header_addr 的地址,将 img 和 signature 搬到 img_addr 的地址。
ROM 程序根据 img_header_addr 参数,找到 SECBOOT 程序的 img header,校验img header 和 img 的 crc 和签名成功后,跳转 img_addr 执行 SECBOOT。
SECBOOT 程序根据 upgrade_area_addr 参数,依次遍历 header,直至 img_type是 img 的 header,然后类似 ROM 程序,搬运 header 到 next_img_addr 的地址,搬运 img 和 signature 到img_addr 的地址。
升级区可以支持包含 SECBOOT 在内的多个 img 升级,仅需要将待升级程序首尾相接放在 upgrade_area_addr 的地址即可。
对 于 header 中 zip_type=1 的 img , img 部 分 是 将 原 始 img 的header+img+signature 三部分压缩后的结果,搬运前先解压。SECBOOT 不支持压缩。
ROM操作指令
W800 的ROM 程序支持模块生产阶段的部分操作:波特率切换,QFLASH ID 和容量获取,获取 ROM 版本,系统重启等。
命令列表:
功能 | 子命令 (SubCmd) | 数据内容 ( Data Segment) | 说明 |
波特率切换 | 0x31 | ≤2000000 | 波特率最大支持到 2M 设置大于 2M,报 S(命令参数错) |
QFlash 擦除 | 0x32 | 4bytes | struct{ uint16_t index; uint16_t count; }; 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 |
常用命令
波特率变更:
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 | SECBOOT 头校验错 |
M | SECBOOT 校验错 |
Y | 解密读 SECBOOT 失败 |
Z | 签名验证失败 |
功能模块 | |
R | 命令校验错 |
S | 命令参数错 |
T | 获取 FT 参数失败(Mac 和Gain 等) |
U | 设置增益失败 |
V | 设置 MAC 失败 |
TIPS1:.什么是XIP
原文链接:
XIP(eXecute In Place)
eXecute In Place,即芯片内执行、就地执行,是指CPU直接从存储器中读取程序代码执行,而不用再读到内存中。应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。
flash内执行是指nor flash不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM。好处即是程序代码无需占用内存,减少内存的要求。
XIP是复杂性和速度的权衡,而这就意味着XIP通常仅用于Bios或RAM极度短缺的情况。
TIPS2:.Xmodem 协议
摘自:百度百科
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。
如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可的策略将导致低性能,特别是具有很长传播延迟的卫星连接的情况时,问题更加严重。
使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。ZMODEM是最有效的一个XMODEM版本,它不需要对每个块都进行认可。事实上,它只是简单地要求对损坏的块进行重发。ZMODEM对按块收费的分组交换网络是非常有用的。不需要认可回送分组在很大程度上减少了通信量。
YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
Xmodem 协议 [ 2006-3-4 16:32:37 | Author: job ]
/*
XMODEM transfer protocol
-----------------------------------------
author: christensen
2004-3-25 10:08
noted: Job Nelson
*/
本文标签: W800
版权声明:本文标题:W800 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732352625h1533517.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论