大约一年前写的东西,介绍性部分是当时在网络上找的内容,后面的分析部分是基于当时的项目,基于Mavell Pxa920,希望对初学者有点点的帮助吧。转载请注明出。

1.       Camera相关介绍

1.1.  手机Camera介绍

手机的数码相机功能指的是手机通过内置数码相机进行拍摄静态图片或短片拍摄,作为手机的一项新的附加功能,手机的数码相机功能得到了迅速的发展。

手机摄像头分为内置与外置,内置摄像头是指摄像头在手机内部,更方便。外置手机通过数据线或者手机下部接口与数码相机相连,来完成数码相机的一切拍摄功能。

处于发展阶段的手机的数码相机的性能应该也处于初级阶段,带有光学变焦的手机目前国内销售的还没有这个功能,不过相信随着手机数码相机功能的发展,带有光学变焦的手机也会逐渐上市,但大部分都拥有数码变焦功能。

目前手机的数码相机功能主要包括拍摄静态图像,连拍功能,短片拍摄,镜头可旋转,自动白平衡,内置闪光灯等等。手机的拍摄功能是与其屏幕材质、屏幕的分辨率、摄像头像素、摄像头材质有直接关系。

1.2.  Camera技术指标

1.2.1.    图像压缩方式JPEG

(joint photographic expert group)静态图像压缩方式。一种有损图像的压缩方式。压缩比越大,图像质量也就越差。当图像精度要求不高存储空间有限时,可以选择这种格式。目前大部分数码相机都使用JPEG格式。

1.2.2.   图像噪音

指的是图像中的杂点干扰,表现为图像中有固定的彩色杂点。

1.2.3.    视角

与人的眼睛成像是相似原理,简单说就是成像范围。

1.2.4.   白平衡处理技术(AWB)

要求在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的。色温表示光谱成份,光的颜色。色温低表示长波光成分多。当色温改变时,光源中三基色(红、绿、蓝)的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是白平衡调节的实际。

图象传感器的图象数据被读取后,系统将对其进行针对镜头的边缘畸变的运算修正,然后经过坏像处理后被系统送进去进行白平衡处理(在不同的环境光照

下,人类的眼睛可以把一些“白”色的物体都看成白色,是因为人眼进行了修正。但是SENSOR没有这种功能,因此需要对SENSOR输出的信号进行一定的

修正,这就是白平衡处理技术)。

1.2.5.   电源

好的摄像头内部电源也是保证摄像头稳定工作的一个因素。

1.2.6.   彩色深度(色彩位数)

反映对色彩的识别能力和成像的色彩表现能力,就是用多少位的二进制数字来记录三种原色。实际就是A/D转换器的量化精度,是指将信号分成多少个等级,常用

色彩位数(bit)表示。彩色深度越高,获得的影像色彩就越艳丽动人。非专业的SENSOR一般是24位;专业型SENSOR至少是36位。24位的

SENSOR,感光单元能记录的光亮度值最多有2^8=256级,每一种原色用一个8位的二进制数字来记录,最多记录的色彩是256×256×256约

16,77万种。

36位的SENSOR,感光单元能记录的光亮度值最多有2^12=4096级,每一种原色用一个12位的二进制数字来记录,最多记录的色彩是4096×4096×4096约68.7亿种。

1.2.7.   输出/输入接口(IO)

串行接口(RS232/422):传输速率慢,为115kbit/s。

并行接口(PP):速率可以达到1Mbit/s。

红外接口(IrDA):速率也是115kbit/s,一般笔记本电脑有此接口。

通用串行总线USB:即插即用的接口标准,支持热插拔。USB1.1速率可12Mbit/s,USB2.0可达480bit/s。

IEEE1394(火线)接口(亦称ilink):其传输速率可达100M~400Mbit/s。

1.2.8.   图像格式(image Format/ Color space)

RGB24,I420是目前最常用的两种图像格式。RGB24:表示R、G、B三种颜色各8bit,最多可表现色。

I420:YUV格式之一。

其它格式有: RGB565,RGB444,YUV4:2:2等。

1.2.9.   分辨率(Resolution)

所谓分辨率就是指画面的解析度,由多少象素构成的数值越大,图像也就越清晰。分辨率不仅与显示尺寸有关,还会受到显像管点距、视频带宽等因素的影

响。我们通常所看到的分辨率都以乘法形式表现的,比如1024*768,其中的1024表示屏幕上水平方向显示的点数,768表示垂直方向的点数。

QXGA (2048 X 1536)又称300万像素

