V4L2与MIPI CSI2虚拟通道:驱动开发及内核支持问询
MIPI CSI2虚拟通道在新版Linux内核驱动中的实现方案
一、新版内核添加CSI2虚拟通道支持的方法
旧的V4L2_MBUS_CSI2_CHANNEL_*常量被移除,是因为内核社区将虚拟通道配置从固定常量迁移到了更灵活的媒体控制器框架与驱动私有逻辑中,并非取消虚拟通道支持。具体实现步骤如下:
- 在Sensor驱动中指定虚拟通道:
在sensor驱动的set_fmt回调里,通过私有结构体维护当前输出流对应的虚拟通道号,同时配置sensor硬件输出对应VC。比如可以将sensor的源pad index与VC号一一绑定(pad0对应VC0,pad1对应VC1等)。 - 在CSI2接收端驱动中完成VC与pad的绑定:
修改CSI2接收驱动(如AM625的ticsi2rx)的link_setup回调,当媒体控制器建立sensor与接收端的pad链接时,获取sensor传递的VC信息,配置硬件寄存器将对应VC绑定到指定的源pad。 - 代码示例(伪代码):
// Sensor驱动中设置虚拟通道 static int my_sensor_set_fmt(struct v4l2_subdev *sd, struct v4l2_subdev_state *state, struct v4l2_subdev_format *fmt) { struct my_sensor *sensor = to_my_sensor(sd); // 按pad index映射虚拟通道 sensor->csi2_vc = fmt->pad; // 配置sensor硬件输出对应VC my_sensor_hw_set_vc(sensor, sensor->csi2_vc); return 0; } // CSI2接收端驱动绑定VC到pad static int ticsi2rx_link_setup(struct media_entity *entity, const struct media_pad *local, const struct media_pad *remote, u32 flags) { struct ticsi2rx_dev *dev = to_ticsi2rx_dev(entity); struct my_sensor *sensor = to_my_sensor(remote->entity); // 硬件层面绑定VC到指定pad ticsi2rx_hw_bind_vc_to_pad(dev, local->index, sensor->csi2_vc); return 0; }
二、内核中CSI2虚拟通道的支持范围
并非仅i.MX8系列有虚拟通道支持,主流平台的内核驱动均包含相关实现:
- AM625的
ticsi2rx和csi-bridge驱动的4个源pad就是为4个虚拟通道设计的,只是文档未明确映射关系,查看驱动硬件配置代码可发现,通常pad index与VC号一一对应; - 高通平台的
msm_csi、Rockchip平台的rk_csi、Jetson平台的tegra_csi驱动均支持多虚拟通道,可通过设备树属性或媒体控制器链接配置完成VC绑定; - 旧常量被移除的核心原因是内核社区希望让虚拟通道配置更灵活,适配不同硬件的绑定逻辑,而非取消该功能。
内容的提问来源于stack exchange,提问作者Michał Fita
相关产品推荐
相关产品推荐

