1. Camera系统概述

本章是《Camera驱动实战:raw图采集与DMA传输调试》的起点。我们将从物理模组、图像处理流水线、数据格式和软件分层四个维度,建立对嵌入式Camera系统的全局认知。理解这些基础概念,是后续编写驱动、调试RAW图采集和DMA传输的前提。

1.1 Camera模组组成

一个典型的嵌入式Camera模组(Camera Module)由光学、光电转换和电路三大部分构成。下图展示了模组的核心组件及其信号流向。

Camera模组组成与信号流向 镜头 Lens IR滤光片 IR-Cut 图像传感器 Sensor 驱动电路 Driver IC 连接器 FPC/Board 关键说明: 1. 镜头:决定进光量和视场角(FOV),影响图像亮度与畸变。 2. IR-Cut:滤除红外光,保证可见光成像色彩还原准确。 3. 图像传感器:核心光电转换器件,输出RAW拜耳阵列数据。 4. 驱动电路:提供时钟、供电、I2C控制,配置Sensor寄存器。
实战提示:在驱动调试中,最常接触的是图像传感器(Sensor)和驱动电路。Sensor通过MIPI CSI-2或并行接口输出RAW数据,驱动电路则通过I2C总线控制Sensor的曝光、增益和帧率。硬件调试时,务必先确认Sensor的供电、时钟和I2C通信是否正常。

1.2 ISP Pipeline简介

ISP(Image Signal Processor)是Camera系统中负责将RAW数据转换为高质量YUV或RGB图像的硬件或软件流水线。下图展示了一条典型的ISP Pipeline。

典型ISP Pipeline流程 RAW输入 黑电平校正 镜头阴影校正 去马赛克 自动白平衡 YUV输出 ISP各阶段作用: • 黑电平校正(BLC):减去Sensor暗电流引入的固定偏移。 • 镜头阴影校正(LSC):补偿镜头边缘亮度衰减(Lens Shading)。 • 去马赛克(Demosaic):将拜耳阵列RAW插值成完整RGB图像。 • 自动白平衡(AWB):调整RGB增益,使白色物体在不同光源下呈现白色。 • 后续还可能包括:Gamma校正、色彩矩阵、降噪、锐化等。 • 最终输出YUV或RGB格式,供编码器或显示使用。
课程聚焦:本课程重点关注ISP Pipeline的输入侧——即RAW数据如何从Sensor通过DMA传输到内存。ISP内部算法(如去马赛克、AWB)属于图像处理范畴,不在驱动课程中深入展开。但理解ISP流程有助于你判断RAW数据质量是否满足后续处理要求。

1.3 RAW图与YUV的区别

RAW和YUV是Camera系统中两种最基础的数据格式。驱动开发者必须清楚它们的差异,因为驱动层直接操作的是RAW数据,而应用层通常消费YUV。下表从多个维度对比两者。

对比维度 RAW图 YUV图
数据来源 Sensor直接输出,未经ISP处理 ISP处理后的结果
色彩空间 拜耳阵列(Bayer Pattern),单通道 Y(亮度)+ U/V(色度),多通道
位深 通常10bit/12bit/14bit 通常8bit/10bit
数据量 较小(未插值,每个像素仅1个颜色分量) 较大(每个像素包含Y、U、V信息)
驱动关注点 DMA传输、帧同步、MIPI打包格式 色彩空间转换、裁剪、缩放
调试难度 需专用工具(如RAW分析器)查看拜耳模式 可用普通图片查看器预览
典型用途 专业摄影、计算机视觉、ISP算法开发 视频编码、显示预览、网络传输
常见误区:初学者常误以为RAW图是“未压缩的YUV”。实际上,RAW是Sensor的原始光电信号,每个像素只记录R、G、B中的一种颜色(拜耳阵列)。而YUV是经过插值和色彩转换后的完整图像。驱动层如果错误地将RAW当作YUV处理,会导致颜色完全错乱。

1.4 驱动分层架构(V4L2/Subdev/Platform)

Linux内核中,Camera驱动采用分层架构设计,从上到下依次为:V4L2核心层、Subdev子设备层、Platform平台层。这种分层实现了硬件抽象和代码复用。下图展示了各层的关系。

Camera驱动分层架构(V4L2 / Subdev / Platform) 用户空间(Userspace)— 应用程序 / libcamera / GStreamer V4L2核心层(Video for Linux 2) 提供统一的视频设备接口 /dev/videoX,管理视频流、缓冲区、IOCTL Subdev子设备层(V4L2 Subdev) 管理Sensor、ISP、MIPI CSI-2接收器等子设备,通过media-controller拓扑连接 Platform平台层(硬件相关) 包含DMA引擎、时钟控制器、GPIO、I2C控制器、中断控制器等硬件抽象 硬件层(Sensor / ISP / DMA Controller / SoC)

各层职责详解

  • V4L2核心层:提供标准字符设备接口(/dev/videoX),实现open()、close()、ioctl()、mmap()、poll()等系统调用。核心数据结构包括struct video_device、struct vb2_queue(videobuf2缓冲区队列)。驱动开发者需要实现v4l2_ioctl_ops和vb2_ops回调。
  • Subdev子设备层:将Camera系统中的Sensor、ISP、MIPI接收器等独立硬件抽象为子设备。每个子设备通过struct v4l2_subdev表示,支持s_power、s_stream、enum_mbus_code等操作。子设备之间通过media-ctl框架建立数据流拓扑。
  • Platform平台层:与SoC硬件紧密相关,包括DMA控制器驱动(如dmaengine)、时钟驱动(clk)、I2C适配器驱动、GPIO驱动、中断控制器等。这一层为上层提供硬件资源抽象,例如申请DMA通道、配置时钟频率、控制Sensor复位引脚。
驱动开发重点:本课程的核心——RAW图采集与DMA传输——主要涉及Subdev层(Sensor子设备配置)和Platform层(DMA引擎配置)。V4L2核心层提供框架,但具体的数据搬运逻辑由Platform层的DMA驱动完成。后续章节将深入讲解如何编写Sensor子设备驱动和DMA引擎驱动。

典型驱动文件结构

一个完整的Camera驱动通常包含以下源文件:

drivers/media/platform/<soc_vendor>/camera/
├── sensor/                  # Sensor子设备驱动
│   ├── imx290.c             # 以Sony IMX290为例
│   └── imx290.h
├── isp/                     # ISP子设备驱动(如有独立ISP)
│   └── isp_hw.c
├── csi/                     # MIPI CSI-2接收器驱动
│   └── mipi_csi2.c
├── dma/                     # DMA引擎驱动
│   └── cam_dma.c
├── platform/                # 平台驱动,注册video_device
│   └── cam_dev.c
└── Makefile
架构优势:这种分层设计使得Sensor厂商只需提供Subdev驱动,SoC厂商只需提供Platform驱动,两者通过V4L2框架无缝对接。例如,更换Sensor时,只需替换Sensor子设备驱动,无需修改DMA和V4L2核心代码。

本章小结

通过本章学习,你应该掌握:

  1. Camera模组的物理组成:镜头、IR-Cut、Sensor、驱动电路、连接器。
  2. ISP Pipeline的基本流程:从RAW输入到YUV输出的关键处理步骤。
  3. RAW与YUV的本质区别:RAW是拜耳阵列原始数据,YUV是经过插值和色彩转换的完整图像。
  4. Linux Camera驱动的三层架构:V4L2核心层、Subdev子设备层、Platform平台层,以及各层的职责和交互关系。