RDK S600 平台 v4l2 架构的serdes相机 mipi 探测lane数和实际配置lane数不匹配问题

[驱动开发][RDK S600][MIPI LANE数探测不匹配]

[问题分类]参考:[多媒体}
[板卡类型]参考:[RDK S600]

参考到下面LOG 可以看到,我软件配置的预期是4LANE,但是实际检测到d0和d2 的2 lane,并没有检测到4lane,我尝试debug修改max96712的lane的输出数量,从4lane改成2lane,修改后,我这里就只能探测到1lane了,想求助下大家是否遇到过类似问题?

[ 136.555460] [I|MIPI|hobot_mipi_host_ops.c+4054]:[RX1]: phy stopstate poll[3000]=0x5 expect=0xf rx=0x10000 shutdownz=0x1 rstz=0x1 csi2_resetn=0x1 nlanes=0x3 phy_cal=0x0

[ 136.555464] [I|MIPI|hobot_mipi_host_ops.c+4058]:[RX1]: phy stopstate decode clk=0 d0=1 d1=0 d2=1 d3=0 rxclkactivehs=0 rxulpsclknot=1 ulps_data[3:0]=0x0

[ 136.556465] [E|MIPI|hobot_mipi_host_ops.c+4084]:[RX1]: lane state of host phy is error: stopstate=0x5 expect=0xf lane=4 wait_ms=3000 rx=0x10000 shutdownz=0x1 rstz=0x1 csi2_resetn=0x1 nlanes=0x3 phy_cal=0x0

[ 136.556468] [E|MIPI|hobot_mipi_host_ops.c+4088]:[RX1]: lane state decode clk=0 d0=1 d1=0 d2=1 d3=0 rxclkactivehs=0 rxulpsclknot=1 ulps_data[3:0]=0x0

[ 136.556469] [E|MIPI|hobot_mipi_host_ops.c+4495]:[RX1]: wait phy stop state error
[ 136.556473] [E|MIPI|hobot_mipi_host_ops.c+4662]:[RX1]: init error: -1

根据你提供的日志和搜索到的社区类似案例,这是一个典型的 MIPI Lane 配置与实际物理链路不匹配 的问题。

核心结论

问题定位:
软件配置为 4 Lane,但 Host PHY 只检测到 2 Lane 有效信号(d0=1, d2=1,d1=0, d3=0),导致 stopstate 校验失败(期望 0xf 即 4 路全停止,实际 0x5 即只有 2 路)。

最可能的原因:

  1. MAX96712 输出配置未生效:解串器寄存器未正确配置为 4 Lane 输出,或者硬件上只连接了 2 Lane。
  2. SerDes 链路协商问题:GMSL 链路虽然 Lock,但带宽/模式协商结果与预期不符。
  3. 硬件连接问题:板卡上 MIPI 走线可能只连接了 2 Lane(常见于某些开发板或自定义载板)。

排查步骤

1. 确认 MAX96712 实际输出 Lane 数

不要只改软件配置,必须确认解串器寄存器是否真的配成了 4 Lane。

  • 读取 MAX96712 关键寄存器(假设 I2C 总线为 /dev/i2c-X,地址需根据你的原理图确认,通常是 0x10 或 0x18 等,需结合 dmesg 中的 max96712 驱动日志):
    # 示例:读取链路配置寄存器 (具体寄存器地址参考 MAX96712 Datasheet)
    # 重点检查 Link Configuration 寄存器,确认 Lane Count 设置
    i2cget -y <bus_id> <deser_addr> <reg_addr>
    
    • 关键寄存器:检查 0x06 (Link Enable) 和 Lane Map 相关寄存器。
    • 对比案例:参考社区帖子 RDK S100调试红外摄像头dump数据报错,其中提到 deserial4 max96712 config link num is 4,但实际物理层可能未生效。

2. 检查设备树 (DTS) 配置

确认 RDK S600 端的 MIPI Host 配置是否与硬件一致。

  • 查看 DTS 中的 lane-num:
    &mipi_csi_0 { // 或对应的 RX 节点
        status = "okay";
        lane-num = <4>; // 确认这里是否为 4
        // 其他配置...
    };
    
  • 如果硬件只接了 2 Lane:必须将 DTS 和驱动配置都改为 2 Lane,不能强行配 4 Lane。

3. 验证 GMSL 链路带宽与模式

MAX96712 输出 4 Lane 需要足够的 GMSL 带宽支持。

  • 检查 GMSL 速率:如果 Sensor 输出数据量较小,SerDes 可能自动降级或配置错误。
  • 尝试强制配置:在 MAX96712 驱动初始化代码中,显式写入 Lane 配置寄存器,确保其输出 4 Lane。
    • 参考 Datasheet:PORT_CONFIG 或 LANE_ASSIGNMENT 寄存器。

