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系列处理器)