7.5. i.MX 视频捕获驱动

7.5.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 任务操作。时间片粒度为缩小部分中的 8 个像素的突发、主处理部分中的 1 条图像线、旋转部分中的 1 个图像帧。

SMFC 由四个独立的 FIFO 组成,每个 FIFO 可以通过四个 IDMAC 通道将捕获的帧从传感器直接并发地传输到内存。

IRT 执行 90 度和 270 度图像旋转操作。旋转操作一次在 8x8 像素块上执行。IDMAC 支持此操作,它与垂直翻转协调处理 8x8 块传输以及块重新排序。

VDIC 处理隔行视频到逐行的转换,支持不同的运动补偿模式(低运动、中运动和高运动)。来自 VDIC 的去隔行输出帧可以发送到 IC 预处理取景器任务以进行进一步的转换。VDIC 还包含一个组合器,该组合器将两个图像平面组合在一起,并具有 Alpha 混合和颜色键控。

除了 IPU 内部子单元外,还有两个位于 IPU 外部的单元也参与 i.MX 上的视频捕获

  • 用于具有 MIPI CSI-2 总线接口的摄像头传感器的 MIPI CSI-2 接收器。这是一个 Synopsys DesignWare 内核。

  • 两个视频多路复用器,用于选择多个传感器输入以发送到 CSI。

有关更多信息,请参阅 i.MX5/6 参考手册的最新版本 [1][2]

7.5.2. 功能

此驱动程序的一些功能包括

  • 可以通过媒体控制器 API 配置许多不同的管道,这些管道与 i.MX 中支持的硬件视频捕获管道相对应。

  • 支持并行、BT.565 和 MIPI CSI-2 接口。

  • 通过使用独立的实体配置到多个视频捕获接口的管道,实现并发的独立流。

  • 通过 IC 任务子设备进行缩放、色彩空间转换、水平和垂直翻转以及图像旋转。

  • 支持许多像素格式(RGB、打包和平面 YUV、部分平面 YUV)。

  • VDIC 子设备支持运动补偿去隔行,具有三种运动补偿模式:低运动、中运动和高运动。定义的管道允许直接从 CSI 将帧发送到 VDIC 子设备。将来还可以支持通过输出/mem2mem 设备从内存缓冲区将帧发送到 VDIC。

  • 包括一个帧间隔监视器 (FIM),它可以纠正 ADV718x 视频解码器的垂直同步问题。

7.5.3. 拓扑

以下显示了 i.MX6Q SabreSD 和 i.MX6Q SabreAuto 的媒体拓扑。请参考下一节中的实体描述中的这些图。

i.MX5/6 拓扑在 IPUv3 CSI 视频多路复用器的上游可能不同,但从那里开始的内部 IPUv3 拓扑对于所有 i.MX5/6 平台都是通用的。例如,具有 MIPI CSI-2 OV5640 传感器的 SabreSD 需要 i.MX6 MIPI CSI-2 接收器。但是 SabreAuto 只有并行 bt.656 总线上的 ADV7180 解码器,因此不需要 MIPI CSI-2 接收器,因此在其图中缺少它。

Diagram of the i.MX6Q SabreSD media pipeline topology

i.MX6Q SabreSD 上的媒体管道图

Diagram of the i.MX6Q SabreAuto media pipeline topology

i.MX6Q SabreAuto 上的媒体管道图

7.5.4. 实体

7.5.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(经过视频多路复用器选择后),虚拟通道 1 和 2 分别硬连线到 IPU1-CSI1 和 IPU2-CSI0,虚拟通道 3 路由到 IPU2-CSI1(同样由视频多路复用器选择)。

7.5.6. ipuX_csiY_mux

这些是视频多路复用器。它们有两个或多个接收端焊盘,用于选择来自并行接口的摄像头传感器或来自 imx6-mipi-csi2 实体的 MIPI CSI-2 虚拟通道。它们有一个单独的源端焊盘,路由到 CSI(ipuX_csiY 实体)。

在 i.MX6 solo/dual-lite 上,有两个视频多路复用器实体。一个位于 IPU1-CSI0 的前面,用于在并行传感器和四个 MIPI CSI-2 虚拟通道中的任何一个之间进行选择(总共五个接收端焊盘)。另一个多路复用器位于 IPU1-CSI1 的前面,同样有五个接收端焊盘,用于在并行传感器和四个 MIPI CSI-2 虚拟通道中的任何一个之间进行选择。