4. 临时绕过检查(仅用于调试)

如果想确认是否是 PHY 检测逻辑过于严格,可以尝试关闭 MIPI 检查(仅限调试,不可用于量产):

# 根据日志中的 RX1,找到对应的 sysfs 节点
echo 1 > /sys/class/vps/mipi_host1/param/nocheck
  • 如果关闭后能出图,说明数据链路是通的,只是 Lane 数检测不匹配。
  • 如果关闭后仍报错或无数据,说明物理链路本身就有问题(如只通了 2 Lane)。

5. 硬件测量(终极手段)

如果软件排查无果,必须上示波器:

  • 测量点:RDK S600 端 MIPI 接口。
  • 观察波形:
    • CLK 是否有高速信号?
    • D0, D1, D2, D3 四根线是否都有高速信号?
    • 如果 D1/D3 无波形:说明 MAX96712 根本没输出 4 Lane,或者 PCB 走线断路。

社区类似案例参考

在 RDK S100 调试红外摄像头 案例中,用户遇到类似问题:

  • 现象:Log 显示配置 4 Lane,但实际无法出图。
  • 原因:部分开发板或载板硬件上只连接了 2 Lane MIPI 走线。
  • 解决:将软件配置(DTS + 驱动)从 4 Lane 改为 2 Lane 后正常。

建议操作:

  1. 先改回 2 Lane 测试:既然 Log 显示 d0=1, d2=1,说明这 2 Lane 是通的。尝试将软件配置(DTS、驱动、MAX96712 初始化代码)全部改为 2 Lane,看能否正常出图。

    • 如果 2 Lane 能通,说明硬件限制就是 2 Lane。
    • 如果 2 Lane 也不能通(你提到改 2 Lane 后只探测到 1 Lane),说明 Lane 映射(Lane Mapping) 或 时序 有问题。
  2. 检查 Lane Mapping:

    • MAX96712 支持 Lane Reordering。检查是否 D0/D1/D2/D3 的顺序在 SerDes 配置中被打乱。
    • 尝试调整 MAX96712 的 Lane Assignment 寄存器。

总结建议

  1. 优先验证 2 Lane 配置:既然物理层只看到 2 Lane 活动,先将软件全链路(Sensor → SerDes → Deser → SoC)都配置为 2 Lane,确保能出图。
  2. 排查 4 Lane 失效原因:
    • 确认 MAX96712 寄存器是否真的配了 4 Lane。
    • 确认 PCB 原理图上 MIPI 是否真的接了 4 Lane。
    • 检查 GMSL 带宽是否支持 4 Lane 传输。
  3. 提供更多信息:如果以上步骤无法解决,请补充:
    • MAX96712 的初始化代码片段(Lane 配置部分)。
    • RDK S600 的 DTS 中 MIPI 节点配置。
    • 硬件原理图(MIPI 连接部分)。

建议将排查过程和新 Log 更新到你的帖子中,方便社区进一步协助。

上面的内容后面有补充了说明

根据你的补充信息,问题更加清晰了。这是一个典型的 MIPI Lane Mapping 错位 问题,而不是简单的 Lane 数量配置问题。

核心问题分析

从日志 clk=0 d0=1 d1=0 d2=1 d3=0 可以看到:

  • 只有 D0 和 D2 有信号,D1 和 D3 无信号
  • 这不是"只通了2 Lane",而是 Lane 映射错位 或 PHY 校准失败
  • phy_cal=0x0 表示 PHY 校准未通过,这是关键

排查步骤(按优先级)

1. 检查 MAX96712 Lane Assignment 配置

你提供的寄存器配置中,0x08A3/0x08A4 的 0xE4 值需要仔细核对。根据 MAX96712 Datasheet:

// 当前配置
{ 0x08A3, 0xE4 }, // Map data lanes for PHY 1
{ 0x08A4, 0xE4 }, // Map data lanes for PHY 0

问题点:0xE4 的位定义需要确认是否正确映射了 4 Lane。

建议操作:

# 1. 回读并打印这些关键寄存器
i2cget -y <bus> <deser_addr> 0x08A0
i2cget -y <bus> <deser_addr> 0x08A3
i2cget -y <bus> <deser_addr> 0x08A4
i2cget -y <bus> <deser_addr> 0x090A
i2cget -y <bus> <deser_addr> 0x094A
i2cget -y <bus> <deser_addr> 0x098A
i2cget -y <bus> <deser_addr> 0x09CA

# 2. 尝试修改 Lane Mapping 为默认值
# 参考 MAX96712 Datasheet 的 Lane Assignment 章节
# 通常 4 Lane 默认映射是:0x00 或 0x15 等,需要查表确认

2. 检查 S600 MIPI Host 的 Lane 配置

