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