7.14. Qualcomm Camera Subsystem driver

7.14.1. 簡介

本文件介紹了 drivers/media/platform/qcom/camss 下的 Qualcomm Camera Subsystem 驅動程式。

該驅動程式的當前版本支援 Qualcomm MSM8916/APQ8016 和 MSM8996/APQ8096 處理器上的 Camera Subsystem。

該驅動程式實現了 V4L2、媒體控制器和 V4L2 子裝置介面。支援在核心中使用 V4L2 子裝置介面的攝像頭感測器。

該驅動程式的實現參考了 Code Linaro 中適用於 Android 的 Qualcomm Camera Subsystem 驅動程式 [1] [2]

7.14.2. Qualcomm Camera Subsystem 硬體

8x16 / 8x96 處理器上找到的,並且驅動程式支援的 Camera Subsystem 硬體包括

  • 2 / 3 CSIPHY 模組。它們處理 CSI2 接收器的物理層。每個 CSIPHY 模組都可以連線一個單獨的攝像頭感測器;

  • 2 / 4 CSID (CSI Decoder) 模組。它們處理 CSI2 接收器的協議層和應用層。CSID 可以解碼來自任何 CSIPHY 的資料流。每個 CSID 還包含一個 TG(測試生成器)塊,可以生成人工輸入資料以用於測試目的;

  • ISPIF (ISP Interface) 模組。處理從 CSID 到 VFE 輸入的資料流路由;

  • 1 / 2 VFE(影片前端)模組。包含影像處理硬體塊的流水線。VFE 具有不同的輸入介面。PIX(畫素)輸入介面將輸入資料饋送到影像處理流水線。影像處理流水線的末端還包含一個縮放和裁剪模組。三個 RDI(原始轉儲介面)輸入介面繞過影像處理流水線。VFE 還包含 AXI 匯流排介面,該介面將輸出資料寫入記憶體。

7.14.3. 支援的功能

該驅動程式的當前版本支援

  • 透過 CSIPHY 從攝像頭感測器輸入;

  • 由 CSID 中的 TG 生成測試輸入資料;

  • VFE 的 RDI 介面

    • 將輸入資料原始轉儲到記憶體。

      支援的格式

      • YUYV/UYVY/YVYU/VYUY(打包 YUV 4:2:2 - V4L2_PIX_FMT_YUYV / V4L2_PIX_FMT_UYVY / V4L2_PIX_FMT_YVYU / V4L2_PIX_FMT_VYUY);

      • MIPI RAW8 (8bit Bayer RAW - V4L2_PIX_FMT_SRGGB8 / V4L2_PIX_FMT_SGRBG8 / V4L2_PIX_FMT_SGBRG8 / V4L2_PIX_FMT_SBGGR8);

      • MIPI RAW10 (10bit packed Bayer RAW - V4L2_PIX_FMT_SBGGR10P / V4L2_PIX_FMT_SGBRG10P / V4L2_PIX_FMT_SGRBG10P / V4L2_PIX_FMT_SRGGB10P / V4L2_PIX_FMT_Y10P);

      • MIPI RAW12 (12bit packed Bayer RAW - V4L2_PIX_FMT_SRGGB12P / V4L2_PIX_FMT_SGBRG12P / V4L2_PIX_FMT_SGRBG12P / V4L2_PIX_FMT_SRGGB12P)。

      • (僅限 8x96) MIPI RAW14 (14bit packed Bayer RAW - V4L2_PIX_FMT_SRGGB14P / V4L2_PIX_FMT_SGBRG14P / V4L2_PIX_FMT_SGRBG14P / V4L2_PIX_FMT_SRGGB14P)。

    • (僅限 8x96) 輸入資料的格式轉換。

      支援的輸入格式

      • MIPI RAW10 (10bit packed Bayer RAW - V4L2_PIX_FMT_SBGGR10P / V4L2_PIX_FMT_Y10P)。

      支援的輸出格式

      • Plain16 RAW10 (10bit unpacked Bayer RAW - V4L2_PIX_FMT_SBGGR10 / V4L2_PIX_FMT_Y10)。

  • VFE 的 PIX 介面

    • 輸入資料的格式轉換。

      支援的輸入格式

      • YUYV/UYVY/YVYU/VYUY(打包 YUV 4:2:2 - V4L2_PIX_FMT_YUYV / V4L2_PIX_FMT_UYVY / V4L2_PIX_FMT_YVYU / V4L2_PIX_FMT_VYUY)。

      支援的輸出格式

      • NV12/NV21(雙平面 YUV 4:2:0 - V4L2_PIX_FMT_NV12 / V4L2_PIX_FMT_NV21);

      • NV16/NV61(雙平面 YUV 4:2:2 - V4L2_PIX_FMT_NV16 / V4L2_PIX_FMT_NV61)。

      • (僅限 8x96) YUYV/UYVY/YVYU/VYUY(打包 YUV 4:2:2 - V4L2_PIX_FMT_YUYV / V4L2_PIX_FMT_UYVY / V4L2_PIX_FMT_YVYU / V4L2_PIX_FMT_VYUY)。

    • 縮放支援。配置 VFE 編碼器縮放模組,以實現高達 16 倍的縮小比例。

    • 裁剪支援。配置 VFE 編碼器裁剪模組。

  • 併發且獨立使用兩個 (8x96: 三個) 資料輸入 - 可以是攝像頭感測器和/或 TG。

