7.13. 高通摄像头子系统驱动程序

7.13.1. 简介

本文档记录位于 drivers/media/platform/qcom/camss 下的高通摄像头子系统驱动程序。

当前版本的驱动程序支持在高通 MSM8916/APQ8016 和 MSM8996/APQ8096 处理器上找到的摄像头子系统。

该驱动程序实现了 V4L2、媒体控制器和 V4L2 子设备接口。支持在内核中使用 V4L2 子设备接口的摄像头传感器。

该驱动程序是参考 Code Linaro 中找到的用于 Android 的高通摄像头子系统驱动程序实现的 [1] [2]

7.13.2. 高通摄像头子系统硬件

8x16 / 8x96 处理器上找到的并由驱动程序支持的摄像头子系统硬件包括

  • 2 / 3 个 CSIPHY 模块。它们处理 CSI2 接收器的物理层。可以将单独的摄像头传感器连接到每个 CSIPHY 模块;

  • 2 / 4 个 CSID (CSI 解码器) 模块。它们处理 CSI2 接收器的协议和应用层。CSID 可以解码来自任何 CSIPHY 的数据流。每个 CSID 还包含一个 TG(测试生成器)块,该块可以生成用于测试目的的人工输入数据;

  • ISPIF (ISP 接口) 模块。处理从 CSID 到 VFE 输入的数据流路由;

  • 1 / 2 个 VFE (视频前端) 模块。包含图像处理硬件块的流水线。VFE 具有不同的输入接口。PIX(像素)输入接口将输入数据馈送到图像处理流水线。图像处理流水线在末端还包含一个缩放和裁剪模块。三个 RDI(原始转储接口)输入接口绕过图像处理流水线。VFE 还包含将输出数据写入内存的 AXI 总线接口。

7.13.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(8 位拜耳 RAW - V4L2_PIX_FMT_SRGGB8 / V4L2_PIX_FMT_SGRBG8 / V4L2_PIX_FMT_SGBRG8 / V4L2_PIX_FMT_SBGGR8);

      • MIPI RAW10(10 位打包拜耳 RAW - V4L2_PIX_FMT_SBGGR10P / V4L2_PIX_FMT_SGBRG10P / V4L2_PIX_FMT_SGRBG10P / V4L2_PIX_FMT_SRGGB10P / V4L2_PIX_FMT_Y10P);

      • MIPI RAW12(12 位打包拜耳 RAW - V4L2_PIX_FMT_SRGGB12P / V4L2_PIX_FMT_SGBRG12P / V4L2_PIX_FMT_SGRBG12P / V4L2_PIX_FMT_SRGGB12P)。

      • (仅限 8x96)MIPI RAW14(14 位打包拜耳 RAW - V4L2_PIX_FMT_SRGGB14P / V4L2_PIX_FMT_SGBRG14P / V4L2_PIX_FMT_SGRBG14P / V4L2_PIX_FMT_SRGGB14P)。

    • (仅限 8x96)输入数据的格式转换。

      支持的输入格式

      • MIPI RAW10(10 位打包拜耳 RAW - V4L2_PIX_FMT_SBGGR10P / V4L2_PIX_FMT_Y10P)。

      支持的输出格式

      • Plain16 RAW10(10 位未打包拜耳 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.13.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.13.5. 实现

不需要对硬件进行运行时配置(在流式传输时更新设置)来实现当前支持的功能。基于当前活动的媒体链接、格式和设置的控件,在 STREAMON ioctl 上应用每个硬件模块上的完整配置。

VFE 中缩放器模块的输出大小是在“msm_vfe0_pix”实体的接收器填充上配置的实际合成选择矩形。

VFE 中裁剪模块的裁剪输出区域是在“msm_vfe0_pix”实体的源填充上配置的实际裁剪选择矩形。

7.13.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.13.7. 参考