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。

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

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 接收器,因此其图中缺少该接收器。

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.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. 已知问题

  1. 当在接近 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

7.6.26. 参考文献

7.6.27. 作者

Copyright (C) 2012-2017 Mentor Graphics Inc.