7.14.4. 驅動程式架構和設計

該驅動程式實現了 V4L2 子裝置介面。為了建模模組之間的硬體連結並公開一個清晰、邏輯和可用的介面,該驅動程式被拆分為以下 V4L2 子裝置(8x16 / 8x96)

  • 2 / 3 CSIPHY 子裝置 - 每個 CSIPHY 由一個子裝置表示;

  • 2 / 4 CSID 子裝置 - 每個 CSID 由一個子裝置表示;

  • 2 / 4 ISPIF 子裝置 - ISPIF 由子裝置數量表示,該數量等於 CSID 子裝置的數量;

  • 4 / 8 VFE 子裝置 - VFE 由子裝置數量表示,該數量等於輸入介面的數量(每個 VFE 3 個 RDI 和 1 個 PIX)。

以這種特定方式拆分驅動程式的考慮因素如下

  • 用每個模組的單獨子裝置表示 CSIPHY 和 CSID 模組,可以建模這些模組之間的硬體連結;

  • 用每個輸入介面的單獨子裝置表示 VFE,可以併發和獨立地使用輸入介面,因為硬體支援這一點;

  • 用等於 CSID 子裝置數量的子裝置數量表示 ISPIF,可以在同時使用兩個攝像頭時建立線性媒體控制器流水線。這避免了流水線中的分支,否則將需要 a) 使用者空間和 b) 媒體框架(例如,電源開啟/關閉操作)來對單個媒體實體上從接收器墊到源墊的資料流進行假設。

每個 VFE 子裝置都連結到一個單獨的影片裝置節點。

媒體控制器流水線圖如下(連線了兩個/三個 OV5645 攝像頭感測器)

qcom_camss_graph.dot

媒體流水線圖 8x16

qcom_camss_8x96_graph.dot

媒體流水線圖 8x96

7.14.5. 實現

不需要執行時配置硬體(在流式傳輸時更新設定)來實現當前支援的功能。基於當前活動的媒體連結、格式和設定的控制元件,在 STREAMON ioctl 上應用每個硬體模組上的完整配置。

使用“msm_vfe0_pix”實體的接收器墊上的實際合成選擇矩形來配置 VFE 中縮放器模組的輸出大小。

使用“msm_vfe0_pix”實體的源墊上的實際裁剪選擇矩形來配置 VFE 中裁剪模組的裁剪輸出區域。

7.14.6. 文件

APQ8016 規範:https://developer.qualcomm.com/download/sd410/snapdragon-410-processor-device-specification.pdf 參考 2016-11-24。

APQ8096 規範:https://developer.qualcomm.com/download/sd820e/qualcomm-snapdragon-820e-processor-apq8096sge-device-specification.pdf 參考 2018-06-22。

7.14.7. 參考