请问RDK S100启动到底用的是哪个dtb文件?

如题所问,不知道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),以下是直接结论和排查方案:

:stop_sign: 核心结论

  1. 启动使用的 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 指定的内存地址加载,且会校验签名或哈希。
  2. 卡死原因分析:
    你的日志卡在 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 加载地址与内核预期不符。

:wrench: 排查与解决步骤

步骤 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 极易失败。请按照以下流程操作:

  1. 获取源码:

    • 目前 S100 BSP 源码已部分开放,请参考官方文档 RDK S 系列系统构建指南 获取 SDK。
    • 若无法获取完整源码,需联系 FAE 获取包含设备树源码的包。
  2. 修改 .dtsi 文件:

    • 找到源码中的 kernel/arch/arm64/boot/dts/hobot/ 目录。
    • 修改对应的 .dtsi 文件(如 drobot-s100-soc.dtsi 或板级 .dts)。
    • 关键检查:
      • 确保 i2c3 和 mipi_host4 的 status 设置正确("okay" 或 "disabled")。
      • 检查 pinctrl 节点是否冲突(例如 MIPI 引脚是否被 GPIO 或其他外设占用)。
      • 不要 仅依赖 DTBO,建议直接修改主 DTS 重新编译。
  3. 重新编译并打包:

    • 清理环境: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 环境变量配置正确:

  1. 在 U-Boot 命令行(卡死前快速按回车进入)检查:
    printenv fdt_overlays
    printenv loadaddr
    
  2. 确保 DTBO 文件已正确放置在 boot 分区,且 U-Boot 脚本(boot.scr)中有加载逻辑:
    # 示例逻辑(需根据实际 U-Boot 版本调整)
    load mmc 0:1 ${loadaddr} my_overlay.dtbo
    fdt apply ${loadaddr}
    
    注意:S100 出厂 U-Boot 可能未开启此功能,强行使用会导致你遇到的卡死。

:light_bulb: 针对你日志的特别提示

日志显示 BL31 和 OP-TEE 正常加载,但在切换 Normal World 时卡死,这极大概率是 内核设备树解析错误 导致的 Early Panic。

  • 建议操作:回退到原厂镜像确认硬件无误 → 获取 SDK 源码 → 修改 DTS → 重编译内核镜像 → 烧录。
  • 避坑:不要直接修改 boot 分区的 .dtb 文件,除非你非常清楚 U-Boot 的加载机制(通常是不行的)。

:books: 相关资源

如果不确定源码获取方式,建议直接在帖子中回复你的邮箱或联系社区管理员 Marcelo 获取最新的 BSP 包。需要我帮你梳理具体的 DTS 修改语法吗?