UXGA (1600X 1200)又称200万像素

SXGA(1280 x1024)又称130万像素

XGA(1024 x768)又称80万像素

SVGA(800 x600)又称50万像素

VGA(640x480)又称30万像素(35万是指648X488)

CIF(352x288) 又称10万像素

SIF/QVGA(320x240)

QCIF(176x144)

QSIF/QQVGA(160x120)

1.3.  备注

1.3.1.   Mipi接口介绍:

MIPI=Mobile Industry Processor Interface, 是类似SMIA的一个LVDS的一种接口,主要用在手机Camera Module上居多。

就CameraModule而言,现在Micorn和OV均推出支持MIPI接口的Sensor如Micorn的MT9D112,MT9T111和

OV的OV2650等,对于低像素的Sensor似乎MIPI的优势不是很明显哦,但是在3MP以上就可能有些优势了。

优势-1,Camera的布线大大减少。并口的数据接口,如果是YUV输出至少为8个数据Bit、2个Clock(MCLK和PCLK)、I2C两个、同

步信号2个,再加地和电源等,如果换成MIPI的串口,可以减少2个同步信号,8个数据Bit变为DOUT_P、DOUT_N、CLK_P、

CLK_N,PCLK也可以不要,卓实少了很多,布线自然方便许多。

优势-2,Noise的减少。走线越多被干扰的可能就越多,走线少了于是干扰就少了,同时MIPI信号是DOUT_N和DOUT_P成对走线,需要考虑

impedance,两根线从波形看是成反相,所以有外部干扰过来,就会被抵消很大部分,同时MIPI的信号属于LVDS(Low Voltage

Differential Signaling:低压差分信号传输)底到MV的等级,于是他本身对于外部的干扰也是很小的。

优势-3,传输速度极快,从并口到串口,当然要足够大的速度,MIPI的理论上的速度可以到80MB/s-1GB/s,实际也在600-800MB/s,而传统的并口再高也不过600MB/s了吧。

优势-4,功耗低。并口的Camera,只要上电,给Clock于是PCLK就有输出,Data也会由输出,抓不到同步就成不了像,但是数据还是输出,于是就要功耗。而MIPI理论上静态是没有功耗的。

2.       Linux Camera Driver

2.1.   代码结构

其中以ov5640为例,其他carmera相关carmere driver 同理。

2.2.  重要接口实现说明

ov5640_mipi_probe()

{

…..

ccic_set_clock_mipi(); //ccic mipi clock 设置

pdata->power_on(1, 1);//power on camera

i2c_set_clientdata(client, info); //初始化I2c资源

ov5640_mipi_detect(client);  //camera检测

ccic_sensor_attach(client);//ccic host端与sensor driver绑定

…..

}

说明:camera 驱动启动时调用的初始化操作函数,包括camera上电、ccic控制器mpi clock设置、i2c端口初始化、camera检测与绑定等。

ov5640_mipi_comman()

{

v4l2_chip_ident_i2c_client ()

ov5640_mipi_reset()

ov5640_mipi_enum_fmsize ()

ov5640_mipi_querycap ()

ov5640_mipi_enum_fmt ()

ov5640_mipi_try_fmt ()

ov5640_mipi_s_fmt()

ov5640_mipi_queryctrl()

ov5640_mipi_s_ctrl()

ov5640_mipi_g_ctrl()

ov5640_mipi_s_input()

ov5640_mipi_streamon()

ov5640_mipi_streamoff()

ov5640_mipi_g_register()

ov5640_mipi_s_register()

}

说明:camera iocontorl函数

v4l2_chip_ident_i2c_client() //为摄像头分配一个独立字段,由于双摄像头区分之用

ov5640_mipi_reset   //camera重启功能

ov5640_mipi_enum_fmsize  // 枚举camera支持的priver and capture 的图像大小

ov5640_mipi_querycap   //对应hal层识别的camera device的关键字符串赋值

ov5640_mipi_enum_fmt  //枚举camera支持的图像格式

ov5640_mipi_try_fmt ()   //根据传入的图像格式及大小,计算图像的宽和高占用的字节数

ov5640_mipi_s_fmt()  //根据传入的图像格式及大小,对camera寄存器进行相应的设置

ov5640_mipi_s_ctrl() //预留函数,对camera的一些特效设置,进行对应的寄存器设置,现在这部分功能已经在hal层实现。

ov5640_mipi_g_ctrl()//预留函数,获取camera的一些特效设置对应的寄存器设置值,现在这部分功能已经在hal层实现。

