2. 使用摄像头传感器驱动程序¶
本节介绍如何使用 V4L2 子设备接口来控制摄像头传感器驱动程序的常用实践。
您还可以参考编写摄像头传感器驱动程序。
2.1. 帧大小¶
有两种不同的方法来配置摄像头传感器生成的帧大小。
2.1.1. 自由配置的摄像头传感器驱动程序¶
自由配置的摄像头传感器驱动程序将设备的内部处理流水线公开为一个或多个具有不同裁剪和缩放配置的子设备。设备的输出大小是设备像素阵列大小的一系列裁剪和缩放操作的结果。
CCS 驱动程序是这种驱动程序的一个例子。
2.1.2. 基于寄存器列表的驱动程序¶
基于寄存器列表的驱动程序通常不能根据用户的请求配置它们控制的设备,而是限于一些预设的配置,这些配置组合了硬件级别上独立的许多不同参数。驱动程序如何选择这种配置取决于设备内部流水线末端源焊盘上设置的格式。
大多数传感器驱动程序都是以这种方式实现的。
2.2. 帧间隔配置¶
有两种不同的方法来获取不同帧间隔的可能性以及配置帧间隔。具体实现哪一种方法取决于设备的类型。
2.2.1. 原始摄像头传感器¶
帧间隔不是像帧间隔这样的高级参数,而是许多摄像头传感器实现特定参数配置的结果。幸运的是,这些参数对于或多或少所有现代原始摄像头传感器都是相同的。
帧间隔使用以下公式计算
frame interval = (analogue crop width + horizontal blanking) *
(analogue crop height + vertical blanking) / pixel rate
该公式与总线无关,适用于摄像头传感器之外的各种设备上的原始定时参数。没有模拟裁剪的设备使用完整的源图像大小,即像素阵列大小。
水平和垂直消隐分别由 V4L2_CID_HBLANK
和 V4L2_CID_VBLANK
指定。V4L2_CID_HBLANK
控制的单位是像素,V4L2_CID_VBLANK
的单位是行。传感器像素阵列中的像素速率由同一子设备中的 V4L2_CID_PIXEL_RATE
指定。该控制的单位是每秒像素数。
基于寄存器列表的驱动程序需要为此目的实现只读子设备节点。非基于寄存器列表的设备需要这些节点来配置设备的内部处理流水线。
线性流水线中的第一个实体是像素阵列。像素阵列之后可能是其他实体,它们用于配置分档、跳过、缩放或数字裁剪,请参阅 VIDIOC_SUBDEV_G_SELECTION。
2.2.2. USB 摄像头等设备¶
USB 视频类硬件以及许多原生提供类似高级接口的摄像头通常在固件或硬件设备级别上使用帧间隔(或帧率)的概念。这意味着原始摄像头实现的较低级别控制可能不会在 uAPI(甚至 kAPI)上用于控制这些设备上的帧间隔。
2.3. 旋转、方向和翻转¶
某些系统中的摄像头传感器与自然安装方向相比是倒置安装的。在这种情况下,驱动程序应使用 V4L2_CID_CAMERA_SENSOR_ROTATION 控制将信息公开给用户空间。
传感器驱动程序还应使用 V4L2_CID_CAMERA_SENSOR_ORIENTATION 报告传感器的安装方向。
在寄存器编程序列中嵌入了任何垂直或水平翻转的传感器驱动程序应使用寄存器序列编程的值初始化 V4L2_CID_HFLIP 和 V4L2_CID_VFLIP 控制。这些控制的默认值应为 0(禁用)。特别是,这些控制不应反转,而与传感器的安装旋转无关。