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(停用)。尤其應注意,無論感測器的安裝旋轉如何,這些控制器都不應反轉。