刚看到个新闻 “大学生发明体热充电宝是谁发明的 手握2小时能充满iPhone”。这个科学吗?

linux 2.6.35内核移植- USB camera功能添加
主机环境 :ubuntu 10.10
&&&&&&& 目标机:FS0)
&&&&&&& 主机工具链 :gcc-4.4.5
&&&&&&& 交叉工具链:arm-none-linux-gnueabi-gcc-4.3.2
&&&&&&& 摄像头 :ZC301
二、移植过程
1、配置内核是内核支持芯片为ZC301的摄像头
&&&&&&& Make menuconfig
&&&&&&&&&&&&&&& Device Drivers ---&
&&&&&&&&&&&&&&&&&&&&&&& &*& Multimedia support ---&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &*& Video For
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [*] Enable Video For Linux API 1 (DEPRECATED) (NEW)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [*] Video capture adapters (NEW) ---&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [*] V4L USB devices (NEW) ---&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&*& USB Video Class (UVC)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [*] UVC input events device support (NEW)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &*& USB ZC0301[P] webcam support (DEPRECATED)
2、重新编译内核
make zImage
通过上面两个步骤就可以驱动我们的摄像头了。但是这个驱动是基于V4l2的。以前基于V4L的一些上层应用就不能用了,或需要做大量的修改!这里我们要实现网络视频的功能,以前都是用servfox这个网络视频服务器,但是这个服务器就是基于V4L的,我们如果想用的话就得对servfox的进行修改。这里我们选用另外一种方案mjpg-stream。
3、mjpg-stream的移植
关于mjpg-stream的资料大家可以在下面这个网址查看:/blog/link2url.php?link=http%3A%2F%2Fsourceforge.net%2Fapps%2Fmediawiki%2Fmjpg-streamer%2Findex.php%3Ftitle%3DMain_Page
&&&&&&& mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库
(1)jpeg库的移植
&&&&&&& 1)jpeg源码包通过下面这个网址下载
&&&&&&&&&&&&&&& http://www.ijg.org/files/jpegsrc.v8b.tar.gz
&&&&&&&&&&&&&&& 2)解压源码包
&&&&&&&&&&&&&&& tar xvf jpegsrc.v8b.tar.gz
&&&&&&&&&&&&&&& 3)配置源码
&&&&&&&&&&&&&&& cd jpeg-8b
&&&&&&&&&&&&&&& ./configure --prefix=/home/linux/s3c.35/video/jpeg --host=arm-none-linux-gnueabi
&&&&&&&&&&&&&&& 4)编译
&&&&&&&&&&&&&&& make
&&&&&&&&&&&&&&& 5)安装
&&&&&&&&&&&&&&& make install
&&&&&&&&&&&&&&& 6)拷贝库到文件中
&&&&&&&&&&&&&&& cp //home/linux/s3c.35/video/jpeg /lib/libjpeg.so.8 /source/rootfs/lib
(2)mjpg-stream的移植
&&&&&&& 1)mjpg-stream源码包通过下面这个网址下载
&&&&&&&&&&&&&&& http://sourceforge.net/projects/mjpg-streamer/
&&&&&&&&&&&&&&& 2)解压源码
&&&&&&&&&&&&&&& tar xvf mjpg-streamer-r63.tar.gz
&&&&&&&&&&&&&&& 3)修改源码
&&&&&&&&&&&&&&& cd mjpg-streamer-r63
&&&&&&&&&&&&&&& 修改顶层makefile及plugins目录中的各级makefile将所有
&&&&&& &&&&&&&&&CC=gcc
&&&&&&&&&&&&&&& 修改为
&&&&&&&&&&&&&&& CC=arm-none-linux-gnueabi-gcc
&&&&&&& 修改plugins/input_u/Makfile
&&&&&&&&&&&&&&& 修改
&&&&&&&&&&&&&&& CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
&&&&&&&&&&&&&&& 为
&&&&&&&&&&&&&&& CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/linux/s3c.35/video/jpeg/include
&&&&&&&&&&&&&&& 修改
&&&&&&&&&&&&&&& $(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
&&&&&&&&&&&&&&& 为
&&&&&&&&&&&&&&& $(CC) $(CFLAGS) -ljpeg -L/home/linux/s3c.35/video/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
&&&&&&&& jpeg_utils.c:27: fatal error: jpeglib.h: No such file or directory
&&&&&&&&&&&&&&& 4)编译
&&&&&&&&&&&&&&& make
& 补充:linux 内核在29以上版本的要在此步之前修改drivers/media/video/gspca/gspca.c文件,在第220行的goto error_ }后面添加一行,最终的效果为如下:
&&& 220&&&&& goto error_
&&& 221&&&&& }
&&& 222&&& urb-&transfer_flags=URB_NO_TRANSFER_DMA_MAP;
&&& 223&&& usb_fill_int_urb(urb,dev,
&&&&&&&&&&& ...........此处省略
&&&&&&&&&&&&&& 5)测试
&&&&&&&&&&&&&&& mkdir /source/rootfs/mjpg
&&&&&&&&&&&&&&& cp *.so /source/rootfs/mjpg
&&&&&&&&&&&&&&& cp mjpg-stream /source/rootfs/bin
&&&&&&& 打开开开发板运行
&&&&&&&&&&&&&&& mjpg_streamer -i &/mjpg/input_uvc.so& -o &/mjpg/output_http.so -w /www&
&&&&&&&&&&&&&&& 在源码目录下有start.sh,这个脚本里有一些mjpg-stream的使用方法及说明
&&&&&&& 打开一个网页输入下面地址就能够看到一个视频(开发板的IP为192.168.1.202):
&&&&&&&&&&&&&&& http://192.168.1.202:8080/?action=stream
&&&&&&&&&&&&&&& 打开一个网页输入下面地址就能够看到一个静态图片:
&&&&&&&&&&&&&&& http://192.168.1.202:8080/?action=snapshot
&&&&&&&&&&&&&&& 6)在mjpg源码下有一个www的目录,这个一个网络使用mjpg的实例,结合web服务器(boa)可以实现一些其他相关功能。
补充:该实验很注重交叉工具链的统一使用,根文件系统的功能是否完善.
摘自 我的嵌入式
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'下次自动登录
现在的位置:
& 综合 & 正文
Linux 下摄像头驱动支持情况
本文所说的摄像头(Webcam),特指USB摄像头。
  在Windows下,摄像头驱动由厂商开发并提供。但在Linux下,因商业利益有限,只有极少厂商愿意提供摄像头驱动支持。这并不妨碍Linux下摄像头的使用——广大第三方志愿者维护着大大小小的驱动。之前做过一个嵌入式皮毛项目,虽然摄像头驱动不关我的事,在好奇心驱使下简要探索了一番。结果是有些胸闷,它们像蜘蛛丝一样杂乱。写本文的动机是想理清一下主线,给后来者提供一点有限的参考,但无法保证下面的文字完全正确。
  常见的摄像头驱动有以下几个系列:
OVCam drivers(ov5xx)
  该系列驱动是针对OmniVision OV5xx系列芯片,此类芯片被广泛运用于各种USB摄像头中,在嵌入式开发板上尤其常见。凡是使用了OV511/OV511+/OV518 /OV6620/OV6630/OV7610/OV7620/OV7 620AE等图像传感器的摄像头都可以在该驱动下工作。
 项目主页:http://alpha.dyndns.org/ov511/
Philips USB Webcam Driver(pwc)
该驱动主要用于Philips及pwc芯片兼容摄像头。由于原开发者与Philips公司签有保密协定,该驱动以二进制形式提供,后来被踢出内核,引起一场口水战:是用户需求重要还是保持内核纯洁重要?所幸后续开发者从原项目上创建了一个新的分支,使得该项目继续存活。 项目主页:http://www.saillard.org/linux/pwc/
QuickCam USB camera driver (qc-usb)
该驱动主要用于Logitech公司的QuickCam Express系列和其它兼容型号摄像头。最初由Georg Acher开发,当时命名为qce-ga。Jean-Frederic Clere参考该驱动创建出了第一个Video4Linux兼容驱动。从那开始,不断有开发者加入,使得该驱动逐渐能够支持新的摄像头和芯片。在此期间,该驱动更名为qc-usb,更为广泛地支持其它QuickCam
USB摄像头,而不再是局限于Express系列。 项目主页:http://qce-ga.sourceforge.net/
QuickCam Messenger & Communicate driver(quickcam)
这是另一个针对QuickCam摄像头的驱动,它仅支持某一些型号,并且与qc-usb驱动不兼容。
项目主页:http://home.mag.cx/messenger/
SPCA webcam driver(gspca/spca5xx)
该系列驱动适用于Sunplus芯片摄像头,也适用于其它芯片,如目前国内山寨摄像头一哥“中星微”(Z-Star)芯片。Michel Xhaard是该项目的维护者,他在60岁左右的时候(大约是2003年)从一种普通常见的驱动入手,进而不断修改开发成一个支持250种以上摄像头的通用驱动。他还写了流媒体服务器spcaserv与客户端spcaview。不少高校所谓的嵌入式无线网络视频传输项目,就是从这两个东西来的。
 项目主页:http://mxhaard.free.fr/spca5xx.html