在 i.MX6 Quad 上,有两个视频多路复用器实体。一个位于 IPU1-CSI0 的前面,用于在并行传感器和 MIPI CSI-2 虚拟通道 0 之间进行选择(两个接收端焊盘)。另一个多路复用器位于 IPU2-CSI1 的前面,用于在并行传感器和 MIPI CSI-2 虚拟通道 3 之间进行选择(两个接收端焊盘)。

7.5.7. ipuX_csiY

这些是 CSI 实体。它们有一个单独的接收端焊盘,接收来自视频多路复用器或如上所述的 MIPI CSI-2 虚拟通道的数据。

此实体有两个源端焊盘。第一个源端焊盘可以使用不需要 IDMAC 内存缓冲区传输的硬件链路,直接链接到 ipuX_vdic 实体或 ipuX_ic_prp 实体。

当直接源端焊盘路由到 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,则为隔行-bt,如果源端焊盘为 seq-tb,则为隔行-tb)。

有关 ipuX_csiY 生成的事件,请参阅 ref:imx_api_ipuX_csiY

7.5.8. ipuX_csiY 中的裁剪

CSI 支持裁剪传入的原始传感器帧。这是在接收端焊盘的 ipuX_csiY 实体中实现的,使用了裁剪选择子设备 API。

CSI 还支持在宽度和高度上独立地进行固定除以 2 的降采样。这是在接收端焊盘的 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.5.9. ipuX_csiY 中的帧跳过

CSI 支持通过帧跳过进行帧速率抽取。帧速率抽取是通过设置接收端和源端焊盘的帧间隔来指定的。然后,ipuX_csiY 实体将应用最佳帧跳过设置到 CSI,以在源端焊盘上实现所需的帧速率。

以下示例将 IDMAC 输出源端焊盘上的假定传入 60 Hz 帧速率减半。

media-ctl -V "'ipu1_csi0':0[fmt:UYVY2X8/640x480@1/60]"
media-ctl -V "'ipu1_csi0':2[fmt:UYVY2X8/640x480@1/30]"

7.5.10. ipuX_csiY 中的帧间隔监视器

请参阅 ref:imx_api_FIM

7.5.11. ipuX_vdic

VDIC 执行运动补偿去隔行处理,具有三种运动补偿模式:低运动、中运动和高运动。该模式使用菜单控件 V4L2_CID_DEINTERLACING_MODE 指定。VDIC 有两个接收端焊盘和一个源端焊盘。

直接接收端焊盘从 ipuX_csiY 直接焊盘接收数据。通过此链接,VDIC 只能在高运动模式下运行。

当激活 IDMAC 接收端焊盘时,它会从输出或 mem2mem 设备节点接收数据。使用此管道,VDIC 也可以在低和中模式下运行,因为这些模式需要从内存缓冲区接收帧。请注意,尚未实现输出或 mem2mem 设备,因此此接收端焊盘当前没有链接。

源端焊盘路由到 IC 预处理实体 ipuX_ic_prp。

7.5.12. ipuX_ic_prp

这是 IC 预处理实体。它充当路由器,将其接收端焊盘的数据路由到一个或两个源端焊盘。

此实体有一个单独的接收端焊盘。接收端焊盘可以从 ipuX_csiY 直接焊盘或从 ipuX_vdic 接收数据。

此实体有两个源端焊盘。一个源端焊盘路由到预处理编码任务实体 (ipuX_ic_prpenc),另一个路由到预处理取景器任务实体 (ipuX_ic_prpvf)。如果接收端焊盘正在从 ipuX_csiY 接收数据,则可以同时激活两个源端焊盘。如果接收端焊盘正在从 ipuX_vdic 接收数据,则只能激活到预处理取景器任务实体的源端焊盘(来自 VDIC 的帧只能由预处理取景器任务处理)。

7.5.13. ipuX_ic_prpenc

这是 IC 预处理编码实体。它有一个来自 ipuX_ic_prp 的单独接收端焊盘和一个单独的源端焊盘。源端焊盘路由到捕获设备节点,节点名称格式为“ipuX_ic_prpenc capture”。

此实体执行 IC 预处理编码任务操作:色彩空间转换、调整大小(降采样和升采样)、水平和垂直翻转以及 90/270 度旋转。翻转和旋转通过标准 V4L2 控件提供。

与 ipuX_csiY IDMAC 源一样,此实体还支持简单的无运动补偿去隔行和像素重新排序。

7.5.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.5.15. 捕获管道

