7.6. i.MX 视频捕获驱动¶
7.6.1. 简介¶
Freescale i.MX5/6 包含一个图像处理单元 (IPU),该单元处理图像帧与捕获设备和显示设备之间的流动。
对于图像捕获,IPU 包含以下内部子单元
图像 DMA 控制器 (IDMAC)
摄像头串行接口 (CSI)
图像转换器 (IC)
传感器多 FIFO 控制器 (SMFC)
图像旋转器 (IRT)
视频去隔行或组合块 (VDIC)
IDMAC 是用于将图像帧传输到内存和从内存传输的 DMA 控制器。 存在各种专用的 DMA 通道用于视频捕获和显示路径。 在传输过程中,IDMAC 还能够进行垂直图像翻转、8x8 块传输(参见 IRT 描述)、在相同颜色空间内进行像素分量重新排序(例如 UYVY 到 YUYV),以及打包 <--> 平面转换。 IDMAC 还可以通过在传输期间交织偶数行和奇数行来执行简单的去隔行(无需运动补偿,这需要 VDIC)。
CSI 是后端捕获单元,通过并行、BT.656/1120 和 MIPI CSI-2 总线直接与摄像头传感器连接。
IC 处理颜色空间转换、大小调整(缩小和放大)、水平翻转以及 90/270 度旋转操作。
IC 中有三个独立的“任务”,可以同时进行转换:预处理编码、预处理取景器和后处理。 在每个任务中,转换分为三个部分:缩小部分、主要部分(放大、翻转、颜色空间转换和图形平面组合)和旋转部分。
IPU 时间共享 IC 任务操作。 时间片粒度是缩小部分中八个像素的突发、主要处理部分中一行图像、旋转部分中一帧图像。
SMFC 由四个独立的 FIFO 组成,每个 FIFO 都可以通过四个 IDMAC 通道同时将捕获的帧从传感器直接传输到内存。
IRT 执行 90 和 270 度图像旋转操作。 旋转操作一次在 8x8 像素块上进行。 此操作由 IDMAC 支持,IDMAC 与垂直翻转协调处理 8x8 块传输以及块重新排序。
VDIC 处理隔行扫描视频到逐行扫描的转换,支持不同的运动补偿模式(低、中和高运动)。 来自 VDIC 的去隔行输出帧可以发送到 IC 预处理取景器任务以进行进一步转换。 VDIC 还包含一个组合器,该组合器将两个图像平面与 alpha 混合和颜色键组合在一起。
除了 IPU 内部子单元外,还有两个 IPU 外部的单元也参与 i.MX 上的视频捕获
用于具有 MIPI CSI-2 总线接口的摄像头传感器的 MIPI CSI-2 接收器。 这是一个 Synopsys DesignWare 核心。
两个视频多路复用器,用于选择多个传感器输入以发送到 CSI。
7.6.2. 特点¶
此驱动程序的一些特点包括
可以通过媒体控制器 API 配置许多不同的流水线,这些流水线对应于 i.MX 中支持的硬件视频捕获流水线。
支持并行、BT.565 和 MIPI CSI-2 接口。
通过配置流水线到使用独立实体的多个视频捕获接口,实现并发独立流。
通过 IC 任务子设备实现缩放、颜色空间转换、水平和垂直翻转以及图像旋转。
支持多种像素格式(RGB、打包和平面 YUV、部分平面 YUV)。
VDIC 子设备支持运动补偿去隔行,具有三种运动补偿模式:低、中和高运动。 定义了允许将帧直接从 CSI 发送到 VDIC 子设备的流水线。 将来还支持通过输出/mem2mem 设备将帧从内存缓冲区发送到 VDIC。
包括一个帧间隔监视器 (FIM),它可以纠正 ADV718x 视频解码器的垂直同步问题。
7.6.3. 拓扑¶
以下显示了 i.MX6Q SabreSD 和 i.MX6Q SabreAuto 的媒体拓扑。 请参阅下一节中实体描述中的这些图。
i.MX5/6 拓扑可能与 IPUv3 CSI 视频多路复用器的上游不同,但其下游的内部 IPUv3 拓扑对于所有 i.MX5/6 平台都是通用的。 例如,SabreSD 使用 MIPI CSI-2 OV5640 传感器,需要 i.MX6 MIPI CSI-2 接收器。 但是 SabreAuto 只有并行 bt.656 总线上的 ADV7180 解码器,因此不需要 MIPI CSI-2 接收器,因此其图中缺少该接收器。
i.MX6Q SabreSD 上的媒体流水线图¶
i.MX6Q SabreAuto 上的媒体流水线图¶
7.6.4. 实体¶
7.6.5. imx6-mipi-csi2¶
这是 MIPI CSI-2 接收器实体。 它有一个接收 MIPI CSI-2 流的接收器端口(通常来自 MIPI CSI-2 摄像头传感器)。 它有四个源端口,对应于四个 MIPI CSI-2 解复用的虚拟通道输出。 可以启用多个源端口以从多个虚拟通道独立流式传输。
此实体实际上由两个子块组成。 一个是 MIPI CSI-2 核心。 这是一个 Synopsys Designware MIPI CSI-2 核心。 另一个子块是“CSI-2 到 IPU 垫片”。 该垫片充当四个虚拟通道流的解复用器,提供四个单独的并行总线,其中包含每个虚拟通道,这些通道路由到 CSI 或视频多路复用器,如下所述。
在 i.MX6 solo/dual-lite 上,所有四个虚拟通道总线都路由到两个视频多路复用器。 CSI0 和 CSI1 都可以接收任何虚拟通道,由视频多路复用器选择。
在 i.MX6 Quad 上,虚拟通道 0 路由到 IPU1-CSI0(在由视频 mux 选择后),虚拟通道 1 和 2 分别硬连线到 IPU1-CSI1 和 IPU2-CSI0,虚拟通道 3 路由到 IPU2-CSI1(再次由视频 mux 选择)。
7.6.6. ipuX_csiY_mux¶
这些是视频多路复用器。 它们有两个或多个接收器端口,可以从具有并行接口的摄像头传感器或来自 imx6-mipi-csi2 实体的 MIPI CSI-2 虚拟通道中进行选择。 它们有一个源端口,该端口路由到 CSI(ipuX_csiY 实体)。
在 i.MX6 solo/dual-lite 上,有两个视频 mux 实体。 一个位于 IPU1-CSI0 前面,用于在并行传感器和四个 MIPI CSI-2 虚拟通道中的任何一个之间进行选择(总共五个接收器端口)。 另一个 mux 位于 IPU1-CSI1 前面,同样有五个接收器端口,用于在并行传感器和四个 MIPI CSI-2 虚拟通道中的任何一个之间进行选择。
在 i.MX6 Quad 上,有两个视频 mux 实体。 一个位于 IPU1-CSI0 前面,用于在并行传感器和 MIPI CSI-2 虚拟通道 0 之间进行选择(两个接收器端口)。 另一个 mux 位于 IPU2-CSI1 前面,用于在并行传感器和 MIPI CSI-2 虚拟通道 3 之间进行选择(两个接收器端口)。
7.6.7. ipuX_csiY¶
这些是 CSI 实体。 它们有一个接收器端口,接收来自视频 mux 或来自 MIPI CSI-2 虚拟通道(如上所述)的信号。
此实体有两个源端口。 第一个源端口可以直接链接到 ipuX_vdic 实体或 ipuX_ic_prp 实体,使用不需要 IDMAC 内存缓冲区传输的硬件链接。
当直接源端口路由到 ipuX_ic_prp 实体时,CSI 的帧可以由一个或两个 IC 预处理任务处理。
当直接源端口路由到 ipuX_vdic 实体时,VDIC 将使用“高运动”模式执行运动补偿去隔行(请参阅 ipuX_vdic 实体的描述)。
第二个源端口通过 SMFC 和 IDMAC 通道将视频帧直接发送到内存缓冲区,绕过 IC 预处理。 此源端口路由到捕获设备节点,节点名称的格式为“ipuX_csiY capture”。
请注意,由于 IDMAC 源端口使用 IDMAC 通道,因此 IDMAC 通道可以在同一颜色空间内进行像素重新排序。 例如,如果 CSI 接收器端口接收 UYVY 顺序,则链接到 IDMAC 源端口的捕获设备可以按 YUYV 顺序捕获。 此外,如果 CSI 接收器端口接收打包的 YUV 格式,则捕获设备可以捕获平面 YUV 格式,例如 YUV420。
IDMAC 源端口处的 IDMAC 通道还支持简单的交织而无需运动补偿,如果在源端口的字段类型是顺序顶部到底部或底部到顶部,并且请求的捕获接口字段类型设置为交织(t-b、b-t 或不合格的交织)时,该功能将被激活。 捕获接口将强制执行与源端口字段顺序相同的字段顺序(如果源端口是 seq-bt,则为 interlaced-bt,如果源端口是 seq-tb,则为 interlaced-tb)。
有关 ipuX_csiY 生成的事件,请参阅 ref:imx_api_ipuX_csiY。
7.6.8. ipuX_csiY 中的裁剪¶
CSI 支持裁剪传入的原始传感器帧。 这在 ipuX_csiY 实体的接收器端口中实现,使用裁剪选择子设备 API。
CSI 还支持独立地在宽度和高度上进行固定的除以二的缩小。 这在 ipuX_csiY 实体的接收器端口中实现,使用合成选择子设备 API。
ipuX_csiY 源端口处的输出矩形与接收器端口处的合成矩形相同。 因此,无法协商源端口矩形,必须使用接收器端口处的合成选择 API 进行设置(如果需要 /2 缩小,否则源端口矩形等于传入矩形)。
为了给出裁剪和 /2 缩小的示例,这将把 1280x960 输入帧裁剪为 640x480,然后在两个维度上都 /2 缩小到 320x240(假设 ipu1_csi0 链接到 ipu1_csi0_mux)
media-ctl -V "'ipu1_csi0_mux':2[fmt:UYVY2X8/1280x960]"
media-ctl -V "'ipu1_csi0':0[crop:(0,0)/640x480]"
media-ctl -V "'ipu1_csi0':0[compose:(0,0)/320x240]"
7.6.9. ipuX_csiY 中的帧跳过¶
CSI 支持通过帧跳过进行帧速率抽取。 通过设置接收器和源端口处的帧间隔来指定帧速率抽取。 然后 ipuX_csiY 实体将最佳帧跳过设置应用于 CSI,以在源端口处实现所需的帧速率。
以下示例将假定的传入 60 Hz 帧速率在 IDMAC 输出源端口处降低一半
media-ctl -V "'ipu1_csi0':0[fmt:UYVY2X8/640x480@1/60]"
media-ctl -V "'ipu1_csi0':2[fmt:UYVY2X8/640x480@1/30]"
7.6.10. ipuX_csiY 中的帧间隔监视器¶
请参阅 ref:imx_api_FIM。
7.6.11. ipuX_vdic¶
VDIC 执行运动补偿去隔行,具有三种运动补偿模式:低、中和高运动。 该模式由菜单控制 V4L2_CID_DEINTERLACING_MODE 指定。 VDIC 有两个接收器端口和一个源端口。
直接接收器端口接收来自 ipuX_csiY 直接端口的信号。 通过此链接,VDIC 只能在高运动模式下运行。
当激活 IDMAC 接收器端口时,它会接收来自输出或 mem2mem 设备节点的信号。 通过此流水线,VDIC 还可以以低和中等模式运行,因为这些模式需要从内存缓冲区接收帧。 请注意,尚未实现输出或 mem2mem 设备,因此此接收器端口当前没有链接。
源端口路由到 IC 预处理实体 ipuX_ic_prp。
7.6.12. ipuX_ic_prp¶
这是 IC 预处理实体。 它充当路由器,将其接收器端口的数据路由到一个或两个源端口。
此实体有一个接收器端口。 接收器端口可以接收来自 ipuX_csiY 直接端口或来自 ipuX_vdic 的信号。
此实体有两个源端口。 一个源端口路由到预处理编码任务实体 (ipuX_ic_prpenc),另一个源端口路由到预处理取景器任务实体 (ipuX_ic_prpvf)。 如果接收器端口接收来自 ipuX_csiY 的信号,则可以同时激活两个源端口。 如果接收器端口接收来自 ipuX_vdic 的信号,则只能激活到预处理取景器任务实体的源端口(来自 VDIC 的帧只能由预处理取景器任务处理)。
7.6.13. ipuX_ic_prpenc¶
这是 IC 预处理编码实体。 它有一个来自 ipuX_ic_prp 的接收器端口和一个源端口。 源端口路由到捕获设备节点,节点名称的格式为“ipuX_ic_prpenc capture”。
此实体执行 IC 预处理编码任务操作:颜色空间转换、大小调整(缩小和放大)、水平和垂直翻转以及 90/270 度旋转。 通过标准 V4L2 控件提供翻转和旋转。
与 ipuX_csiY IDMAC 源一样,此实体还支持简单的去隔行(无需运动补偿)和像素重新排序。
7.6.14. ipuX_ic_prpvf¶
这是 IC 预处理取景器实体。 它有一个来自 ipuX_ic_prp 的接收器端口和一个源端口。 源端口路由到捕获设备节点,节点名称的格式为“ipuX_ic_prpvf capture”。
此实体在操作上与 ipuX_ic_prpenc 相同,具有相同的大小调整和 CSC 操作以及翻转/旋转控件。 如果 ipuX_ic_prp 接收来自 ipuX_vdic 的信号,它将接收并处理来自 ipuX_vdic 的去隔行帧。
与 ipuX_csiY IDMAC 源一样,此实体支持简单的交织而无需运动补偿。 但是,请注意,如果流水线中包含 ipuX_vdic(ipuX_ic_prp 接收来自 ipuX_vdic 的信号),则无法在 ipuX_ic_prpvf 中使用交织,因为 ipuX_vdic 已经执行了去隔行(具有运动补偿),因此来自 ipuX_vdic 的字段类型输出只能为 none(逐行扫描)。
7.6.15. 捕获流水线¶
以下描述了流水线支持的各种用例。
显示的链接不包括后端传感器、视频 mux 或 mipi csi-2 接收器链接。 这取决于传感器接口的类型(并行或 mipi csi-2)。 因此,这些流水线以以下内容开头
sensor -> ipuX_csiY_mux -> ...
对于并行传感器,或者
sensor -> imx6-mipi-csi2 -> (ipuX_csiY_mux) -> ...
对于 mipi csi-2 传感器。 imx6-mipi-csi2 接收器可能需要先路由到视频 mux (ipuX_csiY_mux),然后再发送到 CSI,具体取决于 mipi csi-2 虚拟通道,因此 ipuX_csiY_mux 显示在括号中。
7.6.16. 未处理的视频捕获:¶
通过 ipuX_csiY IDMAC 源端口直接将帧从传感器发送到摄像头设备接口节点,无需转换
-> ipuX_csiY:2 -> ipuX_csiY capture
7.6.17. IC 直接转换:¶
此流水线使用预处理编码实体将帧直接从 CSI 路由到 IC,以执行缩放到 1024x1024 分辨率、CSC、翻转和图像旋转
-> ipuX_csiY:1 -> 0:ipuX_ic_prp:1 -> 0:ipuX_ic_prpenc:1 -> ipuX_ic_prpenc capture
7.6.18. 运动补偿去隔行:¶
此流水线将帧从 CSI 直接端口路由到 VDIC 实体,以支持运动补偿去隔行(仅限高运动模式)、缩放到 1024x1024、CSC、翻转和旋转
-> ipuX_csiY:1 -> 0:ipuX_vdic:2 -> 0:ipuX_ic_prp:2 -> 0:ipuX_ic_prpvf:1 -> ipuX_ic_prpvf capture
7.6.19. 使用说明¶
为了帮助配置以及与仅从视频设备节点访问控件的 V4L2 应用程序向后兼容,捕获设备接口从当前流水线中的活动实体继承控件,因此可以直接从子设备或从活动捕获设备接口访问控件。 例如,FIM 控件可以从 ipuX_csiY 子设备或从活动捕获设备访问。
以下是 Sabre* 参考板的特定使用说明
7.6.20. 带有 OV5642 和 OV5640 的 i.MX6Q SabreLite¶
此平台需要带有并行摄像头接口的 OmniVision OV5642 模块和带有 MIPI CSI-2 接口的 OV5640 模块。 这两个模块都可以从 Boundary Devices 获得
请注意,如果只有一个摄像头模块可用,则可以在设备树中禁用另一个传感器节点。
OV5642 模块连接到 i.MX 内部视频 mux 到 IPU1 CSI0 上的并行总线输入。 它的 i2c 总线连接到 i2c 总线 2。
MIPI CSI-2 OV5640 模块连接到 i.MX 内部 MIPI CSI-2 接收器,并且来自接收器的四个虚拟通道输出的路由方式如下:vc0 到 IPU1 CSI0 mux,vc1 直接到 IPU1 CSI1,vc2 直接到 IPU2 CSI0,vc3 到 IPU2 CSI1 mux。 OV5640 还连接到 SabreLite 上的 i2c 总线 2,因此 OV5642 和 OV5640 不得共享相同的 i2c 从设备地址。
以下基本示例配置了两个传感器的未处理视频捕获流水线。 OV5642 路由到 ipu1_csi0,OV5640(在 MIPI CSI-2 虚拟通道 1 上传输,它是 imx6-mipi-csi2 端口 2)路由到 ipu1_csi1。 两个传感器都配置为输出 640x480,OV5642 输出 YUYV2X8,OV5640 输出 UYVY2X8
# Setup links for OV5642
media-ctl -l "'ov5642 1-0042':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Setup links for OV5640
media-ctl -l "'ov5640 1-0040':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':2 -> 'ipu1_csi1':0[1]"
media-ctl -l "'ipu1_csi1':2 -> 'ipu1_csi1 capture':0[1]"
# Configure pads for OV5642 pipeline
media-ctl -V "'ov5642 1-0042':0 [fmt:YUYV2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:YUYV2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/640x480 field:none]"
# Configure pads for OV5640 pipeline
media-ctl -V "'ov5640 1-0040':0 [fmt:UYVY2X8/640x480 field:none]"
media-ctl -V "'imx6-mipi-csi2':2 [fmt:UYVY2X8/640x480 field:none]"
media-ctl -V "'ipu1_csi1':2 [fmt:AYUV32/640x480 field:none]"
然后可以在捕获设备节点“ipu1_csi0 capture”和“ipu1_csi1 capture”上独立开始流式传输。 v4l2-ctl 工具可用于在捕获设备节点上选择任何支持的 YUV 像素格式,包括平面。
7.6.21. 带有 ADV7180 解码器的 i.MX6Q SabreAuto¶
在 i.MX6Q SabreAuto 上,板载 ADV7180 SD 解码器连接到内部视频 mux 到 IPU1 CSI0 上的并行总线输入。
以下示例配置了一条流水线以从 ADV7180 视频解码器捕获,假设 NTSC 720x480 输入信号,使用简单的交织(未经转换且没有运动补偿)。 adv7180 必须输出顺序或交替字段(对于 NTSC,字段类型为“seq-bt”,或者为“alternate”)
# Setup links
media-ctl -l "'adv7180 3-0021':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 3-0021':0 [fmt:UYVY2X8/720x480 field:seq-bt]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/720x480]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/720x480]"
# Configure "ipu1_csi0 capture" interface (assumed at /dev/video4)
v4l2-ctl -d4 --set-fmt-video=field=interlaced_bt
然后可以在 /dev/video4 上开始流式传输。 v4l2-ctl 工具还可以用于在 /dev/video4 上选择任何支持的 YUV 像素格式。
此示例配置了一条流水线以从 ADV7180 视频解码器捕获,假设 PAL 720x576 输入信号,并具有运动补偿去隔行。 adv7180 必须输出顺序或交替字段(对于 PAL,字段类型为“seq-tb”,或者为“alternate”)。
# Setup links
media-ctl -l "'adv7180 3-0021':0 -> 'ipu1_csi0_mux':1[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_vdic':0[1]"
media-ctl -l "'ipu1_vdic':2 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':2 -> 'ipu1_ic_prpvf':0[1]"
media-ctl -l "'ipu1_ic_prpvf':1 -> 'ipu1_ic_prpvf capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 3-0021':0 [fmt:UYVY2X8/720x576 field:seq-tb]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/720x576]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
v4l2-ctl -d2 --set-fmt-video=field=none
然后可以在 /dev/video2 上开始流式传输。 v4l2-ctl 工具还可以用于在 /dev/video2 上选择任何支持的 YUV 像素格式。
此平台接受到 Ain1(连接器 J42)上 ADV7180 的复合视频模拟输入。
7.6.22. 带有 ADV7180 解码器的 i.MX6DL SabreAuto¶
在 i.MX6DL SabreAuto 上,板载 ADV7180 SD 解码器连接到内部视频 mux 到 IPU1 CSI0 上的并行总线输入。
以下示例配置了一条流水线以从 ADV7180 视频解码器捕获,假设 NTSC 720x480 输入信号,使用简单的交织(未经转换且没有运动补偿)。 adv7180 必须输出顺序或交替字段(对于 NTSC,字段类型为“seq-bt”,或者为“alternate”)
# Setup links
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x480 field:seq-bt]"
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x480]"
media-ctl -V "'ipu1_csi0':2 [fmt:AYUV32/720x480]"
# Configure "ipu1_csi0 capture" interface (assumed at /dev/video0)
v4l2-ctl -d0 --set-fmt-video=field=interlaced_bt
然后可以在 /dev/video0 上开始流式传输。 v4l2-ctl 工具还可以用于在 /dev/video0 上选择任何支持的 YUV 像素格式。
此示例配置了一条流水线以从 ADV7180 视频解码器捕获,假设 PAL 720x576 输入信号,并具有运动补偿去隔行。 adv7180 必须输出顺序或交替字段(对于 PAL,字段类型为“seq-tb”,或者为“alternate”)。
# Setup links
media-ctl -l "'adv7180 4-0021':0 -> 'ipu1_csi0_mux':4[1]"
media-ctl -l "'ipu1_csi0_mux':5 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_vdic':0[1]"
media-ctl -l "'ipu1_vdic':2 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':2 -> 'ipu1_ic_prpvf':0[1]"
media-ctl -l "'ipu1_ic_prpvf':1 -> 'ipu1_ic_prpvf capture':0[1]"
# Configure pads
media-ctl -V "'adv7180 4-0021':0 [fmt:UYVY2X8/720x576 field:seq-tb]"
media-ctl -V "'ipu1_csi0_mux':5 [fmt:UYVY2X8/720x576]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/720x576]"
media-ctl -V "'ipu1_vdic':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prp':2 [fmt:AYUV32/720x576 field:none]"
media-ctl -V "'ipu1_ic_prpvf':1 [fmt:AYUV32/720x576 field:none]"
# Configure "ipu1_ic_prpvf capture" interface (assumed at /dev/video2)
v4l2-ctl -d2 --set-fmt-video=field=none
然后可以在 /dev/video2 上开始流式传输。 v4l2-ctl 工具还可以用于在 /dev/video2 上选择任何支持的 YUV 像素格式。
此平台接受到 Ain1(连接器 J42)上 ADV7180 的复合视频模拟输入。
7.6.23. 带有 MIPI CSI-2 OV5640 的 i.MX6Q SabreSD¶
与 i.MX6Q SabreLite 类似,i.MX6Q SabreSD 在 IPU1 CSI0 上支持并行接口 OV5642 模块,以及 MIPI CSI-2 OV5640 模块。OV5642 连接到 i2c 总线 1,OV5640 连接到 i2c 总线 2。
SabreSD 的设备树包含了并行 OV5642 和 MIPI CSI-2 OV5640 的 OF 图,但截至本文撰写之时,仅 MIPI CSI-2 OV5640 经过测试,因此 OV5642 节点当前被禁用。OV5640 模块连接到 MIPI 连接器 J5。连接到 SabreSD 板的 OV5640 模块的 NXP 部件号为 H120729。
以下示例配置了一个未处理的视频捕获管道,从 OV5640 捕获数据,并通过 MIPI CSI-2 虚拟通道 0 传输。
# Setup links
media-ctl -l "'ov5640 1-003c':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':1 -> 'ipu1_csi0_mux':0[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':2 -> 'ipu1_csi0 capture':0[1]"
# Configure pads
media-ctl -V "'ov5640 1-003c':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'imx6-mipi-csi2':1 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0_mux':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0':0 [fmt:AYUV32/640x480]"
然后可以在“ipu1_csi0 capture”节点上开始流传输。可以使用 v4l2-ctl 工具在捕获设备节点上选择任何支持的像素格式。
要确定与“ipu1_csi0 capture”对应的 /dev/video 节点是什么,请执行以下操作:
media-ctl -e "ipu1_csi0 capture"
/dev/video0
/dev/video0 在本例中是流传输元素。
通过 v4l2-ctl 启动流传输:
v4l2-ctl --stream-mmap -d /dev/video0
通过 Gstreamer 启动流传输并将内容发送到显示器:
gst-launch-1.0 v4l2src device=/dev/video0 ! kmssink
以下示例配置了一个直接转换管道,从 OV5640 捕获数据,并通过 MIPI CSI-2 虚拟通道 0 传输。它还显示了 IC 输出的色彩空间转换和缩放。
# Setup links
media-ctl -l "'ov5640 1-003c':0 -> 'imx6-mipi-csi2':0[1]"
media-ctl -l "'imx6-mipi-csi2':1 -> 'ipu1_csi0_mux':0[1]"
media-ctl -l "'ipu1_csi0_mux':2 -> 'ipu1_csi0':0[1]"
media-ctl -l "'ipu1_csi0':1 -> 'ipu1_ic_prp':0[1]"
media-ctl -l "'ipu1_ic_prp':1 -> 'ipu1_ic_prpenc':0[1]"
media-ctl -l "'ipu1_ic_prpenc':1 -> 'ipu1_ic_prpenc capture':0[1]"
# Configure pads
media-ctl -V "'ov5640 1-003c':0 [fmt:UYVY2X8/640x480]"
media-ctl -V "'imx6-mipi-csi2':1 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0_mux':2 [fmt:UYVY2X8/640x480]"
media-ctl -V "'ipu1_csi0':1 [fmt:AYUV32/640x480]"
media-ctl -V "'ipu1_ic_prp':1 [fmt:AYUV32/640x480]"
media-ctl -V "'ipu1_ic_prpenc':1 [fmt:ARGB8888_1X32/800x600]"
# Set a format at the capture interface
v4l2-ctl -d /dev/video1 --set-fmt-video=pixelformat=RGB3
然后可以在“ipu1_ic_prpenc capture”节点上开始流传输。
要确定与“ipu1_ic_prpenc capture”对应的 /dev/video 节点是什么,请执行以下操作:
media-ctl -e "ipu1_ic_prpenc capture"
/dev/video1
/dev/video1 在本例中是流传输元素。
通过 v4l2-ctl 启动流传输:
v4l2-ctl --stream-mmap -d /dev/video1
通过 Gstreamer 启动流传输并将内容发送到显示器:
gst-launch-1.0 v4l2src device=/dev/video1 ! kmssink
7.6.24. 已知问题¶
当在接近 IC 调整器限制 1024x1024 的捕获分辨率下使用 90 或 270 度旋转控制,并结合平面像素格式(YUV420、YUV422p)时,帧捕获通常会失败,IDMAC 通道不会产生帧结束中断。为了解决这个问题,当需要 90 或 270 度旋转时,请使用较低的分辨率和/或打包格式(YUYV、RGB3 等)。
7.6.25. 文件列表¶
drivers/staging/media/imx/ include/media/imx.h include/linux/imx-media.h