air640w_rom_design.md 2.3 KB

Air640W 量产固件的格式设计

本文描述的是Air640W固件的一次性刷机所需要的格式

最早的刷机是这样的

  1. 输入FLS文件, 底层固件
  2. 重启后, 通过ymodem协议逐个文件写入lua脚本

设计一款新的格式

外层结构为zip 或 7zip, 具体待定

里层文件有

- rominfo.json               # [必] 固件信息描述文件
- luatos_w600_v0006.bin      # [必] 底层固件文件
- luadb.bin                  # [选] 脚本文件,luadb 2.0格式
- disk.bin                   # [选] 文件系统分区

rominfo.json

内容如下

{
    "type"         : "w600",
    "luadb_offset" : 0x080A0000,
    "luadb_size"   : 64 * 1024, 
    "luaota_offset": 0x080B0000,
    "luaota_size"  : 64 * 1024, 
    "disk_offset"  : 0x080C0000,
    "disk_size"    : 128 * 1024
}
  • type : 固件类型
  • luadb_offset : lua脚本区起始偏移量
  • luadb_size : lua脚本区大小,字节
  • luaota_offset : lua脚本ota区起始偏移量
  • luaota_size : lua脚本ota区大小,字节
  • disk_offset : 文件系统分区起始偏移量
  • disk_size : 文件系统分区大小

Flash 片上文件分布情况

0x08010000 -- RUN PARAM, 256字节, 不可控 0x08010100 -- RUN AREA, 对应 luatos_w600_v0006.bin 0x080A0000 -- LuaDB, 对应luadb.bin 0X080B0000 -- LuaOTA, 默认空白, 大小64kb 0X080C0000 -- FileSystem, 文件系统, 大小128kb 0x080F0000 -- 默认文件系统边界, 也是默认的UserParam区, 48kb, 考虑用上? 0x080FC000 -- 文件系统最远边界

固件合成逻辑

makeimg的时候,按把RUN AREA(当前对应luatos_w600_v0006.bin)写入FLS.

所以, 把luadb/disk等区域, 按偏移量, 逐一附加到luatos_w600_v0006.bin文件末尾, 并在间歇内填充0

就能做出一个很大的RUN AREA, 欺骗secboot进行刷机

效果是:

对外提供的固件包是 压缩包(后缀为.air?), 刷机时, 自动合成FLS文件,进行一体化刷机

验证过程及结论

致命的限制: RUN AREA 的内容不可修改

什么不变呢?

  • 原固件本身
  • 填充的空白
  • LuaDB

OTA, disk 都不能放在 RUN AREA

解决方式:

  • 在代码里声明一个64kb数组,用于量产时填充脚本数据
  • 量产时把luadb的内容填入数据, 变成FLS文件的一部分
  • 切换到刷机模式前, 考虑把flash清空