跳到主要内容

SPI NOR 测试

板载 SPI NOR 16MB,接在 SPI0/SPIF(PC0–PC5)。下面的分区表示例来自当前 SDK 默认的 16MB NOR 方案,以实际烧录的镜像为准

验证项通过判据
容量part_infonor 总大小为 0x1000000(16MB)
分区能列出 boot0envenv-redundbootAresUDISK
挂载/res/data 都能 ls 出内容
读写/data 写文件再读回,内容一致
掉电保留重新上电后文件仍在

查看分区

adb shell part_info

默认 16MB NOR 镜像的示例:

blkpart: nor             (nor0    ):bytes 0x1000000         off 0x0
blkpart: boot0 (nor0p1 ):bytes 0xc0000 off 0x0
blkpart: env (nor0p2 ):bytes 0x10000 off 0xc0000
blkpart: env-redund (nor0p3 ):bytes 0x10000 off 0xd0000
blkpart: bootA (nor0p4 ):bytes 0x240000 off 0xe0000
blkpart: res (nor0p5 ):bytes 0x80000 off 0x320000
blkpart: UDISK (nor0p6 ):bytes 0xc60000 off 0x3a0000

各段的含义:

分区大小用途
boot0768KB(含 boot0、boot_param、U-Boot、GPT)引导链,由 packboard/f101s3/yuzukineko/bin/ 的 boot 文件写入
env / env-redund各 64KBU-Boot 环境变量,一份主一份备份,损坏时可用另一份恢复
bootA2304KBRTOS 固件本体(rtos_pkg_nor.fex),boot_partition=bootA 就从这里启动
res512KB资源分区,只读性质,挂载在 /res
UDISK12672KB用户分区,挂载在 /data,可读写

分区大小都在 board/f101s3/yuzukineko/configs/sys_partition_nor.fex 里定义,位置说明见 工程介绍

查看挂载和文件系统

adb shell df
adb shell ls /res
adb shell ls /data
挂载点分区文件系统df 应显示
/resreselmfat略小于分区容量(含文件系统开销)
/dataUDISKlittlefs与分区大小一致或接近

两个挂载点用的是不同的文件系统/reselmfat_mount_spinor() 挂载,/datalittlefs_mount() 挂载。这也是为什么 df 里两个数字的口径不完全一样。

读写验证

先做一次不掉电的读写:

adb shell echo nor-rw-test /data/nor_test.txt
adb shell cat /data/nor_test.txt

板端 echo 的用法是 echo 字符串 文件名,不是 Linux 的 > 重定向。读回来的内容和写入的一致即通过。

再做掉电保留验证:拔掉 Type-C 或断电,重新上电,再读一次

adb shell cat /data/nor_test.txt

内容还在,说明 NOR 用户分区可读写且掉电保留。

想直接对 NOR 做读写校验,固件里有一个专门命令:

adb shell help | grep -i spinor
adb shell spinor_rwcheck
命令名以设备为准

命令是随固件裁剪的,不同配置下注册的命令不一样。先用 adb shell help 看当前固件实际有哪些命令,再执行。

环境变量

adb shell fw_printenv

默认镜像里常见的项:

boot_partition=bootA
ota_result=success
bootcmd=sunxi_flash read 0x40800000 ${boot_partition}; boot_rtos 0x40800000 0x40010000

boot_partition=bootA 表示从 RTOS 分区启动。具体键值以 adb shell fw_printenv 的输出为准,默认来自 board/f101s3/yuzukineko/configs/env_nor.cfg

不要随意擦除

part_erase 会把分区内容擦掉。env 有备份分区,但 bootAboot0 擦掉之后板子就起不来了,需要重新进 FEL 烧录才能恢复。要验证读写,用上面的 /data 文件测试或 spinor_rwcheck,不要用擦除。

出问题怎么查

现象可能原因处理
part_info 列不出分区固件不对或 flash 初始化失败确认烧的是 YuzukiNeko 的 16MB NOR 镜像;df 看是否挂载成功
/data 写不进去空间满或挂载失败adb shell df 看剩余空间
掉电后文件丢了写到了非持久化路径确认写在 /data 下,而不是 /tmp 之类
NOR 读写校验失败硬件或供电问题换 USB 口/线保证供电稳定,重试