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