如题所问,不知道RDK S100启动内核时到底使用的是哪个dtb文件,我尝试创建了个dtbo文件(针对i2c3和mipi_host4作了设备树修改),结果系统都无法启动,卡在uboot阶段,从上电到卡死的日志如下:
U-Boot SPL 2022.04-00664-g080b6609d7 (Oct 15 2025 - 22:24:00 +0800)
[BL31:1970:01:01:00:00:02:100292](0) NOTICE: fconf_populate_uart: Use uart at 0x394b0000 Freq: 200000000 Baud: 921600
[BL31:1970:01:01:00:00:02:120532](0) NOTICE: ATF booting at PE 81000000
[BL31:1970:01:01:00:00:02:121491](0) NOTICE: OP-TEE has been loaded by SCP firmware
[BL31:1970:01:01:00:00:02:126261](0) NOTICE: BL31: v2.8(release):LNX-PL4.0-WB-20241225-4-g778c8046a
[BL31:1970:01:01:00:00:02:127488](0) NOTICE: BL31: Built : 15:56:47, Jul 25 2025
I/TC:
I/TC: OP-TEE version: b1d960c7-dev (gcc version 11.3.1 20220712 (Arm GNU Toolchain 11.3.Rel1)) #1 Wed Oct 15 14:23:57 UTC 2025 aarch64
I/TC: Primary CPU initializing
I/TC: Primary CPU switching to normal world boot
你好!针对你遇到的 RDK S100 修改设备树后卡在 U-Boot/OP-TEE 阶段 的问题,结合社区现有案例(如 topic/33021 和 topic/33726),以下是直接结论和排查方案:
核心结论
-
启动使用的 DTB 文件:
RDK S100 启动时加载的 DTB 通常被打包在boot.scr或Image.itb(FIT Image) 中,位于 boot 分区。- 文件路径通常为:
/boot/hobot/<board_name>.dtb或集成在/boot/uImage//boot/Image.itb。 - 关键点:直接替换
/boot下的.dtb文件往往无效,因为 U-Boot 可能直接从 FIT 镜像或boot.scr指定的内存地址加载,且会校验签名或哈希。
- 文件路径通常为:
-
卡死原因分析:
你的日志卡在OP-TEE has been loaded和Primary CPU switching to normal world boot之间,这通常意味着:- 设备树语法错误:导致内核解析失败,无法跳转。
- 节点冲突:修改
i2c3或mipi_host4时,未正确禁用原有节点或引脚复用(pinctrl)冲突。 - DTBO 加载失败:S100 的 U-Boot 对 DTBO(设备树覆盖)的支持有限,若 U-Boot 配置未开启
CONFIG_OF_LIBFDT_OVERLAY或加载脚本未正确调用,直接应用 DTBO 会导致启动崩溃。 - 内存地址错误:DTBO 加载地址与内核预期不符。
排查与解决步骤
步骤 1:确认当前生效的 DTB 来源
在能启动的原厂系统中,通过串口或 SSH 执行以下命令,确认启动参数:
# 查看内核启动命令行
cat /proc/cmdline
# 查看当前使用的设备树模型名称
cat /proc/device-tree/model
# 检查 boot 分区文件结构 (通常挂载在 /boot)
ls -l /boot/hobot/
# 重点关注是否有 .dtb 文件,以及 uImage 或 Image.itb 的大小
- 如果看到
fdt_file=hobot/s100.dtb之类的参数,说明 U-Boot 尝试加载外部 DTB。 - 如果没有
fdt_file参数,说明 DTB 被编译进了内核镜像(FIT Image),此时必须重新打包内核镜像。
步骤 2:正确的修改方式(推荐重编译内核镜像)
社区案例(如 topic/33021)表明,直接替换 DTB 极易失败。请按照以下流程操作:
-
获取源码:
- 目前 S100 BSP 源码已部分开放,请参考官方文档 RDK S 系列系统构建指南 获取 SDK。
- 若无法获取完整源码,需联系 FAE 获取包含设备树源码的包。
-
修改 .dtsi 文件:
- 找到源码中的
kernel/arch/arm64/boot/dts/hobot/目录。 - 修改对应的
.dtsi文件(如drobot-s100-soc.dtsi或板级.dts)。 - 关键检查:
- 确保
i2c3和mipi_host4的status设置正确("okay"或"disabled")。 - 检查
pinctrl节点是否冲突(例如 MIPI 引脚是否被 GPIO 或其他外设占用)。 - 不要 仅依赖 DTBO,建议直接修改主 DTS 重新编译。
- 确保
- 找到源码中的
-
重新编译并打包:
- 清理环境:
make clean/make mrproper。 - 编译内核与 DTB:执行 SDK 中的
mk_kernel.sh。 - 打包镜像:执行
pack_image.sh或mk_fit_image.sh(具体脚本视 SDK 版本而定),生成包含新 DTB 的Image.itb或uImage。 - 烧录:将生成的镜像烧录到开发板。
- 清理环境:
步骤 3:如果必须使用 DTBO(高级调试)
若你坚持使用 DTBO,需确保 U-Boot 环境变量配置正确:
- 在 U-Boot 命令行(卡死前快速按回车进入)检查:
printenv fdt_overlays printenv loadaddr - 确保 DTBO 文件已正确放置在 boot 分区,且 U-Boot 脚本(
boot.scr)中有加载逻辑:
注意:S100 出厂 U-Boot 可能未开启此功能,强行使用会导致你遇到的卡死。# 示例逻辑(需根据实际 U-Boot 版本调整) load mmc 0:1 ${loadaddr} my_overlay.dtbo fdt apply ${loadaddr}
针对你日志的特别提示
日志显示 BL31 和 OP-TEE 正常加载,但在切换 Normal World 时卡死,这极大概率是 内核设备树解析错误 导致的 Early Panic。
- 建议操作:回退到原厂镜像确认硬件无误 → 获取 SDK 源码 → 修改 DTS → 重编译内核镜像 → 烧录。
- 避坑:不要直接修改 boot 分区的
.dtb文件,除非你非常清楚 U-Boot 的加载机制(通常是不行的)。
相关资源
- RDK S 系列设备树内存分配调整指南(参考其修改流程)
- 外接 40PIN 串口配置问题(类似卡死案例)
- 官方文档:Camera 点亮 | RDK DOC(涉及 MIPI 配置参考)
如果不确定源码获取方式,建议直接在帖子中回复你的邮箱或联系社区管理员 Marcelo 获取最新的 BSP 包。需要我帮你梳理具体的 DTS 修改语法吗?