回复 jsgaoyang:RDK X5 设备树配置 MIPI 摄像头
您问到了关键问题!设备树(Device Tree)配置是解决双摄像头 I2C 冲突的核心。但在 RDK X5 上,普通用户通常不需要手动修改设备树,而是通过官方提供的配置工具或 ROS2 参数来完成。
重要前提确认
在修改设备树之前,请先确认:
-
您的摄像头型号是否在官方支持列表中?
- 官方支持:SC132GS、IMX219、OV5647 等
- 第三方模组可能需要额外适配
-
两个摄像头是否连接到不同的 MIPI CSI 接口?
- RDK X5 通常有 2-4 个独立的 MIPI CSI 接口
- 每个接口应对应不同的 I2C 总线
-
为什么两个摄像头都映射到 i2c7?
- 这可能是硬件连接问题或设备树配置错误
方案 1:使用官方配置工具(推荐,无需手动改设备树)
RDK X5 提供了摄像头配置工具,自动处理设备树配置:
# 1. 查看可用的摄像头配置脚本
ls /usr/bin/*camera* 2>/dev/null
ls /opt/horizon/bin/*camera* 2>/dev/null
# 2. 运行摄像头配置工具(如果有)
# 具体命令参考官方文档
# 通常是类似这样的:
hb_cam_config --list # 列出支持的摄像头
hb_cam_config --set --channel 0 --model sc132gs
hb_cam_config --set --channel 1 --model sc132gs
参考官方文档:RDK DOC - MIPI 摄像头配置
方案 2:使用官方 ROS2 包(自动处理设备树)
官方 ROS2 包 hobot_mipi_cam 会自动处理多摄像头配置:
# 1. 克隆官方仓库
cd ~
git clone https://github.com/D-Robotics/hobot_mipi_cam
cd hobot_mipi_cam
# 2. 查看双目启动文件
ls launch/*dual*
# 3. 查看启动文件内容,确认 channel 配置
cat launch/mipi_cam_dual_channel.launch.py
# 4. 启动双目摄像头(根据实际接口调整 channel)
ros2 launch hobot_mipi_cam mipi_cam_dual_channel.launch.py \
left_channel:=0 \
right_channel:=1 \
camera_model:=sc132gs
关键参数:
left_channel/right_channel:指定 MIPI CSI 接口编号camera_model:摄像头型号
方案 3:手动修改设备树(高级用户,需谨慎)
警告:手动修改设备树有风险,可能导致系统无法启动。建议先备份!
Step 1: 找到设备树源文件
# 查找设备树文件
find /boot -name "*.dtb" 2>/dev/null
find /opt/horizon -name "*.dts" 2>/dev/null
# 通常位于:
# /boot/horizon-x5.dtb
# 或
# /opt/horizon/dts/horizon-x5.dts
Step 2: 反编译设备树(如果是 .dtb 格式)
# 安装设备树编译工具
sudo apt install device-tree-compiler
# 反编译 dtb 到 dts
dtc -I dtb -O dts -o horizon-x5.dts /boot/horizon-x5.dtb
Step 3: 编辑设备树文件
sudo nano horizon-x5.dts
查找 MIPI CSI 配置部分,通常类似:
&csi0 {
status = "okay";
i2c-bus = <&i2c6>; // ← 确认 I2C 总线号
camera@30 {
compatible = "sc132gs";
reg = <0x30>; // I2C 地址
status = "okay";
};
};
&csi1 {
status = "okay";
i2c-bus = <&i2c7>; // ← 确认 I2C 总线号不同
camera@30 {
compatible = "sc132gs";
reg = <0x30>;
status = "okay";
};
};
关键检查点:
- 每个 CSI 接口的
i2c-bus是否不同 status是否为"okay"- 摄像头型号
compatible是否正确
Step 4: 重新编译设备树
# 编译 dts 到 dtb
dtc -I dts -O dtb -o horizon-x5-new.dtb horizon-x5.dts
# 备份原设备树
sudo cp /boot/horizon-x5.dtb /boot/horizon-x5.dtb.backup
# 替换设备树
sudo cp horizon-x5-new.dtb /boot/horizon-x5.dtb
# 重启
sudo reboot
方案 4:使用 run_tuning.sh 工具(针对 SC132GS)
从论坛已有讨论看,RDK X5 提供了 run_tuning.sh 工具配置摄像头:
# 查看工具帮助
bash /opt/horizon/bin/run_tuning.sh --help
# 配置双摄像头(参考已有案例)
# --run 30 可能表示配置双路 30fps
# -r 1 可能表示启用双路
bash run_tuning.sh --run 30 -r 1
# 配置完成后重启
sudo reboot
诊断步骤(修改前先执行)
在修改设备树之前,请先执行以下诊断命令,并将输出贴到论坛:
# 1. 查看 I2C 总线列表
i2cdetect -l
# 2. 检测所有 I2C 总线上的设备
for bus in $(i2cdetect -l | awk '{print $1}'); do
echo "=== I2C Bus $bus ==="
i2cdetect -y $bus
done
# 3. 查看当前设备树中 MIPI 配置
cat /proc/device-tree/soc/cam/* 2>/dev/null | head -200
# 4. 查看系统日志中的摄像头初始化信息
dmesg | grep -i "mipi\|csi\|camera\|i2c"
# 5. 查看摄像头型号支持列表
cat /opt/horizon/share/camera/supported_models.txt 2>/dev/null
关键问题:为什么两个摄像头都映射到 i2c7?
这是异常现象!正常情况下:
- MIPI CSI 0 → I2C bus 6
- MIPI CSI 1 → I2C bus 7
- MIPI CSI 2 → I2C bus 8
可能原因:
- 硬件连接错误:两个摄像头接到了同一个 I2C 控制器
- 设备树配置错误:两个 CSI 接口被配置为共用 I2C 总线
- 第三方模组不兼容:模组内部电路设计导致 I2C 映射异常
建议下一步行动
-
优先尝试官方 ROS2 例程:
git clone https://github.com/D-Robotics/hobot_mipi_cam cd hobot_mipi_cam ros2 launch hobot_mipi_cam mipi_cam_dual_channel.launch.py -
执行诊断命令,将输出贴到论坛:
i2cdetect -ldmesg | grep -i mipi- 摄像头型号和连接位置照片
-
联系官方确认:
- 您的摄像头型号是否支持双路独立使用
- 是否需要特殊的设备树配置
-
如果必须手动修改设备树:
- 先备份原设备树
- 参考官方文档或社区已有配置
- 修改后仔细测试
参考资源
| 资源 | 链接 |
|---|---|
| 官方 MIPI 摄像头文档 | RDK DOC |
| 官方 ROS2 摄像头包 | hobot_mipi_cam GitHub |
| 社区讨论(SC132GS 双目) | 论坛帖子 |
| 社区讨论(双摄像头错误码 -43) | 论坛帖子 |
请先执行诊断命令并反馈结果,我们可以帮您进一步分析设备树配置是否正确!