跳到主要内容

100ASK T113S3 Pro 主线 U-Boot 适配

本章目标

使 U-Boot 2026.07 在同一套板级配置下完成两种工作:

  1. FEL 安装阶段由 SPL 初始化 128 MiB DDR3并安全返回 BootROM FEL;
  2. 冷启动阶段由 BootROM 从 SPI NAND 读取 SPL,再由 SPL 加载 U-Boot proper。

输入文件

文件作用
uboot.fragmentMTD、SPI NAND、UART、环境和启动命令
0001-*.patch为 sunxi SPL 增加 W25N02 SPI NAND page-to-cache 读取
0002-*.patch增加专用板级 defconfig 和 U-Boot DTS
0003-*.patch修正 R528 FEL 返回时的时钟和上下文恢复
0004-*.patch将 R528 BootROM 的 boot media 4 识别为 SPI NAND
verify-mainline-uboot.py校验 SPL/proper 是否来自同一次正确构建

适配步骤

1. 建立专用板级身份

U-Boot defconfig 必须使用:

CONFIG_DEFAULT_DEVICE_TREE="allwinner/sun8i-t113s-dshanpi-t113s3pro"
CONFIG_MACH_SUN8I_R528=y
CONFIG_DRAM_CLK=792
CONFIG_SUNXI_MINIMUM_DRAM_MB=128
CONFIG_CONS_INDEX=4

不能复用 MangoPi 的设备树身份。CONFIG_CONS_INDEX=4 对应 UART3;曾有一次补丁 hunk 行数错误导致这一行未应用,产物虽然通过静态哈希检查,但硬件上没有安装器串口标志。

2. 固定 SPL SRAM 栈

CONFIG_SPL_STACK=0x37ff0

该位置避开 R528 FEL SRAM 交换和返回 thunk 区域。更改 SPL 链接布局后,必须重新审计 OpenixCLI 的 SRAM 地址和 SPL 最大长度。

3. 保留 FEL 使用的 PLL

BootROM 处理 FEL USB 时已经启用 PLL_PERI0/PLL6。SPL 在返回 BootROM 前若无条件重写该 PLL,USB 可能失去稳定时钟。

0003 补丁仅在 PLL 未启用时写入默认值;FEL 场景保留 BootROM 状态,冷启动仍执行正常时钟初始化。

4. 使用标准 FEL 返回语义

返回序列恢复 BootROM 保存的 SP、LR、CPSR、SCTLR 和 VBAR,并在关键位置增加 DSB/ISB。诊断配置会输出:

FEL return: sp=........ lr=........ cpsr=........ sctlr=........ vbar=........

历史上测试过直接跳转 BootROM 0x20,结果同样出现 USB 读取失败,已废弃。正式路径只使用受审计的 R528 SRAM swap/return thunk。

5. 增加 SPI NAND SPL 读取

W25N02 不能使用 SPI NOR 的线性读语义。SPL 需要执行:

PAGE DATA READ (13h)
-> 轮询 status C0h busy 位
-> READ FROM CACHE (03h)

该能力由 CONFIG_SPL_SPI_NAND_SUNXI 单板选择,不改变其他 R528/T113 板卡的 SPI NOR 行为。

6. 识别冷启动介质

R528 BootROM 从 SPI NAND 启动时报告 boot media 4。0004 补丁把该值映射到 sunxi SPI loader,否则 SPL 会停在:

Unknown boot source 4

7. 固定 U-Boot 环境和启动命令

CONFIG_ENV_IS_NOWHERE=y
CONFIG_BOOTCOMMAND="if test -n ${fel_booted}; then ...; else mtd read boot 0x44000000; bootm 0x44000000; fi"

板卡不从不存在的 FAT/MMC/SPI 环境读取变量,避免在 Loading Environment 阶段反复复位。

8. U-Boot proper 使用单线 SPI 读取

验证中发现 U-Boot proper 强制 quad width 时从 NAND 读到全 ff。因此 U-Boot 专用 DTS 不设置 spi-rx-bus-widthspi-tx-bus-width;Linux 使用独立 DTS,可以在 SPI NAND core 就绪后保持已验证的 quad 配置。

编译验证

完整构建后执行:

python3 board/dshanpi/t113s3pro/verify-mainline-uboot.py \
--spl out/mainline/t113s3pro/build/uboot-2026.07/spl/sunxi-spl.bin \
--uboot-bin out/mainline/t113s3pro/build/uboot-2026.07/u-boot.bin \
--uboot-img out/mainline/t113s3pro/build/uboot-2026.07/u-boot.img \
--uboot-elf out/mainline/t113s3pro/build/uboot-2026.07/u-boot \
--version 2026.07 \
--board allwinner/sun8i-t113s-dshanpi-t113s3pro

校验器会拒绝:

  • eGON.BT0 的 SPL;
  • eGON 长度或加法校验错误;
  • 错误设备树身份;
  • SPL 和 proper 构建时间不一致;
  • legacy uImage CRC 错误;
  • load/entry/ELF entry 不一致;
  • Android boot image 配置;
  • 不包含 FEL installer 分支的启动命令。

预期输出

Verified mainline U-Boot 2026.07 same-build pair
SPL: eGON.BT0, 24576 bytes, board=allwinner/sun8i-t113s-dshanpi-t113s3pro
proper: ... bytes, load/entry=0x42e00000

阶段验收

RAM/FEL 阶段

U-Boot SPL 2026.07
DRAM: 128 MiB
Trying to boot from FEL
FEL return: ...

随后 OpenixCLI 必须读到 eGON.FEL 返回标志,不能仅凭串口打印判定成功。

冷启动阶段

Trying to boot from sunxi SPI
U-Boot 2026.07 ... DshanPi T113S3 Pro

失败处理与回滚

现象优先检查
无 SPL 输出UART3 接线、CONFIG_CONS_INDEX=4、eGON 头
DRAM 容量错误DDR 时序、板卡版本、供电
SPL 返回后 USB 消失SRAM overlap、PLL 保留、物理 USB 绑定
Unknown boot source 40004 补丁是否应用
Loading Environment 复位ENV_IS_NOWHERE 和禁用的环境后端
U-Boot 读到全 ffU-Boot DTS 是否强制 quad width

本阶段的 RAM 测试不写 NAND。若冷启动失败,通过 FEL 进入 RAM 安装/恢复环境,不要使用未经验证的 SPL 覆盖启动区。