调整 NAND 分区

W25N01 容量为 128MiB,擦除块为 128KiB。分区边界应按 0x20000 对齐。

默认布局

区域 起始偏移 大小 结束位置
U-Boot 0x000000 0x100000 0x100000
Linux DTB 0x100000 0x020000 0x120000
Linux kernel 0x120000 0x600000 0x720000
UBI rootfs 0x720000 0x78e0000 0x8000000

必须同步的四处配置

U-Boot 启动参数

文件:

uboot/configs/strongpi_v3s_nandflash_defconfig

修改 CONFIG_BOOTARGS 中的 mtdparts,并修改 CONFIG_BOOTCOMMAND 中 DTB、内核的读取偏移和长度。

Linux 设备树

文件:

kernel/arch/arm/boot/dts/sun8i-v3s-strongpi-spinand.dts

修改 spi-nand@0/partitions 下各分区的 reg

烧录命令

设备树、内核和 ubi.imgxfel spinand write 偏移必须与新布局一致。

UBIFS/UBI 参数

根文件系统容量改变后,重新计算:

  • mkfs.ubifs -c 最大 LEB 数
  • ubinize.cfg 中的 vol_size

检查镜像大小

当前 U-Boot 只读取 0x600000 字节内核和 0x4000 字节 DTB:

stat -c '%n %s bytes' \
  ~/v3s-workspace/kernel/arch/arm/boot/zImage \
  ~/v3s-workspace/kernel/arch/arm/boot/dts/sun8i-v3s-strongpi-spinand.dtb

必须满足:

zImage <= 0x600000
DTB    <= 0x4000

DTB 分区虽然有 0x20000,但读取长度仍由 U-Boot mtd read 命令决定。镜像超过读取长度时,单纯扩大分区不会生效。

修改顺序

  1. 先设计新布局并完成对齐计算。
  2. 修改 U-Boot 配置和 Linux DTS。
  3. 重新编译 U-Boot、内核和 DTB。
  4. 根据新 rootfs 容量重新生成 UBI。
  5. 检查所有镜像尺寸和写入偏移。
  6. 全片擦除 NAND 后重新烧录。

分区变更后不应保留旧 UBI 数据,否则旧擦除块内容可能导致挂载异常。