8. 編寫相機感測器驅動程式

本文件僅涵蓋核心中的 API。有關相機感測器驅動程式中使用者空間 API 實現的最佳實踐,請參閱使用相機感測器驅動程式

8.1. CSI-2、並行和 BT.656 匯流排

請參閱畫素資料傳送器和接收器驅動程式

8.2. 處理時鐘

相機感測器具有內部時鐘樹,包括 PLL 和多個分頻器。時鐘樹通常由驅動程式根據一些特定於硬體的輸入引數進行配置:外部時鐘頻率和鏈路頻率。這兩個引數通常從系統韌體獲得。**在任何情況下都不應使用其他頻率。**

時鐘頻率如此重要的原因是時鐘訊號來自 SoC,並且在許多情況下,特定的頻率被設計為在系統中使用。使用其他頻率可能會在其他地方造成有害影響。因此,只有預定的頻率可由使用者配置。

8.2.1. ACPI

讀取 clock-frequency _DSD 屬性以表示頻率。驅動程式可以依賴於使用此頻率。

8.2.2. 裝置樹

實現此目的的首選方法是使用 assigned-clocksassigned-clock-parentsassigned-clock-rates 屬性。有關更多資訊,請參閱 時鐘裝置樹繫結。然後,驅動程式使用 clk_get_rate() 獲取頻率。

這種方法的缺點是無法保證該頻率沒有被另一個驅動程式直接或間接修改,或者最初是否受到板的時鐘樹的支援。需要更改通用時鐘框架 API 以確保可靠性。

8.3. 電源管理

相機感測器與其他裝置結合使用以形成相機流水線。它們必須遵守此處列出的規則,以確保流水線上的一致電源管理。

相機感測器驅動程式負責控制它們以其他方式控制的裝置的電源狀態。它們應使用執行時 PM 來管理電源狀態。執行時 PM 應在探測時啟用,並在移除時停用。驅動程式應啟用執行時 PM 自動掛起。另請參閱非同步子設備註冊

執行時 PM 處理程式應處理時鐘、調節器、GPIO 和其他啟動和關閉感測器所需的系統資源。對於不使用任何這些資源的驅動程式(例如僅支援 ACPI 系統的驅動程式),執行時 PM 處理程式可以不實現。

通常,裝置應至少在其暫存器被訪問時以及流式傳輸時通電。驅動程式應在啟動流式傳輸時使用 pm_runtime_resume_and_get(),在停止流式傳輸時使用 pm_runtime_put()pm_runtime_put_autosuspend()。它們可以在探測時為裝置供電(例如讀取識別暫存器),但不應在探測後無條件地保持供電。

在系統掛起時,整個相機流水線必須停止流式傳輸,並在系統恢復時重新啟動。這需要相機感測器和相機流水線的其餘部分之間的協調。橋驅動程式負責此協調,並指示相機感測器透過呼叫適當的子裝置操作(.enable_streams().disable_streams())來停止和重新啟動流式傳輸。因此,相機感測器驅動程式**不應**跟蹤流式傳輸狀態,以便在 PM 掛起處理程式中停止流式傳輸並在恢復處理程式中重新啟動它。驅動程式通常不應實現系統 PM 處理程式。

相機感測器驅動程式**不應**實現子裝置 .s_power() 操作,因為它已被棄用。雖然此操作在某些現有驅動程式中實現,因為它們早於棄用,但新驅動程式應改用執行時 PM。如果您認為需要開始從 ISP 或橋驅動程式呼叫 .s_power(),請改為將執行時 PM 支援新增到您正在使用的感測器驅動程式中,並刪除其 .s_power() 處理程式。

另請參閱示例

8.3.1. 控制框架

v4l2_ctrl_handler_setup() 函式可能不會在裝置的執行時 PM runtime_resume 回撥中使用,因為它無法確定裝置的電源狀態。這是因為裝置的電源狀態僅在電源狀態轉換髮生後才會更改。s_ctrl 回撥可用於在電源狀態轉換後獲取裝置的電源狀態

int pm_runtime_get_if_in_use(struct device *dev);

如果成功獲取電源計數或執行時 PM 已停用,則該函式返回一個非零值,在這種情況下,驅動程式可以繼續訪問裝置。

8.4. 旋轉、方向和翻轉

使用 v4l2_fwnode_device_parse() 從系統韌體獲取旋轉和方向資訊,並使用 v4l2_ctrl_new_fwnode_properties() 註冊適當的控制元件。

8.5. 示例驅動程式

感測器驅動程式實現的功能各不相同,並且根據支援的功能集和其他質量,特定的感測器驅動程式更好地服務於示例的目的。以下驅動程式是已知的好例子

示例感測器驅動程式

驅動程式名稱

檔案

驅動程式型別

示例主題

CCS

drivers/media/i2c/ccs/

自由配置

電源管理(ACPI 和 DT)、UAPI

imx219

drivers/media/i2c/imx219.c

基於暫存器列表

電源管理 (DT)、UAPI、模式選擇

imx319

drivers/media/i2c/imx319.c

基於暫存器列表

電源管理(ACPI 和 DT)