根据你的补充(使用 V4L2 架构 + ISX031+MAX96717+MAX96712 方案),问题定位更清晰了。V4L2 架构下 MIPI 配置与 HBN 不同,需要重点关注 设备树配置 和 SerDes 驱动层 的 Lane Mapping。
核心问题确认
现象:
- 4 Lane 配置 → 检测到 D0/D2 有效,D1/D3 无效 (
stopstate=0x5)
- 2 Lane 配置 → 只检测到 1 Lane
phy_cal=0x0 → PHY 校准失败
根本原因:MAX96712 Lane Mapping 与 S600 MIPI Host 的 Lane Index 不匹配,导致数据错位。
V4L2 架构排查步骤
1. 检查设备树 (DTS) 配置
V4L2 架构下,MIPI Host 配置在 DTS 中定义。请检查以下内容:
// 找到你的 MIPI Host 节点 (根据日志是 RX1)
&hobot_mipi_host1 {
status = "okay";
lane-num = <4>; // 确认这里是 4
// 检查是否有 lane-map 或类似配置
// 某些版本可能需要显式配置 lane 顺序
};
// 检查 SerDes 节点配置
&max96712_deserial {
compatible = "maxim,max96712";
// 确认 link-num、lane-num 配置
link-num = <4>;
lane-num = <4>;
};
操作:
# 查看当前 DTS 编译后的配置
cat /proc/device-tree/soc/mipi_host@* # 路径可能不同,根据实际调整
# 或查看 sysfs 中的 MIPI 配置
cat /sys/class/vps/mipi_host1/param/lane-num
cat /sys/class/vps/mipi_host1/debug
2. MAX96712 Lane Mapping 寄存器详细排查
你提供的配置:
{ 0x08A0, 0x04 }, // 2x4 mode
{ 0x08A3, 0xE4 }, // Map data lanes for PHY 1
{ 0x08A4, 0xE4 }, // Map data lanes for PHY 0
{ 0x090A, 0xC0 }, // 4 lanes
问题点:0xE4 的位定义需要对照 MAX96712 Datasheet 确认。根据经验,0xE4 可能不是标准的 4 Lane 映射值。
建议操作:
# 1. 回读关键寄存器确认配置生效
i2cget -y <bus_id> <deser_addr> 0x08A0
i2cget -y <bus_id> <deser_addr> 0x08A3
i2cget -y <bus_id> <deser_addr> 0x08A4
i2cget -y <bus_id> <deser_addr> 0x090A
i2cget -y <bus_id> <deser_addr> 0x094A
i2cget -y <bus_id> <deser_addr> 0x098A
i2cget -y <bus_id> <deser_addr> 0x09CA
# 2. 尝试标准 4 Lane 映射配置 (参考 Datasheet)
# 通常默认映射是连续 lane,尝试以下值:
{ 0x08A3, 0x00 }, // PHY 1: D0->D0, D1->D1, D2->D2, D3->D3
{ 0x08A4, 0x00 }, // PHY 0: 同上
MAX96712 Lane Mapping 寄存器位定义参考:
| 寄存器 |
位域 |
含义 |
| 0x08A3/0x08A4 |
[7:6] |
Lane 3 映射 |
|
[5:4] |
Lane 2 映射 |
|
[3:2] |
Lane 1 映射 |
|
[1:0] |
Lane 0 映射 |
0xE4 = 1110 0100,可能将 Lane 映射到了非连续位置。
3. 尝试更换 MIPI Host 端口
正如 @Marcelo 建议,S600 有多个 MIPI Host 实例,可以尝试更换端口:
# 当前使用的是 RX1 (mipi_host1)
# 尝试切换到 RX0 或 RX2 (如果硬件连接支持)
# 修改 DTS 中的节点绑定
# 将 camera 节点从 mipi_host1 改为 mipi_host0 或 mipi_host2
# 然后重新编译 DTB 并重启
注意:需要确认你的相机扩展板物理连接的是哪个 MIPI Host 端口。
4. PHY 校准问题排查
phy_cal=0x0 表示 PHY 校准失败,可能原因:
时序问题:
// 在 MAX96712 初始化代码中,增加上电延迟
// 确保 SerDes 完全稳定后再初始化 MIPI Host
msleep(200); // 增加 200ms 延迟
// 或者在驱动中调整 MIPI Host 初始化时机
尝试禁用 PHY 校准(仅调试):
# 查看是否有相关 sysfs 节点
ls /sys/class/vps/mipi_host1/param/ | grep -i cal
# 如果支持,尝试禁用
echo 0 > /sys/class/vps/mipi_host1/param/phy_cal_enable # 假设节点名
5. V4L2 特定配置检查
V4L2 架构下,还需要检查:
# 1. 查看 V4L2 设备节点
ls -l /dev/video*
# 2. 查看 camera 驱动加载情况
lsmod | grep -i camera
dmesg | grep -i "v4l2\|camera\|mipi"
# 3. 使用 v4l2-ctl 查看设备能力
v4l2-ctl -d /dev/videoX --all
# 4. 尝试使用 v4l2-ctl 设置格式
v4l2-ctl -d /dev/videoX --set-fmt-video=width=1920,height=1080,pixelformat=YUYV
6. 参考 ISX031 官方配置
ISX031 + MAX96717 + MAX96712 是 Sony 的参考方案,建议:
- 联系 Sony FAE 获取 ISX031 的 MIPI 配置参数
- 确认 MAX96717 串行器配置 是否与 MAX96712 匹配
- 检查 GMSL2 链路带宽 是否支持 4 Lane @ 你的分辨率/帧率
快速验证方案
如果急需验证数据链路,尝试以下步骤:
# 1. 临时禁用 MIPI 检查
echo 1 > /sys/class/vps/mipi_host1/param/nocheck
# 2. 使用 v4l2-ctl 尝试捕获
v4l2-ctl -d /dev/videoX --set-fmt-video=width=1920,height=1080,pixelformat=YUYV
v4l2-ctl -d /dev/videoX --stream-mmap --stream-count=10 --stream-to=test.yuv
# 3. 查看是否有任何数据
ls -lh test.yuv
关键信息补充
请提供以下信息,方便进一步定位:
- 完整的 DTS 中 MIPI 相关节点配置
- MAX96712 完整初始化序列(包括上电时序)
dmesg | grep -i "mipi\|camera\|v4l2" 完整输出
- S600 固件版本:
cat /etc/version
- ISX031 的 MIPI 输出配置(Lane 数、速率、格式)
建议
- 优先联系 FAE:SerDes + MIPI PHY 的寄存器级调试非常依赖平台参考代码,FAE 可以提供 S600 上 MAX96712 的标准配置模板。
- 参考社区案例:RDK S100 调试红外摄像头 中有类似的 Lane Mapping 问题排查过程。
- 更新帖子:将你的排查过程和寄存器配置更新到原帖,方便 FAE 和社区大佬协助。
V4L2 架构下 MIPI 调试相对复杂,建议同步联系地瓜 FAE 获取 S600 平台的 V4L2 Camera 驱动参考代码。