先给结论:从框架看,一条 MAX96712 GMSL link 收两个 VC、生成两个独立 video 节点是官方已用过的形态(D457 的 depth+color 双流就是一台相机两条流);但要落到 M4-G,仍需要自己写 sensor 驱动 + dtbo,不能靠现有 max9295/ar0820 节点。
1. 单链路双 VC 是否支持
支持方向和现成依据:官方 serdes_ops 里有按 pipe 配置的 set_pipe_ex(dev, sen_dev, pipe, vc_id, data_type),以及 get_pipe_id(vc_id)/release_pipe_id(pipe_id),注释明确写“d457 sensor 在出流前使用”,D457 就是同一加串器下 depth 与 color 两路 vc 各占一个 pipe。所以不必一条流占一个解串器输入口。需要你核实的一点:4.0.5 分支里 MAX96712 驱动的这几个 ops(尤其每 link 能分配几个 pipe、vc 与 pipe 的映射)是否已实现到位,直接在源码里看实现,不要只看声明。
2. 参考驱动与 DTBO
结构参考 0820C(HBN 侧 sensor/serial/deserial 三层目录),双流形态参考 D457 的 v0p5_d457_2v_depth_color.dtbo 示例。M4-G 两个节点写在同一 i2c 节点下,字段对应关系如下(值为你给的规格,语法照官方示例):
fpga@11 { /* reg = map 后地址, addr = 实际地址 */
compatible = "d-robotics,m4g";
reg = <0x11>; addr = <0x11>;
width = <2560>; height = <960>;
data_type = <0x2a>; lane_num = <4>; vc_id = <0>;
mfp-reset = <0>; mfp-trigger = <0>; /* 触发走 MFP0 */
d-robotics,serdes-ser-device = <&ser_a>;
d-robotics,serdes-dser-device = <&dser>;
status = "okay";
port { cam_to_mipi_csi4: endpoint {
remote-endpoint = <&mipi_csi4_from_cam_0>;
virtual-channel = <0>; }; };
};
RGB 节点同结构,改 height=1056、data_type=0x1e、vc_id=1、virtual-channel=1。注意两点:lane_num 在 serdes_ctx 里指“sensor 到加串器”的 MIPI lane 数,不是解串器到 SoC 的 CSI lane,别照抄 D457 的 2;解串器到 CSI 的通道由 dser 与 CSI 节点自身的配置决定。另外两个节点共用同一个 ser_dev,probe 顺序、map_addr 重复调用、MFP 复位都要防重复执行,建议只在一个“主”节点做串行器/FPGA 初始化,另一个只做 pipe/vc。
3. 职责划分
符合框架:加串器、解串器都不注册为 v4l2 subdev,只给 sensor 驱动提供 ops。所以解串器侧由 dser 的 init/setup_link/set_pipe/set_stream 完成,加串器侧由 ser 的 map_addr/init/set_pipe/enable_mfp 完成,触发用 enable_mfp(..., mfp_trigger)。FPGA 的 0x2000 开流属于相机侧业务,放在 sensor 驱动 s_stream 里通过 0x11 客户端写,注意 i2c 总线号要从原平台的 4 换成你这块板实际的 3。
4. 0x40/0x11 旧节点
关键限制:官方说明 DTBO 对 dtb 只支持增/改,不支持删减,所以不能“删掉”这两个节点,只能把它们的 status 改成 disabled;如果 overlay 改属性不生效,就改基础 dts 重编 dtb。原因是 ar0820@11 的 reg 与你的 FPGA 节点同为 0x11,max9295@40 与 MAX96717 同为 0x40,同时 enabled 会互相抢同一地址、probe 到错误驱动。改完按文档把 dtbo 放 /boot/overlays 并在 config.txt 指定。
参考:Camera 点亮(V4L2 GMSL SerDes 与 sensor dtbo)、Camsys 使用方式。
5. 先 V4L2,DMSDK 后接
建议先 V4L2:v4l2-ctl 能直接看 fourcc 和帧,适合先证明双 VC 出流稳定。DMSDK 属厂商侧 SDK,RDK 公开文档里没有它的说明,输入格式和对 /dev/video* 的依赖要以迈尔威视文档为准;可先参考官方 D457 + librealsense 的做法(同样是 SDK 依赖固定 video 节点,需要手动做软链接),但 D457 的节点名和 vc 不能套到 M4-G。
6. 资料清单与流程
按 bring-up 顺序推进:①串行器链路 lock → ②0x40/0x11 可达 → ③两个 sensor subdev probe → ④两个 video 节点与格式 → ⑤DMSDK 后处理。需要你提供的资料:M4-G 的详细数据手册或寄存器手册(FPGA 0x2000 附近开流、帧率、触发时序)、MAX96717 初始化序列、ToF 输出是 16-bit depth 还是 RAW8 phase(你写 RAW8/0x2A,需确认 DMSDK 是否吃这个格式)、两路是否要求严格同步、扩展板原理图与 RX4 对应关系。若后续需要联合定位 link/VC 或做项目级适配,论坛这边可以先按资料梳理,具体对接可走 DGP 项目对接与技术支持。
还想确认一点:FPGA 的 0x2000 是整个模组一起开流,还是 VC0/VC1 各自独立使能?这决定两个 sensor 节点的 s_stream 会不会互相打断。