ov5640_mipi_s_input() //camera寄存器初始化

ov5640_mipi_streamon()  //camera 数据流开

ov5640_mipi_streamoff()  //camera 数据关

ov5640_mipi_g_register()  //读取camera某一寄存器的值

ov5640_mipi_s_register()  //设置 camera某一寄存器的值

3.       Host控制器实现(基于V4L2)

3.1.  V4L2知识

Video4linux2(简称V4L2),是linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0下

3.1.1.   一般操作流程(视频设备):

1.打开设备文件。 int fd=open(”/dev/video0″,O_RDWR);

2.取得设备的capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等。VIDIOC_QUERYCAP,struct v4l2_capability

3.设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等。

VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format

4.向驱动申请帧缓冲,一般不超过5个。struct v4l2_requestbuffers

5.将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。mmap

6.将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer

7.开始视频的采集。VIDIOC_STREAMON

8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF

9.将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF

10.停止视频的采集。VIDIOC_STREAMOFF

11.关闭视频设备。close(fd);

3.1.2.   在进行V4L2开发中,一般会用到以下的命令标志符:

1 VIDIOC_REQBUFS:分配内存

2 VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址

3 VIDIOC_QUERYCAP:查询驱动功能

4 VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式

5 VIDIOC_S_FMT:设置当前驱动的频捕获格式

6 VIDIOC_G_FMT:读取当前驱动的频捕获格式

7 VIDIOC_TRY_FMT:验证当前驱动的显示格式

8 VIDIOC_CROPCAP:查询驱动的修剪能力

9 VIDIOC_S_CROP:设置视频信号的边框

10 VIDIOC_G_CROP:读取视频信号的边框

11 VIDIOC_QBUF:把数据从缓存中读取出来

12 VIDIOC_DQBUF:把数据放回缓存队列

13 VIDIOC_STREAMON:开始视频显示函数

14 VIDIOC_STREAMOFF:结束视频显示函数

15 VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。

这些IO调用,有些是必须的,有些是可选择的。

3.2.  Host控制器(video device)代码结构

这里主要介绍920 host端 camera video控制器实现,主要基于v4l2架构,code文件见pxa910_camera.c。

3.3.  部分重要接口实现说明

如3.2中结构图所示,camera host端是被当作标准的v4l2架构来注册的的,也就是说是按照 struct video_device 结构体(标准的视频设置)来向系统注册设备的。

pxa910_camera_probe()

{

……

platform_set_drvdata(pdev, cam);

init_waitqueue_head()

request_irq()  // ccic irq 中断注册

ccic_ctlr_init() //ccic 控制器初始化

video_register_device()

……

}

说明:camera video 设备启动时调用的初始化操作函数

platform_set_drvdata(pdev, cam)://连接设备对象与设备驱动

init_waitqueue_head()://申明等待事件,处理见ccic_v4l_poll函数

request_irq():ccic irq 中断注册,对应中断处理函数见 ccic_irq()函数

ccic_ctlr_init():ccic 控制器初始化

video_register_device://v4l2 video 设备注册

v4l2 video主要需实现ccic_v4l_fops : (structv4l2_file_operations)和ccic_ioctl_ops: (struct v4l2_ioctl_ops)

static const struct v4l2_file_operations ccic_v4l_fops = {

.owner = THIS_MODULE,

.open = ccic_v4l_open, //open files

.release = ccic_v4l_release,//release files resource

.poll = ccic_v4l_poll,//files poll 功能对于接口

.mmap = ccic_v4l_mmap, //files 内存映射接口

.ioctl = ccic_v4l_ioctl, //files 对应iocontorl操作接口

};

说明:v4l2 video作为文件接口对应的相关操作

struct v4l2_ioctl_ops ccic_ioctl_ops = {

.vidioc_querycap   = ccic_vidioc_querycap,

.vidioc_enum_fmt_vid_cap   = ccic_vidioc_enum_fmt_cap,

.vidioc_try_fmt_vid_cap        = ccic_vidioc_try_fmt_cap,

.vidioc_s_fmt_vid_cap   = ccic_vidioc_s_fmt_cap,

.vidioc_g_fmt_vid_cap  = ccic_vidioc_g_fmt_cap,

.vidioc_enum_input      = ccic_vidioc_enum_input,

.vidioc_g_input         = ccic_vidioc_g_input,

.vidioc_s_input         = ccic_vidioc_s_input,

.vidioc_s_std           = ccic_vidioc_s_std,

.vidioc_reqbufs         = ccic_vidioc_reqbufs,

.vidioc_querybuf        = ccic_vidioc_querybuf,

.vidioc_qbuf            = ccic_vidioc_qbuf,

.vidioc_dqbuf           = ccic_vidioc_dqbuf,

.vidioc_streamon        = ccic_vidioc_streamon,

.vidioc_streamoff       = ccic_vidioc_streamoff,

.vidioc_queryctrl       = ccic_vidioc_queryctrl,

.vidioc_g_ctrl          = ccic_vidioc_g_ctrl,

.vidioc_s_ctrl          = ccic_vidioc_s_ctrl,

.vidioc_g_parm          = ccic_vidioc_g_parm,

.vidioc_s_parm          = ccic_vidioc_s_parm,

.vidioc_cropcap               = ccic_vidioc_cropcap,

.vidioc_g_register      = ccic_vidioc_g_register,

.vidioc_s_register      = ccic_vidioc_s_register,

}

说明:v4l2 video设备io contorl对应的处理函数。

ccic_vidioc_querycap() //查询驱动功能,获取camera属性

ccic_vidioc_enum_fmt_cap()  获取当前驱动支持的视频格式

ccic_vidioc_try_fmt_cap()  //对应调用ov5640_mipi_try_fmt ()的接口,功能见上一章

ccic_vidioc_s_fmt_cap()  //设置当前驱动的频捕获格式

ccic_vidioc_g_fmt_cap()  //读取当前驱动的频捕获格式

ccic_vidioc_enum_input()   //支持的camera检测,容错处理

ccic_vidioc_g_input()  //获取camera id(30万sensor_selected 为0 ,500万sensor_selected为1)

ccic_vidioc_s_input()  //设置要切换的camera id

ccic_vidioc_reqbufs()   //分配buf内存

ccic_vidioc_querybuf, //把ccic_vidioc_reqbufs中分配的数据缓存转换成物理地址

ccic_vidioc_qbuf()  //把数据从缓存中读取出来

ccic_vidioc_dqbuf()  //把数据放回缓存队列

ccic_vidioc_streamon()  //开始视频显示函数

ccic_vidioc_streamoff() // 结束视频显示函数

ccic_vidioc_queryctrl()  //对应调用ov5640_mipi_queryctrl()的接口,功能见上一章

ccic_vidioc_g_ctrl()  //对应调用ov5640_mipi_ g_ctrl ()的接口,功能见上一章

ccic_vidioc_s_ctrl()  //对应调用ov5640_mipi_ s_ctrl ()的接口,功能见上一章

ccic_vidioc_cropcap()   //预留接口,查询驱动的修剪能力

ccic_vidioc_g_register()  //对应调用ov5640_mipi_g_registe ()的接口,功能见上一章

ccic_vidioc_s_register()  //对应调用ov5640_mipi_ s_register()的接口,功能见上一章

3.4. 备注

Camera视频数据流流动有以下主要相关函数:

ccic_vidioc_reqbufs()   //分配部分内存

ccic_vidioc_querybuf, //把ccic_vidioc_reqbufs中分配的数据缓存转换成物理地址

ccic_vidioc_qbuf()  //把数据从缓存中读取出来

ccic_vidioc_dqbuf()  //把数据放回缓存队列

ccic_irq() //ccic中断处理函数

ccic_v4l_poll,  //files poll 功能对于接口

check_jpeg_header //检测抓取数据是否为jpeg文件

具体数据如何流动,见下图:(来自marrvel提供的PXA920 CCIC sensor bring up guide.pdf)

说明:VIDIOC_QBUF对应函数ccic_vidioc_qbuf()

VIDIOC_QBUF对应函数ccic_vidioc_dqbuf()

Dma_map_page //将dma buffer 数据映射到kernel内存空间

