RDK S100 底层设备树出现问题

你好!这个问题非常典型,S100 的设备树(DTS)配置确实沿用了部分 X5 的架构,导致 I2C 总线映射与物理引脚不一致。

从你提供的日志来看,核心问题在于:测试程序读取的设备树节点(/proc/device-tree/soc/vcon@0)中硬编码或默认配置了 bus: 4,而你的相机实际物理连接在 I2C 1/2 上。

这是一个设备树节点与驱动配置不匹配的问题。请按以下步骤排查和修复:


:stop_sign: 核心结论

  1. 根本原因:S100 的 Camera 驱动(mipi_csi 或 hbm)在解析设备树时,默认读取了 X5 架构的节点定义(Bus 4/6),未正确适配 S100 的 I2C 控制器映射。
  2. 表现:i2cdetect 能看到设备(说明底层 I2C 控制器驱动正常),但上层 Camera 服务读取的 device-tree 节点中 bus 参数错误。
  3. 解决方向:需要修改设备树源文件(.dtsi)或Camera 配置文件,将 vcon@0 节点下的 i2c-bus 属性指向正确的 I2C 控制器。

:wrench: 排查与修复步骤

步骤 1:确认当前设备树节点配置

在终端执行以下命令,查看 Camera 服务实际读取的设备树节点内容:

# 查看 vcon@0 节点的详细内容
cat /proc/device-tree/soc/vcon@0/i2c-bus
# 或者查看整个 vcon 节点
ls -l /proc/device-tree/soc/vcon@0/

预期结果:你可能会发现这里显示的值是 <4> 或 <6>(对应 X5 的 Bus ID),而不是你实际的 <1> 或 <2>。

步骤 2:定位并修改设备树源文件

S100 的设备树源文件通常位于内核源码的 arch/arm64/boot/dts/hobot/ 目录下。你需要找到定义 Camera 接口的 .dtsi 文件。

  1. 查找相关文件(如果你有 SDK 源码):

    # 在源码目录搜索 vcon 或 camera 相关节点
    grep -r "vcon@0" kernel/arch/arm64/boot/dts/hobot/
    grep -r "i2c-bus" kernel/arch/arm64/boot/dts/hobot/
    
  2. 修改节点映射:
    找到类似以下的节点定义(通常在 drobot-s100-soc.dtsi 或板级 dts 文件中):

    vcon@0 {
        compatible = "hobot,vcon";
        i2c-bus = <4>;  // ❌ 错误:这是 X5 的配置
        mipi-rx-phy = <0>;
        // ... 其他配置
    };
    

    修改为(根据你的实际连接):

    vcon@0 {
        compatible = "hobot,vcon";
        i2c-bus = <1>;  // ✅ 正确:修改为实际的 I2C 控制器 ID
        mipi-rx-phy = <0>;
    };
    

    注意:S100 的 I2C 控制器 ID 可能与 X5 不同,请查阅 S100 硬件参考手册 确认 I2C1/2 对应的控制器编号。

步骤 3:重新编译并烧录

修改设备树后,不能直接替换 /boot 下的 dtb 文件(会导致启动失败,参考 topic/34466),必须重新打包内核镜像:

# 1. 编译内核和设备树
cd sdk/kernel
make clean
make -j$(nproc)

# 2. 打包镜像(具体脚本视 SDK 版本而定)
cd ../system
./mk_image.sh  # 或 ./pack_image.sh

# 3. 烧录新镜像到开发板
# 使用 SD 卡烧录或 fastboot 烧录

步骤 4:验证修复

烧录完成后,重新运行测试脚本:

# 再次检查设备树节点
cat /proc/device-tree/soc/vcon@0/i2c-bus
# 应该显示 <1> 或 <2>

# 运行相机测试
bash run_cam.sh

:light_bulb: 临时绕过方案(如果无法重新编译)

如果你暂时无法获取 SDK 源码或重新编译,可以尝试以下风险较高的临时方案:

  1. 修改测试脚本:
    检查 run_cam.sh 或相关配置文件,看是否有硬编码的 bus_id 参数,尝试手动指定:

    # 示例(具体参数需查看脚本源码)
    ./mipi_test --i2c-bus 1 --mipi-port 0
    
  2. 使用设备树覆盖(DTBO):
    创建一个 DTBO 文件覆盖 vcon@0 节点,但需确保 U-Boot 支持加载(参考 topic/34466 的步骤 3)。


:books: 相关资源

:red_question_mark: 需要你补充的信息

为了更精准定位问题,请提供:

  1. 你的 S100 SDK 版本号(执行 cat /etc/hobot_version)
  2. 双目相机的具体型号和连接方式(是直接接 S100 底板,还是通过扩展板?)
  3. 是否有SDK 源码?如果没有,建议联系 FAE 获取最新的 BSP 包。

如果不确定如何获取源码或修改 DTS,建议在帖子中回复,社区管理员 Marcelo 或 地瓜小助手 可以提供最新的设备树模板文件。