Linux UVC driver(uvc)
该驱动适用于符合USB视频类(USB Video Class)规范的摄像头设备,它包括V4L2内核设备驱动和用户空间工具补丁。大多数大容量存储器设备(如优盘)都遵循USB规范,因而仅用一个单一驱动就可以操作它们。与此类似,UVC兼容外设只需要一个通用驱动即可。
  USB摄像头大体上可以二分为UVC cameras和non-UVC cameras。推荐购买UVC cameras。UVC是一个开放的标准,拥有维护良好的驱动,它属于内核的一部分。插入摄像头后就可以工作,而无须编译或安装额外的驱动。non-
UVC cameras通常情况下不比UVC cameras工作出色,前者的驱动并不遵循通用的协议,需要针对每种摄像头做出单独的处理,这往往需要一个逆向工程的探索过程。
  判断一个摄像头是否属于UVC规范可以使用下面方法:
  1.使用lsusb命令或其它硬件信息查看工具找出摄像头的设备号(Vendor ID)和产品号(Product ID)。如Logitech Quickcam for Notebooks Pro摄像头是046d:08cb;
  2.查找是否有视频类接口信息
  lsusb -d 046d:08cb -v | grep "14 Video"
  如果该摄像头兼容UVC,则会输出类似信息
  bFunctionClass 14 Video
  bInterfaceClass 14 Video
  bInterfaceClass 14 Video
  bInterfaceClass 14 Video
  若无以上信息,则是non-UVC设备。
  项目主页:http://linux-uvc.berlios.de/
  在Linux下摄像头驱动有三种存在形式,内置于内核(within the kernel),做为一个外挂的模块(module),或者是预编译的二进制(pre-compiled binary)。
  Linux内核树会不断合并优秀的驱动。从2.4内核起,ov5xx驱动就已经是内核代码的一部分。从2.6.26开始,Linux内核原生包含uvc 驱动。2.6.27内核又吸收进了gspca/spca5xx系列驱动。常见的Linux发行版所配置的内核,一般都已将这些驱动选项打开,而无需用户另外编译。内核的.config文件中有许多配置变量等式,用来说明内核配置的结果。y表示本编译选项对应的内核代码被静态编译进 Linux内核;m表示本编译选项对应的内核代码被编译成模块;n表示不选择此编译选项。
  以Fedora12/boot下的config文件为例
  cat /boot/config-2.6.31.12-174.2.3.fc12.i686 | grep CONFIG_USB_GSPCA
  CONFIG_USB_GSPCA=m
  CONFIG_USB_GSPCA_CONEX=m
  CONFIG_USB_GSPCA_ETOMS=m
  CONFIG_USB_GSPCA_FINEPIX=m
  CONFIG_USB_GSPCA_MARS=m
  CONFIG_USB_GSPCA_MR97310A=m
  CONFIG_USB_GSPCA_OV519=m
  CONFIG_USB_GSPCA_OV534=m
  CONFIG_USB_GSPCA_PAC207=m
  CONFIG_USB_GSPCA_PAC7311=m
  CONFIG_USB_GSPCA_SN9C20X=m
  CONFIG_USB_GSPCA_SN9C20X_EVDEV=y
  CONFIG_USB_GSPCA_SONIXB=m
  CONFIG_USB_GSPCA_SONIXJ=m
  CONFIG_USB_GSPCA_SPCA500=m
  CONFIG_USB_GSPCA_SPCA501=m
  CONFIG_USB_GSPCA_SPCA505=m
  CONFIG_USB_GSPCA_SPCA506=m
  CONFIG_USB_GSPCA_SPCA508=m
  CONFIG_USB_GSPCA_SPCA561=m
  CONFIG_USB_GSPCA_SQ905=m
  CONFIG_USB_GSPCA_SQ905C=m
  CONFIG_USB_GSPCA_STK014=m
  CONFIG_USB_GSPCA_SUNPLUS=m
  CONFIG_USB_GSPCA_T613=m
  CONFIG_USB_GSPCA_TV8532=m
  CONFIG_USB_GSPCA_VC032X=m
  CONFIG_USB_GSPCA_ZC3XX=m
  可以看到gspca系列驱动被编译为模块。当插入摄像头后,使用dmesg命令可以打印出以下信息:
  usb 1-1.2: new full speed USB device using ehci_hcd and address 6
  usb 1-1.2: New USB device found, idVendor=046d, idProduct=08af
  usb 1-1.2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
  usb 1-1.2: configuration #1 chosen from 1 choice
  gspca: probing 046d:08af
  zc3xx: probe 2wr ov vga 0x0000
  zc3xx: probe sensor -& 0011
  zc3xx: Find Sensor HV7131R(c)
  gspca: probe ok
  这说明该摄像头被识别,且自动挂载了gspca系列下的zc3xx驱动。
  如果由于某种原因,已配置的内核中没有包括摄像头驱动,可以重新配置内核选项,用新编译的内核替换原有的旧内核。或者是依据设备号及产品号,直接到对应驱动的项目主页,下载源码进行编译。
  最后总结一下
  如果你想买一个摄像头,推荐买Logitech的,买符合UVC驱动的,可以到这里挑一款。
  如果你已经有了一个摄像头,先插进去看看,Linux对它有没有反应。记录dmesg输出信息,记录lsusb输出设备号,以设备号为关键字上Google搜索。
  参考资源 http://www.tldp.org/HOWTO/Webcam-HOWTO/
  http://www.chineselinuxuniversity.net/courses/kern el/articles/19988.shtml
  http://www.quickcamteam.net/
&&&&推荐文章:
【上篇】【下篇】博客访问: 845457
博文数量: 355
博客积分: 2695
博客等级: 少校
技术积分: 3335
注册时间:
小鱼儿游啊游啊。。。。
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Android平台
大约一年前写的东西,介绍性部分是当时在网络上找的内容,后面的分析部分是基于当时的项目,基于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位的二进制数字来记录,最多记录的色彩是×亿种。
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表示垂直方向的点数。
QXGA (2048 X 1536)又称300万像素
UXGA ()又称200万像素
SXGA()又称130万像素
XGA()又称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 : (struct v4l2_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()的接口,功能见上一章
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内存空间
阅读(13619) | 评论(0) | 转发(3) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 体热充电宝 的文章

 

随机推荐