关于RK35xx系列机型混刷不同作者固件可能出现的问题

jjm2473】 在 https://github.com/istoreos/istoreos/issues/1012 发布:
RK35xx 系列同时带 eMMC 和 SD/TF卡 的机型,包括:

  • 友善 R5S/R5C,R6S/R6C
  • 恒领 H66K/H68K/H69K,H88K
  • 莱因特 T68M

等,在混刷不同作者固件的情况下,可能出现无法启动,型号识别错误,网口错乱(LAN口和WAN口调换,或缺少网口),无法联网,NPU/GPU报错 等问题,特定条件下还可能损坏硬件。

PS:R4SE 可能也有这个问题。

什么是“混刷不同作者固件”?

也就是 eMMC 和 SD/TF 卡分别刷了不同作者的固件,例如 eMMC 里面刷了 lean 的 lede 固件,SD/TF 卡刷了 iStoreOS,或者反过来。

为什么“混刷不同作者固件”会导致问题?

因为 RK35xx 有多种不同的 uboot,不同的 uboot 支持的功能不一样,且同一个 uboot 也可能有不同编译配置。

RK35xx 至少支持这两种 uboot:1. RK 厂家提供的 uboot,2. 上游 uboot(也就是 uboot 官方的,可能会加些补丁)。RK 的 uboot 又有不同的配置,例如是否使用 Android 闪存布局,是否支持 ADC 命令,是否提前打开 NPU 电源,是否初始化 GMAC 等。

iStoreOS 的 RK35xx 机型使用的的是 RK 的 uboot,配置了不使用 Android 闪存布局,需要读取 ADC 的值判断机型,需要提前打开 NPU 电源,需要初始化 GMAC。

RK35xx 系列机型启动时会优先加载 eMMC 的 uboot,然后 uboot 又是优先加载 SD/TF 卡里的固件(为了实现插上 SD/TF 卡就启动里面的系统,拔掉 SD/TF 卡就启动 eMMC 的系统),这种混乱的逻辑导致了 uboot 跟固件系统不一致的情况。
例子1: R5C 是跟 R5S 共用同一个固件的,需要通过 ADC 的值来加载不同机型的配置。假设 R5C 的 eMMC 刷了 lede,SD/TF 卡刷了 iStoreOS,机器启动时加载的是 eMMC 的 uboot,然后启动 SD/TF 卡的 iStoreOS,iStoreOS 在判断机型的时候使用 ADC 命令,由于 lede 的 uboot 不支持 ADC 命令,那么 iStoreOS 就会加载默认机型 R5S 的配置启动,启动以后可能机型显示错误,网口错乱等。
例子2: R5S 的 eMMC 刷了 iStoreOS,SD/TF 卡刷了友善官方的 FriendlyWrt,由于 FriendlyWrt 固件使用的是 Android 闪存布局,iStoreOS 的 uboot 不支持 Android 闪存布局,可能导致无法启动。

如何清掉 eMMC 或者 SD/TF 卡的固件(包括 uboot)?

只是删除分区不能清掉 uboot,要清掉 uboot 就要把存储器的前面 16MB 擦除。对于 RK35xx 机型,在启动到 iStoreOS 的情况下:

  • 如果要清掉 eMMC 里的固件,执行 dd if=/dev/zero of=/dev/mmcblk2 bs=4096 count=4096 conv=notrunc
  • 如果要清掉 SD/TF 卡里的固件,执行 dd if=/dev/zero of=/dev/mmcblk0 bs=4096 count=4096 conv=notrunc