6. i.MX 视频捕获驱动程序

6.1. 事件

6.1.1. ipuX_csiY

当启用第二个 IDMAC 源焊盘时,此子设备可以生成以下事件

  • V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR

用户应用程序可以从 ipuX_csiY 子设备节点订阅此事件。此事件由帧间隔监视器生成(有关 FIM 的更多信息,请参见下文)。

6.2. 控制

6.2.1. ipuX_csiY 中的帧间隔监视器

adv718x 解码器有时会在 NTSC/PAL 信号重新同步期间发送损坏的字段(视频行太少或太多)。发生这种情况时,IPU 会触发一个机制,通过在每个帧中添加 1 个虚拟行来重新建立垂直同步,这会导致图像与图像之间出现滚动效果,并且在恢复稳定图像之前可能会持续很长时间。或者,有时该机制根本不起作用,导致出现永久分割图像(一个帧包含来自两个连续捕获图像的行)。

通过实验发现,在图像滚动期间,帧间隔(两个 EOF 之间经过的时间)会下降到当前标准的标称值以下,大约一个帧时间(60 微秒),并保持在该值,直到滚动停止。

虽然这种观察的原因尚不清楚(IPU 虚拟行机制应该显示每个帧的间隔增加 1 行时间,而不是固定值),但我们可以使用它来使用帧间隔监视器检测损坏的字段。如果 FIM 检测到错误的帧间隔,ipuX_csiY 子设备将发送 V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR 事件。用户空间可以在 ipuX_csiY 子设备节点上注册 FIM 事件通知。当收到此事件时,用户空间可以发出流重启以纠正滚动/分割图像。

ipuX_csiY 子设备包括自定义控件,用于调整 FIM 的某些参数。如果在流式传输期间更改了这些控件之一,则 FIM 将被重置并将继续使用新设置。

  • V4L2_CID_IMX_FIM_ENABLE

启用/禁用 FIM。

  • V4L2_CID_IMX_FIM_NUM

在与传感器报告的标称帧间隔进行比较之前,要平均多少个帧间隔测量值。这可以减少中断延迟引起的噪声。

  • V4L2_CID_IMX_FIM_TOLERANCE_MIN

如果平均间隔超出标称值此量(以微秒为单位),则会发送 V4L2_EVENT_IMX_FRAME_INTERVAL_ERROR 事件。

  • V4L2_CID_IMX_FIM_TOLERANCE_MAX

如果任何间隔高于此值,则会丢弃这些样本,并且不会进入平均值。这可以用来丢弃可能由于系统负载高而导致中断延迟导致的非常高的间隔错误。

  • V4L2_CID_IMX_FIM_NUM_SKIP

在 FIM 重置或流重启后,在 FIM 开始平均间隔之前要跳过多少帧。

  • V4L2_CID_IMX_FIM_ICAP_CHANNEL / V4L2_CID_IMX_FIM_ICAP_EDGE

这些控件将配置一个输入捕获通道作为测量帧间隔的方法。这优于通过 EOF 中断测量帧间隔的默认方法,因为它不受中断延迟引入的不确定性错误的影响。

输入捕获需要硬件支持。VSYNC 信号必须路由到 i.MX6 输入捕获通道焊盘之一。

V4L2_CID_IMX_FIM_ICAP_CHANNEL 配置要使用的 i.MX6 输入捕获通道。这必须为 0 或 1。

V4L2_CID_IMX_FIM_ICAP_EDGE 配置哪个信号边沿将触发输入捕获事件。默认情况下,输入捕获方法禁用,值为 IRQ_TYPE_NONE。将此控件设置为 IRQ_TYPE_EDGE_RISING、IRQ_TYPE_EDGE_FALLING 或 IRQ_TYPE_EDGE_BOTH 以启用输入捕获,并在给定的信号边沿上触发。

禁用输入捕获后,将通过 EOF 中断测量帧间隔。

6.2.2. 文件列表

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

6.2.3. 作者

Copyright (C) 2012-2017 Mentor Graphics Inc.