S600 的 MIPI Host 可能需要显式配置 Lane Mapping。查看 DTS 中是否有类似配置:

&hobot_mipi_host1 {  // 根据日志是 RX1
    status = "okay";
    lane-num = <4>;
    lane-map = <0 1 2 3>;  // 确认是否有此配置,或类似配置
    phy-cal-enable = <1>;  // PHY 校准使能
};

排查命令:

# 查看当前 mipi_host1 的配置
cat /sys/class/vps/mipi_host1/param/*

# 查看 debug 信息
cat /sys/class/vps/mipi_host1/debug

3. PHY 校准失败问题 (phy_cal=0x0)

日志中 phy_cal=0x0 表示 PHY 校准未通过,这可能是:

  • 时序问题:MAX96712 上电时序与 S600 MIPI Host 初始化时序不匹配
  • 阻抗/信号质量问题:虽然使用官方套件,但可能存在接触不良

建议操作:

# 1. 尝试禁用 PHY 校准(仅调试用)
# 查看是否有相关 sysfs 节点
ls /sys/class/vps/mipi_host1/param/ | grep -i cal

# 2. 调整上电时序
# 在驱动中增加 MAX96712 上电后的延迟
msleep(100);  // 增加 100ms 延迟再初始化 MIPI Host

4. 尝试不同的 Lane 配置组合

既然配置 4 Lane 检测到 D0/D2,配置 2 Lane 检测到 1 Lane,说明 Lane 映射有偏移。

尝试以下配置组合:

// 方案 A: 强制配置为 2 Lane (使用 D0/D2)
{ 0x08A0, 0x02 }, // 2x2 mode
{ 0x08A3, 0x00 }, // PHY 1 mapping
{ 0x08A4, 0x00 }, // PHY 0 mapping
{ 0x090A, 0x40 }, // 2 lanes

// 方案 B: 调整 Lane Mapping
{ 0x08A0, 0x04 }, // 2x4 mode
{ 0x08A3, 0x00 }, // 尝试不同映射值
{ 0x08A4, 0x00 },
{ 0x090A, 0xC0 }, // 4 lanes

5. 检查 GMSL 链路状态

确认 GMSL 链路是否真的 Lock,以及带宽协商结果:

# 读取 MAX96712 链路状态寄存器
i2cget -y <bus> <deser_addr> 0x00  # Link Status
i2cget -y <bus> <deser_addr> 0x01  # Lock Status

# 查看 dmesg 中的 GMSL 链路信息
dmesg | grep -i "max96712\|gmsl\|link"

关键问题确认

请补充以下信息,方便进一步定位:

  1. MAX96712 的完整初始化序列(特别是上电时序和 Lane 配置部分)
  2. S600 的 DTS 中 MIPI Host 节点配置
  3. dmesg | grep -i mipi 的完整输出
  4. 使用的 S600 固件版本(cat /etc/version 或类似命令)

临时解决方案

如果急需验证数据链路是否通畅,可以尝试:

# 1. 禁用 MIPI 检查(仅调试)
echo 1 > /sys/class/vps/mipi_host1/param/nocheck

# 2. 强制跳过 PHY 校准(如果支持)
# 需要查看驱动源码确认是否有此选项

# 3. 使用 get_vin_data 测试是否能出图
./get_vin_data -c 1 -w 1920 -h 1080 -f YUV422

社区类似案例

在 x5 平台点亮 sensor,mipi 报错 中,用户遇到类似问题,最终发现是 Lane Mapping 配置与硬件不匹配,调整 0x08A3/0x08A4 寄存器后解决。

建议将你的排查过程和寄存器配置更新到帖子中,方便 FAE 或社区大佬进一步协助。如果问题持续,建议联系地瓜 FAE 获取 S600 平台的 MIPI Host 配置参考代码。

你好,是有自己的相机适配需求吗,可以看下是否已经有技术合作上的对接

从社区角度来排查的话, 查了一下 S600 的硬件文档,J12/J14 相机扩展接口的 80pin 连接器上,每个 D-PHY 实例都完整拉出了 4 条 data lane(DP0~DP3)+ 1 条 clock lane,硬件层面是支持 4 lane 的。

所以你遇到的问题大概率不是硬件走线限制,而是:

  1. MAX96712 的 lane mapping 配置 — 请检查解串器的 Lane Assignment / Lane Reordering 寄存器,确认 MAX96712 输出的 D0/D1/D2/D3 与 SoC MIPI Host 的 lane index 对应关系是否一致。日志中 d0=1, d2=1 但 d1=0, d3=0,这种隔 lane 有信号的现象很像 mapping 不对。
  2. MAX96712 寄存器是否真正写入生效 — 用 i2cget 回读一下 lane 配置相关寄存器,确认写入成功。
  3. 改 2 lane 后只探测到 1 lane — 这也指向 lane mapping 问题,改配置后 lane 顺序变了,原来通的两条线映射到了不同的物理 lane 上。

建议排查 MAX96712 datasheet 中的 Lane Mapping / Lane Assignment 寄存器,如果已经建联可以尝试联系 FAE 获取 MAX96712 在 S600 上的参考配置代码。

是的,想用你们的s600平台点亮我们自己的camera sensor isx031-max96717-max96712,目前max96712用的官方code,

目前有对接了技术合作,但是目前也没有进展,也同步发论坛咨询下,

相机适配涉及的寄存器级调试,社区这边能基于公开文档提供的支持比较有限,上面的排查方向供参考。如果排查后仍未解决,建议直接联系对应 FAE 对接 ——SerDes 配置、lane mapping 这些细节 直接和 FAE 沟通效率会快不少。

后续如果有进展或新发现,也欢迎更新到帖子里,方便社区积累经验,也帮助后面遇到类似问题的同学。

注意到你日志里报的是 [RX1] 可以换个试试?

好的 ,我再调试寄存器看下mapping是否存在问题,目前我并没有使用HBN架构,使用的是V4L2架构

根据你的补充(使用 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 的参考方案,建议:

  1. 联系 Sony FAE 获取 ISX031 的 MIPI 配置参数
  2. 确认 MAX96717 串行器配置 是否与 MAX96712 匹配
  3. 检查 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

关键信息补充

请提供以下信息,方便进一步定位:

  1. 完整的 DTS 中 MIPI 相关节点配置
  2. MAX96712 完整初始化序列(包括上电时序)
  3. dmesg | grep -i "mipi\|camera\|v4l2" 完整输出
  4. S600 固件版本:cat /etc/version
  5. ISX031 的 MIPI 输出配置(Lane 数、速率、格式)

建议

  1. 优先联系 FAE:SerDes + MIPI PHY 的寄存器级调试非常依赖平台参考代码,FAE 可以提供 S600 上 MAX96712 的标准配置模板。
  2. 参考社区案例:RDK S100 调试红外摄像头 中有类似的 Lane Mapping 问题排查过程。
  3. 更新帖子:将你的排查过程和寄存器配置更新到原帖,方便 FAE 和社区大佬协助。

V4L2 架构下 MIPI 调试相对复杂,建议同步联系地瓜 FAE 获取 S600 平台的 V4L2 Camera 驱动参考代码。

建议走HBN框架

基于v4l2架构,我从i2c1的max96712更换到i2c0的max96712,目前可以正常点亮,我使用的都是从官方购买的板子,我觉得可能是硬件板子的问题,你们也可以内部排查下

恭喜问题定位!这是一个典型的 MIPI Host 实例硬件差异 问题。


问题根因总结

现象 原因分析
RX1 (mipi_host1) 4 Lane 只检测到 D0/D2 该 MIPI Host 实例的 PHY 校准或 Lane 映射存在硬件/固件问题
RX0 (mipi_host0) 4 Lane 正常工作 该实例 PHY 状态正常,Lane 映射正确
官方套件 出现此问题 不同 MIPI Host 实例的 PHY 校准参数或 PCB 走线可能存在差异

建议完善帖子内容

方便后续遇到类似问题的开发者参考,建议补充:

### 最终解决方案

**问题现象**:
- 使用 i2c1 对应的 MAX96712 (RX1) → MIPI Lane 检测失败
- 使用 i2c0 对应的 MAX96712 (RX0) → 正常工作

**排查结论**:
S600 不同 MIPI Host 实例可能存在硬件/固件差异,建议优先使用 RX0 端口。

**配置变更**:
1. 修改 DTS 中 camera 节点绑定,从 mipi_host1 改为 mipi_host0
2. 修改 I2C 总线配置,从 i2c1 改为 i2c0
3. 保持 MAX96712 Lane 配置不变 (4 Lane)

**验证结果**:
- 4 Lane 检测正常
- 图像数据正常输出

关于 HBN 框架的建议

@Marcelo 之前建议使用 HBN 框架,原因:

架构 优势 劣势
V4L2 标准 Linux 接口,兼容性好 MIPI/PHY 配置调试复杂,社区支持较少
HBN 地瓜官方推荐,配置工具完善 闭源组件较多,定制灵活性受限

建议:


后续建议

  1. 保留当前解决方案:既然 RX0 能正常工作,项目可以继续使用此配置
  2. 反馈给 FAE:将 RX1 的问题反馈给对接的技术支持,帮助官方排查硬件/固件问题
  3. 更新帖子状态:将帖子标记为已解决,方便社区检索

类似案例参考

社区中已有类似 MIPI Host 实例差异的案例:

感谢你的反馈,这对社区是非常有价值的经验沉淀!:+1: