第4篇 COMS摄像头_CAMIF接口

硬件原理:

(1)ov7740(摄像头模块)
	输入信号: 自然景观等的模拟信号
	输出信号: RGB、YUV格式的数字信号

	1). 常用参数
		1.输入信号: 自然景观等的模拟信号
		2.输出信号: 	(看 OV7740_CSP_DS_1.51.pdf)
			输出格式为:RAW RGB、YUV
			输出分辨率为:VGA(640*480)、QVGA(240*320)、CIF(352*288)、更小的任意大小


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

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

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

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

		b.isp部分:(image sensor processor)
			有DSP
			提供测试功能、镜头补偿功能、自动白平衡、RAW RGB->RGB、RGB->YUV、
			窗口功能、缩小放大功能

		c.ioi部分:(image output interface)
			RAW RGB/YUV、VGA/QVGA、BT601/BT656


		注意:
			(1)以上这些处理过程,只有极少部分是自动完成的,而剩余部分是需要我们设
				置后,才能完成。
			(2)是通过IIC总线,操作OV7740的寄存器来进行设置的。



(2)原理图(接口)
	控制类:
		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(数据传输接口)
		BT601 有独立的行同步信号线、帧同步信号线,而 BT656 是将这两种信号内嵌到数据中的。


(3)s3c2440摄像头控制器(CAMIF)			
	源(摄像头模块)	======》 目的(2440 的缓存)
		(1)源:
			1)可设置:
				数据传输接口 BT601/656
				分辨率 4096*4096
				格式 8bit YUV
			2)这里设置为			//参考前面的 控制类
				分辨率 648*480 
				BT601
		(2)图片截取 (窗口功能、缩小放大功能)
		(3)两个通道,应该是2选1
			1)预览通道 
				PIP (画中画)
				分辨率 640*480
				缩放 + 颜色空间转换 + 旋转
			2)编码通道	
				编码有用
				分辨率 4096*4096
				缩放 + 颜色空间转换 + 旋转
		(4)目的:
			1)对应 预览通道  的目的:	(本教程仅实现该通道)
				RGB16/24			
				缓存
			2)对应 编码通道  的目的:
				YCbCr420/YCbCr422	(压缩过的数据格式)
				缓存
	
	中断:
		在帧起始(即帧与帧之间) 产生中断

CMOS驱动源码分析:

在 i2c_driver 的 .probe 中实现:	(I2C 是用于实现摄像头 控制类 的功能)
	(1)分配、设置、 注册一个 video_device 结构体			//参考 第2课第1.1.7节文档和图片(从0写USB摄像头)\myuvc				//视频参考:  第13.2节: 从零写CMOS摄像头驱动_编写驱动程序框架		
			static struct video_device cmos_ov7740_vdev = {
				.fops		= &cmos_ov7740_fops,			//类似之前的驱动 myuvc ,只是少了 usb 的接口
				.ioctl_ops		= &cmos_ov7740_ioctl_ops,	//类似之前的驱动 myuvc
				.release		= cmos_ov7740_release,
				.name		= "cmos_ov7740",
			};
	(2)硬件相关, 这里主要涉及的是初始化操作 	(CAMIF控制器, 摄像头模块)		(类似于裸机操作,这里感觉有些不够规范,应该用 pinctrl)				//视频参考:  第13.3节: 从零写CMOS摄像头驱动_初始化摄像头模块
		1)映射相应的寄存器					
		2)设置相应的GPIO用于CAMIF
		3)复位一下CAMIF控制器
		4)设置、使能时钟(使能HCLK、使能并设置CAMCLK = 24MHz)
			设置使能时钟: CAMIF控制器
			设置使能时钟: 摄像头
		5)复位一下摄像头模块
		6)通过IIC总线,初始化摄像头模块			(摄像头的寄存器设置  参考 第2课第1.1_13节_从零写CMOS摄像头驱动\doc\IIC初始化数组/OV7740AB_v5_VGA.txt(由厂家提供) )
		7)注册中断

		注意:
			主要是通过 I2C 设置 摄像头模块 的寄存器,
			而不设置 摄像头控制器寄存器

	(3)	设置摄像头控制器寄存器	
		目的:实现图片数据的获取,并上报给应用层

参考:韦东山Linux驱动教程

posted @   charlie12345  阅读(260)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示