以下描述了管道支持的各种用例。

显示的链接不包括后端传感器、视频多路复用器或 mipi csi-2 接收器链接。这取决于传感器接口的类型(并行或 mipi csi-2)。因此,这些管道从以下开始:

sensor -> ipuX_csiY_mux -> ...

对于并行传感器,或者

sensor -> imx6-mipi-csi2 -> (ipuX_csiY_mux) -> ...

对于 mipi csi-2 传感器。imx6-mipi-csi2 接收器可能需要在发送到 CSI 之前路由到视频多路复用器 (ipuX_csiY_mux),具体取决于 mipi csi-2 虚拟通道,因此 ipuX_csiY_mux 显示在括号中。

7.5.16. 未处理的视频捕获:

通过 ipuX_csiY IDMAC 源端焊盘,将帧直接从传感器发送到摄像头设备接口节点,不进行任何转换。

-> ipuX_csiY:2 -> ipuX_csiY capture

7.5.17. IC 直接转换:

此管道使用预处理编码实体将帧直接从 CSI 路由到 IC,以执行缩放至 1024x1024 分辨率、CSC、翻转和图像旋转。

-> ipuX_csiY:1 -> 0:ipuX_ic_prp:1 -> 0:ipuX_ic_prpenc:1 -> ipuX_ic_prpenc capture

7.5.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.5.19. 使用注意事项

为了帮助配置以及为了向后兼容仅从视频设备节点访问控件的 V4L2 应用程序,捕获设备接口会从当前管道中的活动实体继承控件,因此可以直接从子设备或从活动的捕获设备接口访问控件。例如,FIM 控件可以从 ipuX_csiY 子设备或从活动的捕获设备访问。

以下是 Sabre* 参考板的具体使用说明

7.5.20. 带 OV5642 和 OV5640 的 i.MX6Q SabreLite

此平台需要带有并行摄像头接口的 OmniVision OV5642 模块和带有 MIPI CSI-2 接口的 OV5640 模块。这两个模块均可从 Boundary Devices 获得。

请注意,如果只有一个摄像头模块可用,则可以在设备树中禁用另一个传感器节点。

OV5642 模块连接到 i.MX 内部视频多路复用器上的并行总线输入,到 IPU1 CSI0。它的 i2c 总线连接到 i2c 总线 2。

MIPI CSI-2 OV5640 模块连接到 i.MX 内部 MIPI CSI-2 接收器,并且来自接收器的四个虚拟通道输出的路由如下:vc0 到 IPU1 CSI0 多路复用器,vc1 直接到 IPU1 CSI1,vc2 直接到 IPU2 CSI0,vc3 到 IPU2 CSI1 多路复用器。OV5640 也连接到 SabreLite 上的 i2c 总线 2,因此 OV5642 和 OV5640 不得共享相同的 i2c 从地址。

以下基本示例配置了两个传感器的未处理视频捕获管道。OV5642 路由到 ipu1_csi0,OV5640 在 MIPI CSI-2 虚拟通道 1(即 imx6-mipi-csi2 pad 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.5.21. 带 ADV7180 解码器的 i.MX6Q SabreAuto

在 i.MX6Q SabreAuto 上,板载 ADV7180 SD 解码器连接到内部视频多路复用器上到 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.5.22. 带 ADV7180 解码器的 i.MX6DL SabreAuto

在 i.MX6DL SabreAuto 上,板载 ADV7180 SD 解码器连接到内部视频多路复用器上到 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.5.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。

以下示例配置了未处理的视频捕获管道,以从在 MIPI CSI-2 虚拟通道 0 上传输的 OV5640 捕获。

# 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

以下示例配置了一个直接转换管道,以从在 MIPI CSI-2 虚拟通道 0 上传输的 OV5640 捕获。它还显示了 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.5.24. 已知问题

  1. 当在接近 1024x1024 的 IC 大小调整器限制的捕获分辨率下使用 90 或 270 度旋转控制,并与平面像素格式(YUV420、YUV422p)结合使用时,帧捕获通常会失败,IDMAC 通道没有帧结束中断。要解决此问题,当需要 90 或 270 度旋转时,请使用较低的分辨率和/或打包格式(YUYV、RGB3 等)。

7.5.25. 文件列表

drivers/staging/media/imx/ include/media/imx.h include/linux/imx-media.h

7.5.26. 参考资料

7.5.27. 作者

版权所有 (C) 2012-2017 Mentor Graphics Inc.