👁 1260

背景
网友发了一块 RK3568B2 的板子(FastRhino R68S 电犀牛,4 网口:2×1G + 2×2.5G)只是刷过飞牛后刷回istore OS的 固件后坏了 ,还有一块OEC,发前问它是否刷错oec的否认只是说刷的飞牛,因为能刷飞牛后正常使用的话肯定也知道需要改dtb,按理说回来他不应该不知道这问题就没多想,结果害我折腾半天 。。。。
OEC就没什么好说了 maskrom下无法也是下载boot失败 原因大概进 模式之势或emmc被清空,直接拆了emmc重写如底层顺利刷入飞牛 没啥好说前面也有文章介绍过!下面弄R68的吧
- MaskROM 模式下 RKDevTool 能识别设备
- 下载 Loader 直接失败,进度条不动
- eMMC 拆下来用编程器烧了完整固件,焊回去也不开机
- 换过 USB 线、换过电脑、换过各种版本 Loader,全部一样
一度怀疑:芯片坏了、晶振没起振、USB PHY 烧了、BGA 虚焊……
排查过程
第一阶段:怀疑硬件
- 晶振偏置电压 0.8V,正常
- eMMC 供电正常
- DDR 有 1.1V
- USB OTG 口 5V / 3.3V 正常
- 从废板拆了 24MHz 晶振换上去,0.8-0.9V,还是不行
第二阶段:怀疑肯定是刷了 OEC带锁固件了要不就是U挂了
另一块没刷过 OEC 的板子完全正常。查了 RK3568 TRM,MaskROM 阶段的 USB PHY 依赖外部 24MHz 晶振作 PLL 参考时钟。但晶振换了也没用。
第三阶段:真相大白
死马当活马医把 把OEC 的完整固件镜像 写入eMMC 改r68s的dtb 它正常启动了 。
看样RK3568 支持 Secure Boot,OEC 固件可能在刷入时把公钥哈希写入了芯片 eFuse/OTP。
验证:重新烧入 OEC 原版固件 → 立刻能开机,Loader 也正常。
实锤:芯片被 OEC 的 Secure Boot 锁了,OTP 已烧不可逆。
Secure Boot 原理分析
签名布局
OEC 固件磁盘布局:
扇区 0-33: GPT 分区表
扇区 64-95: RKSS 签名块 #1
扇区 96-1087: IDBlock (DDR V1.13 + U-Boot SPL 2017.09)
扇区 1088-1343: RKSS 签名块 #2
扇区 1344-1599: 负载数据块 #2
扇区 1600-1855: RKSS 签名块 #3
扇区 1856-2367: 负载数据块 #3
扇区 2368-2623: RKSS 签名块 #4
扇区 2624-2879: RKSS 签名块 #5
扇区 2880-368639: 保留空间 (~180MB)
分区1 BOOT: kernel + dtb
分区2 rootfs: 系统文件
共 5 组 RKSS 签名块,每组间距 256KB。签名头魔数 524b5353(ASCII: RKSS)。BootROM 加载时用 OTP 中的公钥逐一验证,任一不通过即拒绝执行。
R68S 原厂固件没有 IDBlock 和签名块——对带锁芯片就是非法固件,BootROM 直接拒。
为什么 fnOS 的 OTA 不会受影响
OTA 只更新内核模块和 rootfs 里的业务层,不会动前面的签名块和 U-Boot。如果 OTA 改了这些导致 OEC 原机不开机,所有 OEC 用户全炸了,不可能这么干。
杂交方案一:fnOS(OEC → R68S)
原理
OEC 的 SPL + U-Boot 和内核版本都一样(6.18.18-trim),RK3566 和 RK3568 的内核是同一个。差异只在设备树(dtb)。所以只换 dtb 就能让内核正确驱动 R68S 的硬件。
操作
- 用 OEC 完整固件作底板(签名+SPL+U-Boot 全保留)
- 从 R68S 固件提取
rk3568-fastrhino-r68s.dtb - 放入 BOOT 分区的
dtb/rockchip/目录 - 修改
extlinux.conf,fdt 指向 R68S 的 dtb:
label fnOS
kernel /vmlinuz-6.18.18-trim
fdt /dtb/rockchip/rk3568-fastrhino-r68s.dtb # 原来是 rk3566-onethingcloud-oec.dtb
append console=ttyS2,1500000 ... root=/dev/mmcblk0p2 rw rootwait
结果
✅ 一次成功开机。内核 + rootfs 都是 OEC 的,只换了 dtb。网口全部正常。后续 OTA 升级也正常完成,重启无问题。
失败过的方案
一开始尝试了”完全杂交”——OEC 签名+U-Boot + R68S 内核+rootfs。结果不开机,因为 OEC 的 U-Boot(2017.09)太老,不兼容 R68S 的 boot.scr 里新版 U-Boot 才有的命令。
教训:只换 dtb 最稳,不要动内核和启动脚本。
杂交方案二:iStoreOS(OEC → R68S) 难度大些
镜像差异
iStoreOS OEC 版是 sysupgrade 包(GPT 格式,含签名+U-Boot),R68S 版是完整镜像(DOS 分区表,无签名+无 U-Boot)。
OEC iStoreOS 磁盘布局:
分区1 uboot (4M): FIT Image (ATF+OP-TEE+U-Boot+MCU)
分区2 misc (4M)
分区3 boot (128M): 主启动分区
分区4 env (4M)
分区5 kernel_op (64M): kernel.img + rockchip.dtb + boot.scr
分区6 rootfs (256M): SquashFS 系统
分区7 userdata (2G): 用户数据
杂交策略
保留 OEC 签名块 + U-Boot(不可动),替换 kernel + dtb + rootfs 为 R68S 版。这样 4 个网口(含 2.5G)的驱动全在 R68S 的 kernel 里。
三次失败的迭代
第一次:直接复制 R68S kernel_op 分区 → 卡在 Waiting for root device PARTUUID=...
R68S rootfs 分区是分区 2,杂交镜像里是分区 6,PARTUUID 对不上。
第二次:修了 boot.scr(分区号 2→6),又修了 GPT 备用表 → 还是卡同一个地方。
第三次:发现 eMMC 根本不工作。日志里只看到低速握手(375KHz),没有 mmcblk0 出现。
根因:用错了 dtb
R6xS 固件包里其实有 2 个 dtb:
| 文件名 | 设备 | eMMC 控制器 | 状态 |
|---|---|---|---|
rockchip0.dtb |
R66S | fe2b0000 (dwmmc) |
❌ no-mmc,R66S 没 eMMC |
rockchip1.dtb |
R68S | fe310000 (SDHCI) |
✅ 8-bit HS200 |
原厂 rockchip.dtb 是个软链接指向 rockchip0.dtb(R66S),所以一直用的是错误的 dtb。OEC 和 R68S 都把 eMMC 接在 fe310000(SDHCI 控制器)上,R66S 用的是 fe2b0000(dwmmc),两个控制器的寄存器地址、时钟配置完全不同。(由于没弄个这个机器的集合不知道它那个dtb是正确的又浪费好几次实际测试)
最终方案
直接用 rockchip1.dtb(R68S 真 dtb),eMMC 走 fe310000,跟 OEC 一致。
同时修正 boot.scr:
part uuid ${devtype} ${devnum}:6 uuid # rootfs 在分区 6
setenv bootargs "... root=PARTUUID=${uuid} rw rootwait"
load ${devtype} ${devnum}:5 ${fdt_addr_r} rockchip.dtb
load ${devtype} ${devnum}:5 ${kernel_addr_r} kernel.img
booti ${kernel_addr_r} - ${fdt_addr_r}
结果
✅ 成功启动。PCIe 扫到 RTL8125(10ec:8125),2.5G 网卡驱动正常。
杂交方案三:OpenWrt / QWRT(待验证)
操作原理一样:OEC 签名+U-Boot + 目标 dtb + 目标 kernel + 目标 rootfs。
OEC 和 R68S 都有 QWRT 适配,同一家出品的 U-Boot 兼容性大概率没问题。后续测试。
总结
通用杂交公式
新固件 = OEC固件(签名块 + IDBlock + SPL + U-Boot)
+ 目标系统(dtb + kernel + rootfs)
核心原则:
– 签名块和 U-Boot 绝对不能动(动了签名失效、芯片拒启)
– dtb 必须用目标硬件的真 dtb(注意多 dtb 包里别选错)
– kernel 用目标系统的(保证驱动完整)
– U-Boot 太老时 kernel 启动方式要兼容
踩坑清单
- MaskROM 下载失败 → 先查 Secure Boot 锁,别急着怀疑硬件
- 晶振偏置正常 ≠ 晶振起振 → 万用表看不到振荡
- 同系列 SoC 的 SPL 不完全通用 → RK3566 SPL 可以初始化 RK3568 DDR,但不能用 RK3568 的 boot.scr
- 多 dtb 包注意软链接 → R66S 和 R68S 同包,rockchip.dtb 可能指向错误的那个
- RK3568 有两个 eMMC 控制器 →
fe2b0000(dwmmc) 和fe310000(SDHCI),不同板子接的不同 - GPT 分区表大小要和镜像文件一致 → 差几个扇区就 corrupt
- fnOS 的 OTA 不受影响 → 只动内核模块和 rootfs 业务层,不动签名块
实用命令
检查固件是否带签名:
dd if=firmware.img bs=512 count=4096 | xxd | grep "524b 5353"
查看分区表:
sgdisk -p firmware.img
挂载 BOOT 分区:
START=$(sgdisk -p firmware.img | grep " 1 " | awk '{print $2}')
mount -o loop,offset=$((START*512)),rw firmware.img /mnt/boot
反编译 dtb 查硬件配置:
dtc -I dtb -O dts rockchip.dtb | grep -A20 "mmc@fe310000"
核心要点速查表
| 主题 | 关键事实 |
|---|---|
| ? Secure Boot 机制 | OTP 存储公钥哈希(不可逆) · IDBlock 含 5 组 RKSS 签名 · BootROM 逐组验证任一失败即拒启 · 头魔数 0x524b5353 |
| fnOS 杂交方案 | OEC 签名+SPL+U-Boot 全保留 · BOOT 分区只替换 dtb · 改 extlinux.conf 一行 · 内核和 rootfs 不动 ✓ |
| iStoreOS 杂交方案 | OEC 签名+U-Boot 保留 · kernel_op + rootfs 全换 R68S 版 · dtb 必须用 rockchip1 (R68S) · boot.scr 分区号 2→6 |
| 关键教训 | OTP 一旦烧不可逆,好板别手贱 · 多 dtb 包注意软链接陷阱 · RK3568 两个 eMMC 控制器不同 · GPT 镜像大小≠声明大小会 corrupt |
芯片 OTP 一旦烧入公钥哈希就不可逆。这块板子以后只能用带 OEC 签名的固件(或杂交版)。好板子别手贱刷带锁固件。
💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
Hahahaha You are so good
Good a blog toper
Im 4466,yahoo