跳到主要内容

SPI NOR 布局与备份

板载 NOR Flash 共 16 MiB(地址 0x000000–0xFFFFFF),是系统资源:启动加载器、固件和应用都在里面。写之前请先看一眼自己想覆盖的范围里有什么,并先备份。

备份整片 Flash​

进入 FEL 后:

xfel spinor read 0x0 0x1000000 neko-backup.bin
# 或
rfel spinor read 0x0 0x1000000 neko-backup.bin

保存好备份文件和它的 SHA-256,不要覆盖上一次的备份。

恢复:

xfel spinor write 0x0 neko-backup.bin

写完回读校验,再复位。

校验文件​

写入前后都应该核对 SHA-256。

平台命令
Windows PowerShellGet-FileHash -Algorithm SHA256 <文件>
Linuxsha256sum <文件>;对照校验表:sha256sum -c SHA256SUMS
macOSshasum -a 256 <文件>;对照校验表:shasum -a 256 -c SHA256SUMS

常见的布局​

Flash 的划分取决于你装的是哪套软件。同一块板子可以有以下几种布局之一,它们互相不兼容,换用时需要重新写入引导部分。

RustSBI + Asterinas 镜像​

组件NOR 偏移本布局预留载入 RAM 地址
SyterKit0x00000064 KiB0x00020000
设备树0x010000256 KiB0x40f40000
RustSBI0x050000512 KiB0x40f80000
Asterinas0x0d00005 MiB(到 initramfs 之前)0x40000000
initramfs0x5d00001 MiB0x40500000

完整镜像写入 0x000000..0x6d0000;0x6d0000..0x1000000 不会被碰到。详见 RustSBI + Asterinas。

Linux + Buildroot 镜像​

组件NOR 偏移本布局预留载入 RAM 地址
SyterKit0x00000064 KiB0x00020000
设备树0x010000256 KiB0x40f40000
OpenSBI fw_jump0x050000512 KiB0x40f80000
Linux Image0x0d00006 MiB0x40000000
SquashFS 根文件系统0x6d0000到 0xf00000(约 8.2 MiB)从 MTD 挂载
JFFS2 overlay0xf000001 MiB从 MTD 挂载

完整镜像覆盖整片 16 MiB,包括 overlay 分区,所以写入会丢掉板上已经持久化的改动。详见 预编译镜像。

UF2 布局​

内容NOR 偏移
SyterKit 加载器(三份)0x000000 / 0x010000 / 0x020000
已保存的 Flash 采样点参数0x02f000
系统程序头页(UF2 下载器)0x030000
应用头页(Zephyr 应用)0x200000(最大约 0x4CF000 字节)

详见 UF2 拖放烧录。

提示

上面几张表里的区域有重叠(例如都从 0x000000 开始放 SyterKit),不要在同一块 Flash 上混着写。从一种布局换到另一种时,写入新布局的完整引导部分,并用 xfel spinor read 回读确认。

写入前自检清单​

  1. 已经备份整片 Flash,备份文件的 SHA-256 已记录。
  2. 要写的地址范围没有压到你想保留的数据。
  3. 写入后回读并比较 SHA-256,一致后再复位。
  4. 失败(命令报错或校验不一致)时,先解决问题再启动,不要强行复位。