V4L2 subdev 和 media entity的关系

问题 1: V4L2 subdev 和 media entity 的关系?

V4L2 子设备(v4l2_subdev)和 Media Entity(media_entity)是两个紧密关联的结构体,用于表示视频设备内部的模块和它们之间的连接拓扑。
v4l2_subdev:表示一个功能节点,比如 sensor、CSI、ISP 等,负责具体操作(如 start_streaming、set_fmt 等);
media_entity:是 media controller 框架中的抽象节点,用于描述设备间的数据连接关系(可以看作是“图中的一个节点”);

每个 v4l2_subdev 都内嵌一个 media_entity 成员;
通过 media_pad(pads)和 media_link(links)建立 entity 之间的连接,构成整个视频 pipeline;

简单说:v4l2_subdev 表示“谁来干活”,media_entity 表示“这些模块之间怎么连”。

举个例子(图的形式):

[sensor] ---> [CSI] ---> [ISP] ---> [Video Output]

每个方块 = v4l2_subdev(内部有 media_entity) 箭头 = media_link(通过 pad 连接)

问题 2:sink/source pad 是怎么被 sensor 或 ISP 自动连接的?

在 Linux 的 V4L2 媒体框架中,subdev 之间的连接通过 media pads 和 media links 实现。
连接过程分为两种方式:

  1. 静态连接(设备树中写死)使用设备树(Device Tree)描述连接拓扑;
    比如:
csi@12340000 {
    ports {
        port@0 {
            reg = <0>; // sink pad
            csi_in: endpoint {
                remote-endpoint = <&sensor_out>;
            };
        };
    };
};

sensor@1a {
    ports {
        port@1 {
            reg = <1>; // source pad
            sensor_out: endpoint {
                remote-endpoint = <&csi_in>;
            };
        };
    };
};

内核在 v4l2_async_notifier 注册/匹配完成后,会自动通过 endpoint 节点生成 media link;

连接的是:sensor.subdev 的 source pad → csi.subdev 的 sink pad;

  1. 动态连接(用户态设置)

用户可以通过 media-ctl 工具创建连接:

media-ctl -l "'sensor 1-001a':0 -> 'csi':0 [1]"

比如嵌入式 ISP 模块支持多个 sensor,你可以手动切换连接路径。

总结一句话:

sensor、CSI、ISP 之间的连接关系是通过 media pad 和 link 建立的,而连接的过程可以由设备树自动生成,也可以在用户态动态设置。

posted @ 2025-04-23 19:16  chivalrySun  阅读(103)  评论(0)    收藏  举报