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_HBLANKV4L2_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_HFLIPV4L2_CID_VFLIP 控制器。这些控制器的默认值应为 0(禁用)。尤其应注意,无论传感器的安装旋转如何,这些控制器都不应反转。