1. Camera系统概述
本章是《Camera驱动实战:raw图采集与DMA传输调试》的起点。我们将从物理模组、图像处理流水线、数据格式和软件分层四个维度,建立对嵌入式Camera系统的全局认知。理解这些基础概念,是后续编写驱动、调试RAW图采集和DMA传输的前提。
1.1 Camera模组组成
一个典型的嵌入式Camera模组(Camera Module)由光学、光电转换和电路三大部分构成。下图展示了模组的核心组件及其信号流向。
实战提示:在驱动调试中,最常接触的是图像传感器(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数据如何从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平台层。这种分层实现了硬件抽象和代码复用。下图展示了各层的关系。
各层职责详解
- 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核心代码。
本章小结
通过本章学习,你应该掌握:
- Camera模组的物理组成:镜头、IR-Cut、Sensor、驱动电路、连接器。
- ISP Pipeline的基本流程:从RAW输入到YUV输出的关键处理步骤。
- RAW与YUV的本质区别:RAW是拜耳阵列原始数据,YUV是经过插值和色彩转换的完整图像。
- Linux Camera驱动的三层架构:V4L2核心层、Subdev子设备层、Platform平台层,以及各层的职责和交互关系。