CMOS摄像头

目的：
		将摄像头采集到的数据实时的在LCD上进行显示



一，2440环境搭建

1. 打补丁：
tar xjvf linux-3.4.2.tar.bz2
cd linux-3.4.2
patch -p1 <../linux-3.4.2_100ask.patch
cp config_ok ./.config
make menuconfig

2. 启动内核：
set ipaddr 192.168.1.122 && set serverip 192.168.1.103 && tftp 0x30000000 uImage
set bootargs root=/dev/nfs nfsroot=192.168.1.200:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.17 console=ttySAC0,115200 && bootm 0x30000000

3. 驱动：
cp *.ko /work/nfs_root/fs_mini_mdev_new/work
cp test_camera /work/nfs_root/fs_mini_mdev_new/work




二，硬件原理

自然景观->摄像头模块->接口->S3C2440的摄像头控制器->LCD


ov7740(摄像头模块)

输入信号: 自然景观等的模拟信号
输出信号: RGB、YUV格式的数字信号

1). 常用参数
输入信号: 自然景观等的模拟信号
输出信号: 

输出格式为：RAW RGB、YUV
输出分辨率为：VGA(640*480)、QVGA(240*320)、CIF(352*288)、更小的任意大小

有效感光阵列的大小：656*488 = 320128(30W)
镜头的大小：1/5寸
像素点颗粒的大小: 4.2um * 4.2um
总结：
		以上三个参数，都是用来描述感光阵列，即使同为30W像素的摄像头，如果它的
镜头尺寸大小越小，那么对应的像素点颗粒的大小就越小，从而感光性就越差，进而
拍摄的效果就越差。

输入时钟频率: 6~27MHz
		即0V7740摄像头模组的工作频率范围。

扫描模式: 连续扫描(P)

2). 内部数据的处理流程
a.isc部分：
翻转、增益大小调整、黑电平校准、饱和度的控制、OTP存储器

b.isp部分：
提供测试功能、镜头补偿功能、自动白平衡、RAW RGB->RGB、RGB->YUV、
窗口功能、缩小放大功能

c.ioi部分：
RAW RGB/YUV、VGA/QVGA、BT601/BT656

问：以上这些处理过程，不需要我们人为的做任何设置，它们都能自动完成吗？
答：以上这些处理过程，只有极少部分是自动完成的，而剩余部分是需要我们设
置后，才能完成。

问：怎么对它们进行设置呢？
答：是通过IIC总线，操作OV7740的寄存器来进行设置的。




问：RAW RGB与RGB的区别是什么？
答：所谓的RAW RGB就是只有红绿蓝三种颜色的数据。而RGB数据，它不仅只表示红绿蓝
三种颜色，而且还能表示由红绿蓝组合成的任何一种颜色。

问：RGB、YUV又分别是什么？
答：RGB、YUV是两种完全不同的颜色空间，它们之间可以相互转换。



原理图(接口)
控制类：
IICSDA		-- IIC总线的数据线
IICSCL		-- IIC总线的时钟线

数据传输类：
CAMRST		-- 复位CMOS摄像头模块
CAMCLK		-- 摄像头模块工作的系统时钟(24MHz)
CAM_HREF	-- 行同步信号
CAM_VSYNC	-- 帧同步信号
CAM_PCLK	-- 像素时钟
CAMDATA0~7-- 数据线

总结：
1.CMOS摄像头模块的接口分为两类:
(1).控制类
		-- 初始化：对摄像头模块进行相应的初始化操作
							 ，让摄像头模块能够正常的输出摄像头数据
		-- 控制: 设置亮度、旋转、缩放等等的操作

(2).数据传输类: 与LCD的接口完全一样。

2.CMOS摄像头模块，是一个IIC设备，需要给它写符合IIC设备那套架构的
驱动，从而实现初始化和灵活的控制。

640*480、30fps、YUV、BT601




s3c2440摄像头控制器(CAMIF)

问：BT601与BT656的传输方式有什么区别？
答：BT601有独立的行同步信号线、帧同步信号线，而BT656是将这两种信号
内嵌到数据中的。



三，从零写CMOS摄像头驱动

使用的内核：linux-3.4.2

参考源码：
第32课_新内核下的I2C驱动\i2c\1th_i2c_new_device
第2课第1.1.7节文档和图片(从0写USB摄像头)\myuvc


设备地址：
写 -- 0x42(01000010)
读 -- 0x43(01000011)

8bit的地址 = 7bit设备地址 + 1bit的读/写控制位

设备地址 = 0100001 = 0x21


问:为什么需要复位摄像头模块?
答:IIC能够正常操作CMOS摄像头模块内部的寄存器的前提是：
		-- 提供符合它需求的系统时钟(CAMCLK)
		-- 需要给它一个复位信号

问:怎样才能复位摄像头模块？
答:通过操作CAMIF控制器中相应的寄存器，让CAMRST发出复位
信号，从而复位摄像头模块，具体操作见驱动源码。


48字节 = 10字节 + 10字节 + 10字节 +　10字节　＋　８字节



驱动测试条件：
1.
要有IIC总线驱动；
要有LCD驱动；

2.
要配置上V4L2相关选项
Device Drivers  --->
		<*> Multimedia support  --->
				<*>   Video For Linux
				[*]   Video capture adapters (NEW)  ---> 
						[*]   V4L USB devices (NEW)  --->
						[*]   V4L platform devices  --->