CSDN仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。

本博文对应地址: https://hceng.cn/2018/05/20/Linux摄像头驱动4——CMOS摄像头/#more

Linux摄像头驱动学习第四篇,对CMOS摄像头进行学习,实现在Tiny4412上使用CMOS摄像头采集图像,在LCD上显示图像。

坚持到了Linux摄像头学习的最后一部分——CMOS摄像头。

写完本篇博客后,摄像头部分就暂告一个段落,希望以后有机会继续接触更多。

1.CMOS摄像头基础

本次使用的是百问网提供的OV7740摄像头模块,先对该模块的基础知识进行整理。

CMOS摄像头是指采用CMOS图像传感器的摄像头。

CMOS摄像头的结构一般如下:

1.1 摄像头参数

根据OV7740的datasheet可以得到以下特性和参数:

support for output formats: RAW RGB and YUV

output formats: 8-/10-bit RAW RGB data, 8-bit YUV  [注1]

support for image sizes: VGA, and QVGA, CIF and any size smaller  [注2]

active array size: 656 x 488

lens size: 1/5"

pixel size: 4.2 μm x 4.2 μm  [注3]

input clock frequency: 6 ~ 27 MHz  [注4]

scan mode: progressive  [注5]

[注1]

①:输出的格式支持8/10bit的**RAW RGB格式**,8bit的**YUV格式**;

②:RAW RGB就只有红绿蓝三种颜色的数据,而RGB数据不仅只表示红绿蓝三种颜色,还能表示由红绿蓝组合成的任何一种颜色;

③:YUV:由Y(亮度信号)、U(R-Y的色差信号)、V(B-Y的色差信号)组成,与RGB是两种不同描述颜色的方法,它们的转换公式如下(RGB取值范围均为0-255):

Y = 0.299R + 0.587G + 0.114B

U = -0.147R - 0.289G + 0.436B

V = 0.615R - 0.515G - 0.100B

R = Y + 1.14V

G = Y - 0.39U - 0.58V

B = Y + 2.03U

[注2]

输出分辨率为:VGA(640x480)、QVGA(240x320)、CIF(352x288)、其它更小的任意大小;

[注3]

①:有效感光阵列的大小:656 x 488 = 320128(30W),指感光区域内单像素点的数量,像素越多,拍摄画面幅面就越大,可拍摄的画面的细节就越多;

②:镜头大小:1/5寸,指感光区域对角线距离,尺寸越大,材料成本越高;

③:像素大小: 4.2μm x 4.2μm,指单个感光元件的长宽尺寸,也称单像素的开口尺寸,开口尺寸越大,单位时间内进入的光量就越大,芯片整体性能就相对较高,最终拍摄画面的整体画质相对较优秀;

单像素尺寸是图像传感器一个相当关键的参数,也就是都号称1200万像素的相机和手机,相机的效果远远好于手机的原因。手机由于体积限制,尽管像素很多,但每个像素都很小,拍摄瞬间进光量也小,成像质量就自然差一些了。

[注4]

输入时钟频率: 6~27MHz

即0V7740摄像头模组的工作时钟范围,这个将由SOC提供给CMOS;

[注5]

扫描模式: 连续扫描§

扫描方式一般分为"逐行扫描"§和"隔行扫描"(I)两种。

逐行扫描:每一帧图像由电子束顺序地一行接着一行连续扫描而成;

隔行扫描:把每一帧图像通过两场扫描完成则是隔行扫描,两场扫描中,第一场(奇数场)只扫描奇数行,依次扫描1、3、5…行,而第二场(偶数场)只扫描偶数行,依次扫描2、4、6…行。

隔行扫描技术在传送信号带宽不够的情况下起了很大作用,逐行扫描和隔行扫描的显示效果主要区别在稳定性上面,隔行扫描的行间闪烁比较明显,逐行扫描克服了隔行扫描的缺点,画面平滑自然无闪烁。

再来看看OV7740的内部数据处理框图:

分为了三部分:

image sensor core(ISC)

功能:图像翻转、增益大小调整、黑电平校准、饱和度的控制、OTP存储器;

image sensor processor(ISP)

功能:提供测试功能、镜头补偿功能、自动白平衡、颜色空间的转换功能(RAW RGB->RGB、RGB->YUV)、窗口功能(自动裁剪图片)、缩小放大功能;

image output interface(ISI)

功能:RAW RGB/YUV(图片数据格式)、VGA/QVGA、BT601/BT656

BT601有独立的行同步信号线、帧同步信号线,而BT656是将这两种信号内嵌到数据中;

1.2 硬件接口

CMOS摄像头模块对外的接口如下:

对应接到Tiny4412的引脚:

按功能可以将接口分为两类:

** 控制类:**

名字

功能

I2CSDA

I2C总线的数据线

I2CSCL

I2C总线的时钟线

功能:

①:初始化:对摄像头模块进行相应的初始化操作,让摄像头模块能够正常的输出摄像头数据;

②:控制: 设置亮度、旋转、缩放等操作;

** 数据传输类:**

名字

功能

输入/输出(针对模块)

CAMRST

复位CMOS摄像头模块

Input

CAMCLK

摄像头模块工作的系统时钟(24MHz)

Input

CAM_HREF

行同步信号

Output

CAM_VSYNC

帧同步信号

Output

CAM_PCLK

像素时钟

Output

CAMDATA0~7

八根数据线

Output

功能:

传输图像数据,类似LCD的RGB接口;

摄像头工作流程:

首先SOC输出MCLK给摄像头提供时钟,然后控制CAMRST复位摄像头,再通过I2C初始化、设置摄像头,最后在HREF、VSYNC和PCLK的控制下,通过D0~D7这八根数据线将数据发给SOC。

1.3 Camera控制器

前面所示的电路是ITU-R BT-601/656接口,除此之外,Exynos4412还支持AXI-bus接口和MIPI (CSI)接口。

Exynos4412通过CAMIF(Camera Interface)来选择输入源等操作。就目前了解的来看,高像素的摄像头一般采

用MIPI(CSI)接口。这里使用的是ITU-R BT-601接口,后面有机会再试试MIPI(CSI)接口。

摄像头的采集的数据CPU一般不直接处理,主控芯片里面集成了Camera控制器FIMC(FullyInteractive Mobile Camera)来处理。

摄像头先把图像数据传给Camera控制器,经过控制器处理(裁剪拉升后直接预览或者编码)之后交给CPU处理。

实际上摄像头工作需要的时钟(MCLK)也是FIMC给它提供的。

摄像头的驱动主要分为两部分:

一部分由模组厂家或者sensor厂家提供的初始化代码,通常是一段数组,通过I2C 总线来控制,用于设置sensor 寄存器,使用时一般不需要修改,如需调整,也由模组厂家完成;

另外一部分是应用处理器端的代码,这部分需要各个平台自行开发,在Exynos4412中就是CAMIF和FIMC。

CMOS摄像头模块,实质上是一个I2C设备。通过I2C设置、控制摄像头,SOC的摄像头控制器(CAMIF和FIMC)负责数据的处理。

因此后面CMOS驱动的核心就是:I2C设备驱动+CAMIF驱动+FIMC驱动。

2.遇到问题

1.实测OV7740模块I2C通信时,必须要提供PCLK,而不是MCLK,这里和理解的刚好相反,检查硬件也没发现什么问题,待解决;

2.内核自带了FIMC驱动、CAMIF驱动是非4412的,用起来悬,没找到相关成功的demo,测试摸索了一段时间无果,功力不够,决定暂时搁置,回头再来研究;

bakup:

# 2.驱动框架 #

## 1.1 设备树文件 ##

# 3.寄存器分析 #

# 4.测试 #

参考资料:

camera理论基础和工作原理

详细的摄像头模组工作原理(使用samsung系列处理器)