Remix Mini PC 是个 2015 年的 Android 小主机,Allwinner 的芯片,官方固件早就被 abandoned 了。我的目标很简单:刷上 Armbian,让它在内部 eMMC 上永久运行。这个目标卡了我一年多。

问题很诡异。SD 卡启动的 Linux 工作正常,但内部 eMMC 完全读不出来。内核能识别芯片——CID、CSD、14.6 GiB 容量、型号 AGND3R 都能读到——可一旦请求实际数据,总线就崩溃。日志里全是 data errorcache flush error -110recovery failed

打开网易新闻 查看精彩图片

这一年我试了所有能想到的 theory:写保护位、NAND 黑名单、硬件复位 quirks、Android 留下的 lockout 状态。全部落空。

我甚至在设备树二进制文件里打补丁,用 fdtput 现场修改,用 dtc 反编译再编译。测试了信号速率、时序、各种兼容性标志。失败模式从未改变——这是我最该早读出来的线索:如果信号层的调整完全无效,问题就不在信号层。

转机来自一次搜索。Remix Mini PC 其实被 mainline Linux 支持了,设备树文件叫 sun50i-h64-remix-mini-pc.dts,ARM 的 Andre Przywara 贡献的,对应的 U-Boot patch 2024 年 4 月才合入主线。

我把官方 Remix DTS 和我一直在用的 BananaPi-M64 DTS 并排放在一起。eMMC 区块的差异直接跳到我脸上:

BananaPi-M64 只声明了 vmmc-supply,这是给 eMMC 芯片本身供电的 3.3V 稳压器。但它完全没有 vqmmc-supply——这是驱动 CLK、CMD 和 DAT0-7 信号线的 I/O 电压稳压器

eMMC 有两个电压域。Vcc(vmmc 轨)给芯片内部逻辑供电。VccQ(vqmmc 轨)是 I/O 电压。Remix 的 PCB 上,这个轨被接到了另一个稳压器 eldo1,输出 1.8V。内核不知道这件事,就没去配置这个稳压器,信号线根本没有正确的 I/O 电压,总线当然崩溃。

加上这一行,eMMC 立刻活了。一年多的 brick wall,原因是一根缺失的电压线

这个项目的教训很具体:当你在一个硬件问题上消耗了过多时间,却没有任何进展,很可能说明你问错了问题。信号层的参数调了几十种组合都没用,就该意识到这不是信号问题。但我花了太久才接受这个暗示。

另一个教训是设备树的重要性被低估了。它不是"配置",它是硬件和内核之间的契约。漏掉一个稳压器声明,硬件就沉默。这种沉默没有错误码能直接告诉你"某稳压器未启用",只有模糊的 I/O 超时。

Remix Mini PC 现在跑 Armbian 很稳。这个项目拖了一年,最后只改了一行。但这一行背后,是对 eMMC 电气规范的完整理解,以及对"为什么主线内核能工作"的追问。