第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驱动教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了