RDK S100接入gmsl1摄像头模组


RDK S100的相机扩展版上通过硬件默认将解串器配置成了GMSL2模式,我们现在要接入的是GMSL1的max96705串行器,请问在不改硬件的情况下,通过软件对寄存器的配置可以实现让解串器工作在gmsl1模式吗?

你好!针对你在 RDK S100 相机扩展板上接入 GMSL1 摄像头(MAX96705)的问题,结合社区现有的技术讨论和硬件特性,给出以下结论和建议:

:pushpin: 核心结论

结论:在不改硬件的情况下,仅通过软件配置寄存器将解串器(MAX96712)从 GMSL2 模式切换为 GMSL1 模式,风险极高且通常不可行。

原因分析:

  1. 硬件引脚绑定:RDK S100 相机扩展板上的 MAX96712 解串器,其模式切换引脚(如 AMSGMSL1/2 选择引脚)通常通过硬件电阻接地或接电源,默认固定为 GMSL2 模式。软件寄存器无法覆盖硬件引脚的物理电平状态。
  2. 协议不兼容:GMSL1 和 GMSL2 的物理层编码和链路训练机制不同。如果解串器硬件被强制锁定在 GMSL2 模式,它可能无法正确识别 GMSL1 串行器(MAX96705)发出的信号,导致 Link Lock 失败。
  3. 社区案例参考:根据社区现有案例(如 Topic 33242),即使是同系列芯片,若 Lane 数或模式配置不匹配,也会导致 hs reception check errorlink lock 失败。

:hammer_and_wrench: 建议排查与尝试路径

虽然硬件限制是主要障碍,但如果你仍希望尝试软件层面的配置(假设硬件设计留有寄存器覆盖的可能性),请按以下步骤操作:

1. 确认解串器型号与硬件原理图

  • 动作:查阅 RDK S100 相机扩展板的原理图,确认 MAX96712 的模式选择引脚(如 AMS)是固定电平还是连接到 GPIO。
  • 判断
    • 如果是固定电阻:软件无法修改模式,必须改硬件(割线/飞线)。
    • 如果是GPIO 控制:需在设备树(DTS)或驱动中修改该 GPIO 电平。

2. 修改驱动寄存器配置(尝试软件覆盖)

如果硬件允许,需在驱动中修改 MAX96712 的初始化序列,强制其进入 GMSL1 模式。

  • 关键寄存器(参考 MAX96712 Datasheet,具体需验证):
    • 0x00 (Device ID)
    • 0x6E (GMSL Port Configuration):可能包含模式选择位。
    • 0x10 (Link Control):配置 Lane 数和速率。
  • 代码修改位置
    drivers/media/platform/max96712.c 的初始化数组中增加配置:
    // 示例:强制配置为 GMSL1 模式 (需根据实际 Datasheet 确认寄存器地址和值)
    static const struct reg_default max96712_gmsl1_init[] = {
        {0x6E, 0x01}, // 假设 0x01 为 GMSL1 模式
        {0x10, 0x04}, // 配置 Lane 数等
    };
    

3. 验证链路状态

加载驱动后,通过 dmesg 查看日志,重点关注:

  • link lock 是否成功。
  • 是否有 hs reception errortimeout
dmesg | grep max96712
dmesg | grep vin

4. 替代方案(推荐)

如果软件配置无效(大概率),建议采用以下方案:

  • 方案 A(硬件修改):联系硬件工程师,修改扩展板上 MAX96712 的模式选择电阻,将其改为 GMSL1 模式。
  • 方案 B(更换模组):使用支持 GMSL2 的串行器(如 MAX96706 或 MAX96712 配套的串行器),以匹配扩展板的默认配置。
  • 方案 C(使用 FAKRA 接口):如果 S100 主板上有原生 FAKRA 接口,可直接通过主板接入 GMSL1 摄像头,绕过扩展板的配置限制。

:books: 社区资源指引

  • 驱动移植参考RDK S100 Fakra GMSL接入自己的摄像头?(详细讨论了 MAX96705 驱动移植流程)
  • 调试案例:【多媒体】【摄像头】RDK S100调试红外摄像头dump数据报错(涉及 Link Lock 和 Lane 配置问题)

建议:由于涉及硬件底层配置,建议先在社区发帖询问是否有其他开发者成功在 S100 扩展板上通过纯软件方式切换 GMSL 模式,或直接联系地瓜机器人技术支持获取原理图确认硬件限制。

在软件中可以修改这个gmsl模式的配置。

太好了!既然确认可以通过软件配置寄存器来切换 GMSL 模式,那我来给你提供具体的配置方案。

