👁 1259

RK3568 救砖实录封面

背景

网友发了一块 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 中的公钥逐一验证,任一不通过即拒绝执行。

图 1: fnOS — OEC 原版 vs R68S 分区对比 (只换 dtb 即可)
fnOS — OEC 原版 vs R68S 分区对比 OEC 固件 (带 Secure Boot 签名) MBR + GPT (33 扇区) RKSS 签名块 ×5 头魔数: 524b5353(RKSS) IDBlock DDR V1.13 + U-Boot SPL 2017.09 保留空间 (~180MB) BOOT (ext2, 255M) kernel 6.18.18-trim · extlinux.conf rootfs (BTRFS, 3.2G) 系统文件 R68S 固件 (无签名) MBR + GPT (33 扇区) 空闲 (~32MB) · 无 IDBlock · 无签名 —— —— BOOT (ext2, 325M) kernel 6.18.18-trim · boot.scr · dtb rootfs (BTRFS, 3.2G) 系统文件 → 杂交 ← 只换 dtb 即可 BootROM → 验签 → SPL → U-Boot → kernel(dtb) → rootfs BootROM → (无签名) → ❌ 拒绝执行 带锁芯片刷此固件直接卡死 Legend 签名区 IDBlock BOOT rootfs 空闲/保留

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 的硬件。

操作

  1. 用 OEC 完整固件作底板(签名+SPL+U-Boot 全保留)
  2. 从 R68S 固件提取 rk3568-fastrhino-r68s.dtb
  3. 放入 BOOT 分区的 dtb/rockchip/ 目录
  4. 修改 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 网卡驱动正常。

图 2: iStoreOS — OEC vs R68S 分区对比 + 杂交流程 (含 dtb 关键区别)
iStoreOS — OEC vs R68S 分区对比 + 杂交流程 OEC iStoreOS (sysupgrade · 带签名) GPT 分区表 RKSS 签名 ×5 IDBlock DDR V1.13 + SPL uboot FIT Image (ATF+OP-TEE+U-Boot+MCU) misc (4M) boot (128M) env (4M) kernel_op (FAT16, 64M) kernel.img + rockchip.dtb + boot.scr rootfs (SquashFS, 256M) userdata (2G) R68S iStoreOS (完整镜像 · 无签名) MBR (DOS 分区表) 空闲 (无签名 · 无 IDBlock · 无 U-Boot) —— —— —— —— kernel_op (FAT16, 64M) kernel.img + rockchip.dtb ×2 + boot.scr rootfs (SquashFS, 256M) userdata BootROM → 验签 → U-Boot → kernel → rootfs ✓ BootROM → (无签名) → ❌ 杂交结果: OEC 签名+U-Boot + R68S kernel+dtb+rootfs OEC 签名区 (保留) OEC U-Boot (保留) kernel_op (R68S) rootfs (R68S) dtb 关键区别 rockchip0.dtb (R66S) eMMC: fe2b0000 (dwmmc) no-mmc → 读不到分区 rockchip1.dtb (R68S) ✓ eMMC: fe310000 (SDHCI) bus-width=8 · HS200 R68S 包里 rockchip.dtb → rockchip0.dtb (R66S),需手动替换为 rockchip1.dtb (R68S) · kernel_op 里的 boot.scr 分区号也需修改: 2→6 Legend 签名 U-Boot kernel rootfs

杂交方案三: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 启动方式要兼容

踩坑清单

  1. MaskROM 下载失败 → 先查 Secure Boot 锁,别急着怀疑硬件
  2. 晶振偏置正常 ≠ 晶振起振 → 万用表看不到振荡
  3. 同系列 SoC 的 SPL 不完全通用 → RK3566 SPL 可以初始化 RK3568 DDR,但不能用 RK3568 的 boot.scr
  4. 多 dtb 包注意软链接 → R66S 和 R68S 同包,rockchip.dtb 可能指向错误的那个
  5. RK3568 有两个 eMMC 控制器 → fe2b0000 (dwmmc) 和 fe310000 (SDHCI),不同板子接的不同
  6. GPT 分区表大小要和镜像文件一致 → 差几个扇区就 corrupt
  7. 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 签名的固件(或杂交版)。好板子别手贱刷带锁固件。