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 实现。
连接过程分为两种方式:
- 静态连接(设备树中写死)使用设备树(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;
- 动态连接(用户态设置)
用户可以通过 media-ctl 工具创建连接:
media-ctl -l "'sensor 1-001a':0 -> 'csi':0 [1]"
比如嵌入式 ISP 模块支持多个 sensor,你可以手动切换连接路径。
总结一句话:
sensor、CSI、ISP 之间的连接关系是通过 media pad 和 link 建立的,而连接的过程可以由设备树自动生成,也可以在用户态动态设置。
浙公网安备 33010602011771号