camera驱动电源配置_Camera driverV4L2驱动架构介绍相关推荐

  1. Camera driverV4L2驱动架构介绍

    http://blog.csdn.net/ypist/article/details/6664193 http://blog.csdn.net/ypist/article/details/666420 ...

  2. camera驱动电源配置_电源行业发展前景如何?

    随着对计算密集型数据服务需求的不断增加,在更小空间内提供更多能量的要求越来越高,为的是尽可能实现数据中心的高效运行,这已成为一个必然趋势.数据中心如此,电信.工业自动化.汽车及许多其他应用也同样需要高 ...

  3. DDD(Domain-Driven Design)领域驱动架构介绍

    1. 什么是领域模型 在理解领域模型之前,我们先思考一下软件开发的本质是什么.从本质上来说,软件开发过程就是问题空间到解决方案空间的一个映射转化,如图1所示. 在问题空间中,我们主要是找出某个业务面临 ...

  4. camera驱动电源配置_[ROS] 安装 USB Camera 驱动并调用

    在 ROS 系统中,想要使用 USB 摄像头需要安装相应的驱动程序.这里以常用的 usb_cam 为例来说明如何安装给 ROS 安装 USB 摄像头. 0.安装环境: Ubuntu版本:14.04 L ...

  5. camera驱动电源配置_基于AD7656-1和ADuC7026评估电源时序控制影响

    高压开关.双极性 ADC以及其它具有多个电源的器件通常要求以特定序列施加或移除电源电压.本文提出一种简单且经济高效的方法,用于确定系统在受电源瞬变.中断或序列变化影响下的行为.AD7656-1(表 1 ...

  6. 第一个驱动程序之i2c驱动架构介绍

    编写一个I2C设备驱动程序的工作可分为两部分,一是定义和注册I2C设备,即i2c_client:二是定义和注册I2C设备驱动,即i2c_driver.下面我们就以mini2440的I2C设备at24c ...

  7. 安卓平台下的GPS架构介绍及驱动移植记录

    一.前言 我的工作是关于汽车车机BSP部分. 汽车车机,其实基本和人们日常所用的手机一样,也是安卓平台的.所谓安卓,就是一层安卓服务包裹着Linux内核所形成的操作系统. BSP组,主要工作内容就是负 ...

  8. SDIO_WiFi驱动学习之SDIO架构介绍及源码分析

    一.引言 因为WiFi驱动比较复杂,所以WiFi驱动的博客将多分几篇来写. 本篇博客主要介绍Linux下的SDIO架构及源码分析. 本文部分内容摘抄自网络,若有侵权,请联系删除. 二.SDIO WiF ...

  9. Camera5 MTK camera驱动框架介绍

    一.概序: 前文已经介绍了camera驱动部分的内容Camera4 MTK camera驱动结构介绍,这里在回顾下之前的框架图, 这篇主要介绍红框部分的内容: imgsensor起到承上启下的作用,在 ...

最新文章

  1. 使用Facade模式分析
  2. 从源码分析DEARGUI之异步调用函数对比
  3. 想学python看什么书-想学习Python做数据分析,应该看哪些书?
  4. Spring - Java/J2EE Application Framework 应用框架 第 14 章 JMS支持
  5. OO实现ALV TABLE 三:ALV的功能设计
  6. system文件_解压MIUI 10 升级包 system.new.dat.br
  7. CentOS中配置VNC Server
  8. java能过吗_java – 你能通过例子解释AspectJ的cFlow(P u00...
  9. 企业双11业绩增长156% 、成交额突破151亿元...... 这背后是阿里云数据中台的场景赋能
  10. Spring和Mybatis整合-mapper开发
  11. 小规模纳税人和一般纳税人的区别
  12. 分享146个培训课件PPT模板,总有一款适合你
  13. ChatGPT学习研究总结
  14. 马云:不要买房了,未来房子如葱!10年后最便宜的是房子车子,而最贵的是…...
  15. 设计师必备的设计软件
  16. mysql 查询不重复的值_在 MySQL 中查询不重复记录值的方法
  17. 【实践】Stm32f10x_74Hc595倒计时实现实例
  18. 第001讲:我和Python的第一次亲密接触 | 课后测试题及答案(小甲鱼)
  19. LeetCode题解 - 动态规划-股票买卖
  20. 2023年上半年数据库系统工程师上午真题及答案解析

热门文章

  1. 7-223 sdut-C语言实验-求阶乘(循环结构)7-224 sdut-C语言实验-排序问题7-225 sdut-C语言实验- 冒泡排序中数据交换的次数
  2. 【物理应用】大气湍流相位屏仿真matlab源码
  3. azure linux 修改内网ip,服务器修改内网IP地址
  4. 小米4c android版本号,小米4c的手机系统是什么?能升级安卓5.0吗?
  5. 数据库 - 02 MySQL学生选课系统
  6. 微软“神秘产品”Windows Surface发布会直播汇总
  7. 汽车配件销售管理系统毕业设计
  8. 最全解读 |《数据安全法(草案)》热点解析(上)
  9. Python游戏开发,Python实现开心消消乐小游戏 附带源码
  10. 财务会计基础(二)复式记账法