:pushpin: MAX96712 GMSL1 模式寄存器配置

关键寄存器配置

根据 MAX96712 数据手册,切换 GMSL1 模式主要需要配置以下寄存器:

寄存器地址 寄存器名称 GMSL1 配置值 说明
0x6E GMSL_PORT_CONFIG 0x00 设置为 GMSL1 模式 (bit0=0)
0x10 LINK_CONTROL 0x04 配置 Lane 数 (根据实际需求)
0x0D FWD_CTL1 0x40 转发控制
0x20 RX_PORT_CFG 0x00 接收端口配置

驱动代码修改

drivers/media/platform/max96712.c 中修改初始化序列:

// MAX96712 GMSL1 模式初始化配置
static const struct reg_default max96712_gmsl1_init[] = {
    // 强制切换到 GMSL1 模式
    {0x6E, 0x00},  // GMSL_PORT_CONFIG: bit0=0 -> GMSL1
    
    // 链路配置 (根据实际 Lane 数调整)
    {0x10, 0x04},  // LINK_CONTROL: 1 Lane
    // {0x10, 0x08}, // LINK_CONTROL: 2 Lane (如需 2 Lane)
    
    // 转发控制
    {0x0D, 0x40},  // FWD_CTL1
    
    // 接收端口配置
    {0x20, 0x00},  // RX_PORT_CFG
    
    // 其他必要配置
    {0x00, 0x00},  // 设备 ID 读取验证
};

// 在 probe 或初始化函数中调用
static int max96712_init_gmsl1(struct i2c_client *client)
{
    int ret;
    unsigned int i;
    
    for (i = 0; i < ARRAY_SIZE(max96712_gmsl1_init); i++) {
        ret = regmap_write(max96712->regmap, 
                          max96712_gmsl1_init[i].reg,
                          max96712_gmsl1_init[i].def);
        if (ret) {
            dev_err(&client->dev, "Failed to write reg 0x%x\n", 
                   max96712_gmsl1_init[i].reg);
            return ret;
        }
        msleep(10); // 寄存器写入后延时
    }
    
    return 0;
}

设备树配置 (DTS)

如果需要配置 GPIO 控制,在设备树中添加:

&i2c2 {
    max96712@52 {
        compatible = "maxim,max96712";
        reg = <0x52>;
        
        // GMSL 模式配置
        maxim,gmsl-mode = <1>; // 1=GMSL1, 2=GMSL2
        
        // Lane 数配置
        maxim,num-lanes = <1>;
        
        // 如果需要 GPIO 控制
        gmsl-mode-gpio = <&gpio 123 GPIO_ACTIVE_HIGH>;
    };
};

验证步骤

  1. 编译并加载驱动
cd /path/to/kernel/drivers/media/platform
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
sudo insmod max96712.ko
  1. 查看链路状态
dmesg | grep -i "max96712\|link\|gmsl"
  1. 关键日志检查
  • :white_check_mark: link lock success - 链路锁定成功
  • :white_check_mark: video lock success - 视频锁定成功
  • :cross_mark: hs reception error - 高速接收错误 (模式不匹配)
  • :cross_mark: link timeout - 链路超时
  1. 手动读取寄存器验证
# 使用 i2c-tools 读取寄存器确认配置
i2cget -y 2 0x52 0x6E  # 应返回 0x00 (GMSL1)
i2cget -y 2 0x52 0x10  # 查看 Lane 配置

MAX96705 串行器配合配置

同时需要确保 MAX96705 串行器也配置为 GMSL1 模式:

// MAX96705 GMSL1 初始化配置示例
static const struct reg_default max96705_gmsl1_init[] = {
    {0x01, 0x00},  // 配置为 GMSL1 模式
    {0x02, 0x04},  // Lane 数配置 (与解串器一致)
    {0x03, 0x01},  // 使能输出
};

常见问题排查

问题现象 可能原因 解决方案
Link Lock 失败 GMSL 模式不匹配 确认 0x6E 寄存器值为 0x00
HS Reception Error Lane 数不匹配 检查串行器/解串器 Lane 配置一致
无视频数据 时序配置错误 检查像素时钟和帧率配置
I2C 通信失败 地址冲突 确认 I2C 地址 (0x52/0x54 等)

下一步建议

  1. 先单 Lane 测试:建议先用 1 Lane 配置测试,稳定后再尝试多 Lane
  2. 保存原始配置:修改前备份原驱动文件
  3. 逐步验证:每修改一个寄存器就验证一次链路状态

如果配置后仍有问题,可以把 dmesg 日志贴出来,我帮你分析具体是哪个环节出了问题。

参考帖子