Linux摄像头驱动4——CMOS摄像头

版权声明:本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,欢迎转载,但转载请注明来自hceng blog(www.hceng.cn),并保持转载后文章内容的完整。本人保留所有版权相关权利。 https://blog.csdn.net/hceng_linux/article/details/89913854

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

猜你喜欢

转载自blog.csdn.net/hceng_linux/article/details/89913854