版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1V4L2简介video41inux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux中视频设备访问提供了通用接口,在Linux系统中,V4L2驱动的Vide。设备节点路径通常/dev/video/中的videoXV4L2驱动对用户空间提供字符设备,主设备号为81,对于视频设备,其次设备号为0-63。除此之外,次设备号为64-127的Radio设备,次设备号为192-223的是Teletext设备,次设备号为224-255的是VBI设备V4L2驱动的Vide。设备在用户空间通过各种ioctl调用进行控制,并且可以使用mmap进行内存映射1.1V4L2驱动主要使用的ioctl
2、命令值如下所示:ttdefineVIDIOC_QUERYCAP_I0R(,V,,0,structv412_capability)/*查询能力*/ftdefineVIDI0_G_FMT_I0WR(,V,,4,structv412_format)/*获得格式*/ftdefineVIDI0C_S_FMT_I0WR(V,5,structv412_format)/*设置格式*/ttdefineVIDIOC_REQBUFS_I0WR(,V,,8,strutv412_requestbuffers)/*申请内存*/ftdefineVIDI0C_G_FBUF_I0W(V,10,structv412_frameb
3、uffer)/*获得Framebuffer*/ftdefineVIDI0C_S_BUF_I0WfV11,structv412_framebuffer)/*设置Framebuffer*/ttdefineVIDI0C_0VERLAY_I0W(,V,,14,int)/*设置Overlay*/ttdefineVIDIOC_QBUF_I0WR(,V,,15,structv412_buffer)/*将内存加入队歹!J*/defineVIDIOC_DQBUF_I0WR(V,17,strutv412_buffer)/*从队列取出内存*/defineVIDIOC_STREAMON_I0W(V,1&int)/*开
4、始流*/defineVIDIOC_STREAMOFF_I0W(V,19,int)/*停止流*/ttdefineVIDIOC_G_CTRL_I0WR(,V,,27,structv412_control)/*得到控制*/ttdefineVIDIOC_S_CTRL_I0WR(,V,,2&structv412_control)/*设置控制*/1.2重要结构头文件mclude/liiiux./videodev2.11mclude/media/v412-deT.hV4L2驱动核心实现文件:dnver/media/video/v412dev.cv412-dev.h中定义的video_device是V4L2驱
5、动程序的核心数据结构strnctvideo_deviceconststrnctv412_file_operations*fbps;stmctcdev*cdev;/字符设备stmctdevice*parent;/父设备stmctv412device*v412dev;/父v412devicechariiame32;/名称mtvfl_type;类型mtminor;/次设备号/*释放回调1*7void(*release)(structvideo_device*vdev);/*ioctl回调*/conststmctv412_ioctl_ops*ioctl_ops;常用的结构参M/include/lmux
6、/videodev2.h设备能力结构stiuctv412_capability_u8dnver16;驱动名_u8card32;/例如HauppaugewinTV_u8biis_info32/PCI总线信息_u32version;/内核版本_u32capabilities;/设备能力_u32reserved4;;数据格式结构stiuctv412_fonnatenumv412_bu匚typetype;/本结构的数据类型;像素格式结构stiuctv412_pix_fonnat_u32width;/宽度_u32height;/高度请求缓冲stiuctv412_requestbuffersu32coun
7、t;/缓存数量enumv412_bu匚typetype;/数据流类型数据流类型包括V4L2_MEMORY_MMAP和V4L2IEMORY_USERPTRenumv412_memory;2V4L2驱动注册2.1video.register.devicevideo41mux2驱动程序的注册dnvers/mediaAideovideo_register_device函数用来注册一个v41驱动程序mtvideo_register_device(stinctvideo_device*vdev?mttype,intnr)return_video_register_device(vdev?type,m1);
8、其中参数type支持的类型如下#defineTL_TYPE_GRABBER0视频#defiiieTL_TYPE_PI1/从视频消隐的时间取得信息的设备#defineTL_TYPE_RADIO2/、播#defineTL_TYPE_VTX3视传设备#defineTL_TYPEJ4AX4/最k值返回调用_video_register_device()_video_register_device函数先检查设备类型,接卜来牙找一禾可用设备号,最后注册相应的字符设备staticmt_video_iegister_device(structvideo_device*vdev,mttype,mtnr,intw
9、am_i匚nr_in_use)switch(type)caseTL_TYPE_GRABEERjnimor_offset=0;nimor_cnt=64:break;caseTL_TYPE_RADIO:nimor_offset=64;nimor_cnt=64:break;caseTL_TYPE_VTX:nimor_offset=192;nimorent=32;break;caseTL_TYPE_n:ninior_offset=224;nimor_cnt=32;break;nr=devnode_find(vdev,nr=1?0m;minor_cnt);nr=devnode_find(vdev?nr=
10、1?0:m;minor_cnt);vdev-cdev-ops=&v412_fops;注册字符设备ret=cdev_add(vdev-cdev,RIKDE*V(TDEO_MAJOR,vdev-ninor),1);ret=device_register(&vdev-dev);注册完毕设备看息存储在video_device数组中mutex_lock(&videodev_lock);ideo_devicevdev-minor=vdev;mutex_unlock(&videodev_lock);2.2V4I2Jops接口v412_fops为video41inux2设备提供了统一的应用层接II,v412_
11、fops定义如卞staticconststiuctfile_operationsv412_fops=owner=THIS_MODULE,.read=v412_read?.write=v412_write,.open=v412_open,.get_unmapped_area=v412_get_immapped_area,.lmiiap=v412_mmap,.milockedloctl=v412ioctL.release=v412_release,.poll=v412_poll,.llseek=nollseek,;v412_fops中的成员函数最终要调用structvideo_device-fop
12、s中相应的成员structvideo_device-fbps是具体video41mux2摄像头驱动程序必须实现的接I1staticssize_tv412_read(structfilecliar_user*buf,size_tsz,lofft*off)returnvdevfbpsread(fnp,buf,sz,off);2.3/drivers/media/video/samsung/fimc/s3c_fimc_core.c驱动探测函数s3c_func_probe定义staticmts3c_fimc_piobe(structplatfbnn_device*dev)Ctrl=s3c_fimc_re
13、gister_controller(pdev);clk_enable(ctrl-clock);/使能时钟注册V4L2驱动ret=video_register_device(ctrl-vd,ATL_TYPE_GRABBER,ctil-id);s3c_fiiiic_register_contoller函数主要用来分配资源与申请中断staticstrncts3c_fimc_control*s3c_fimc_register_controller(stnictplatfonn_device*pdev)ctrl-vd=&s3c_fimc_video_devicei(l;申请中断ctrl-u-q=plat
14、fbnn_get_irq(pdev?0);if(request_irq(ctrl-irq,s3c_fimc_irq,IRQF_DISABLED,ctrl-iiame,Ctrl);structvideo_devices3c_finic_video_deviceS3C_FIN!C_MAX_CTRLS=0=.vfljype=MD_TYPE_OTRLAY|VID_TYPE_CAPTURE|1D_TYPE_CLIPPING|门D_TYPE_SCALES,.fops=&s3c_fimc_fops,.ioctl_ops=&s3c_fimc_v412_ops,.release=s3cfiincvdevrele
15、ase,.name=sc3_video0,s3c_fiinc_v412_ops,是在diivers/mediXideo/sanisung/fimc中实现的v412_ioctl_ops,在用户空间进行ioctl等调用时,要调用到具体实现的各个函数指针3V4L2操作3.1s3c_fimc_openstaticmts3c_fiinc_open(stiiictfile*filp)stmcts3cfiinccontrol*ctrl;mtid,ret;id=0;Ctrl=&s3c_fimc.ctrlid;mutex_lock(&ctrl-lock);if(atomic_read(&ctrl-in_use)
16、ret=-EBUSY;gotoresource_busy;elseatomic_inc(&ctil-in_use);s3c_fimc_reset(ctrl);filp-private_data=Ctrl;miitex_unlock(&ctiLlock);return0;resource_btisy:miitex_unlock(&ctiLlock);returnret;用户空间打开设备文件fd=open(dev_iiame,O_RDWR|ONONBLOCK,0);3.2获取设备的capability,查看设备有什么功能结构体stmctv412_capabilitycap;ret=ioctl(fd
17、,TDIOC_QUERYCAP,&cap);/includelinux/videodev2.hstructv412_capability_u8driver16;/*i.e.”bttv”*/_u8card32;/*i.e.HauppaugeWinTV”*/_u8bus_infb32;/*nPCI:H+pci_name(pci_dev)/_u32version;/*shoulduseKERNEL_RSION()*/_u32capabilities;/*Devicecapabilities*/_u32resenred4;;2)驱动实现staticmts3c_fimc_v412_querycap(st
18、iuctfile*filp,void*fh,stmctv412_capability*cap)stmcts3cfiinccontrol*ctrl=(stmcts3cfiinccontrol*)fh;strcpy(cap-diiver,”SamsungFIMCDnvern);strlcpy(cap-card,ctil-vd-iiame?sizeof(cap-card);spnntf(cap-bus_uifd,”FIMCAHB-bus11);capversioii=0;cap-capabilities=(SL2_CAP_VIDEO_O、王RLAY|SL2_CAP_VIDEO_CAPTURE|V4L
19、2_CAP_STREAMING);return0;3)应用层调用staticmtvideo_capability(mtfd)mtret=0;stmctv412_capabilitycap;ret=ioctl(fd,TDIOC_QUERYCAP,&cap);if(ret=S3C_FIMC_MAX_INPUT_TYPES)retiun-EINAAL;ctrl-v412.mput=&s3c_fimc_mput_typesi;if(s3c_fimc_input_typesi.type=V4L2_INPUT_TYPE_CAMERA)ctrl-uvtype=PATH_IN_rrU_CAMERA;elsec
20、tii-iii_type=PATH_IN_DMA;return0;staticstiuctv412_inputs3c_fimc_input_types=.index=0,.name=ExternalCameraInput,type=V4L2_INPUT_TYPE_CAMERA,.audioset=1,timer=0,.std=V4L2STDPALBG|V4L2STDNTSCM5,.status=0,.index=1,.name=MemoryInput11,type=V4L2_INPUT_TYPE_MEMORY,.audioset=2,timer=0,.std=V4L2STDPALBG|V4L2
21、STDNTSCM,.status=0,;staticmts3c_fimc_v412_eiium_input(structfile*filp,void*fli,stmctv412_mput*i)if(i-index=S3C_FIMC_MAX_INPUT_TYPES)retiun-EINAAL;memcpy(i,&s3c_fimc_mpiit_typesi-mdex,sizeof(stnictv412_input);return0;3)应用staticmtvideo_mput(intfd)/*+*getandsettlieA7DIOINPUT*/mtret=0;stmctv412_inputmpu
22、t;视频输入信息,对应命令A1DIOC_ENUNIINPUTmtindex;mdex=0;/0-Conositeinput,1-S-Videomput.ret=loctl(fd,VIDIOCSINPUT,&index);if(ret0)perror(rTDIOC_S_INPUT”);retiunret;mput.mdex=mdex;ret=loctl(fd,VIDIOC_ENUMINPUX&input);if(retmdex;if(index=S3C_FIWIC_MAX_CAPTURE_FORMATS)retiun-EINAAL;meinset(f?0,sizeof(*f);memcpy(f5
23、ctil-v412.fintdesc+index,sizeof(*f);return0;#defineS3C_FIMC_MAX_CAPTURE_FORMATSARRAY_SIZE(s3c_fimc_capture_foimats)conststaticstiuctv412_fintdescs3c_fiinc_captiu-e_fbnnats=.indextype.flagsdescriptionpixelfoniiat=0?=V4L2BUFTYPEMDEOCAPTURE,=FORMATFLAGSPLANAR.=n4:2:0,planar,Y-Cb-Cf=V4L2PIXFMTYUV420,tII
24、II.index=1,type=V4L2BUF_TYPEjnDEO_CAPTURE,.flags=FORKIAT_FLAGS_PLANAR:.description=”422,planar,Y-Cb-Crn,.pixelfoniiat=V4L2_PIX_FMT_YUV422R.indextype.flagsdescriptionpixelfoniiat=2,=V4L2BUFTYPEMDEOCAPTURE,=FORMATFLAGSPACKED,=”422,packed,YCBYCR役=V4L2_PIX_FMT_YUY;.indextype.flagsdescriptionpixelfoniiat
25、=3,=V4L2BUFTYPEMDEOCAPTURE,=FORMATFLAGSPACKED,=”422,packed,CBYCRY蔦=V4L2_PIX_FMT_UYAH;conststaticstiuctv412fintdescs3c_finic_overlay_fbrmats=.indextype.flagsdescriptionpixelfoniiat=0?=V4L2JBUF_TYPEJUDEO_O王RLAY,=FORMATFLAGSPACKED,=n16bppRGBJeK,=V4L2_PIX_FMT_RGE565,.index=1,type=V4L2JBUF_TYPEJUDEO_O王RL
26、AY,.flags=FORKIAT_FLAGS_PACKED,description=”24bppRGB,len,.pixelfomiat=V4L2_PIX_FMT_RGB24,;3)应用层staticmtvideo_fiiitdesc(mtfd)mtret=0;stmctv412_fintdescfintdes;CLEAR(fintdes);fintdes.index=0;fintdes.type=V4L2_BUF_TYPE_TDEO_CAPTURE;prmtf(Hn*vidiocenumerationstreamformatuiforniations:*nM);while(1)ret=io
27、ctl(fd,TDIOC_ENUM_FMT,&fintdes);if(retv412.fimbuf.fint=f-fiiit.pix;if(f-fiiit.pix.pnv=4L2_FMT_IN)s3c_fimc_set_input_fiame(ctrr&ffint.pix);elses3c_fimc_set_output_&ame(ctrl,&ffint.pix);return0;mts3c_fimc_set_inpiit_fiame(structs3c_fiinc_control*ctrl,stiuctv412_pix_fonnat*fint)s3c_fimc_set_mput_foniia
28、t(ctrl,fint);return0;staticvoids3c_fimc_set_input_fbmiat(structs3c_fimc_coiitrol*ctrtstmctv412jpix_format*fiiit)stmcts3cfiincinframe*frame=&ctrl-mframe;frame-width=五width;frame-height=fint-height;switch(fint-pixelfbniiat)caseSL2_PIX_FMT_RGE565:fi-ame-fbnnat=FORMAT_RGB565;frame-planes=1;break;case4L2
29、_PIX_FMT_RGB24:fi-ame-fbnnat=FORMAT_RGB888;frame-planes=1;break;caseSL2_PIX_FMT_NV12:frame-fbniiat=FORMAT_YCBCR420;frame-planes=2;frame-ordei,_2p=LSBCBCR;break;caseSL2_PIX_FMT_NV21:frame-fbniiat=FORMAT_YCBCR420;frame-planes=2;frame-ordei,_2p=LSB_CRCB;break;caseSL2_PIX_FMT_NV12X:frame-fbniiat=FORMAT_
30、YCBCR420;frame-planes=2;frame-ordei_2p=MSB_CBCR;break;caseSL2_PIX_FMT_NV21Xiframe-fbniiat=FORMAT_YCBCR420;frame-planes=2;frame-ordei_2p=MSB_CRCB;break;case4L2_PIX_FMT_YUV42(kframe-fbniiat=FORMAT_YCBCR420;frame-planes=3;break;caseSL2_PIX_FMT_YUYVframe-fbniiat=FORMAT_YCECR422;frame-planes=1;frame-orde
31、ilp=IN_ORDER422_YCEYCR;break;case4L2_PIX_FMT_YYUframe-fbmiat=FORMAT_YCECR422;frame-plaiies=1;frame-ordeilp=IN_ORDER422_YCRYCB;break;casef4L2_PIX_FMT_UYY:frame-fbmiat=FORMAT_YCECR422;frame-plaiies=1;frame-ordeilp=IN_ORDER422_CEYCRY;break;caseSL2_PIX_FMT_mY:frame-fbmiat=FORMAT_YCECR422;frame-plaiies=1
32、;frame-ordeilp=IN_ORDER422_CRYCBY;break;caseSL2_PIX_FMT_NV16】frame-fbmiat=FORMAT_YCECR422;frame-plaiies=2;frame-ordei,_lp=LSBCBCR;break;caseSL2_PIX_FMT_NV61:frame-fbmiat=FORMAT_YCECR422;frame-plaiies=2;frame-ordei,_lp=LSB_CRCB;break;caseSL2_PIX_FMT_NV16Xframe-fbmiat=FORMAT_YCECR422;frame-plaiies=2;f
33、rame-ordei,_lp=MSB_CBCR;break;caseSL2_PIX_FMT_NV61X:frame-fbmiat=FORMAT_YCECR422;frame-plaiies=2;frame-ordei,_lp=MSB_CRCB;break;caser4L2PIXFMTYUV422P】frame-fbmiat=FORMAT_YCBCR422;fi-ame-planes=3;break;应用层staticmtvideo_setfhit(intfd)/$*setsti-eamdatafonnat*/iiitret=0;stiuctv412_fbnnatfint;CLEAR(fint)
34、;fint.type=SL2_EUF_TYPE_1DEO_CAPTURE;fint.fint.pix.width=640;fint.fint.pix.height=480;fint.fiiit.pix.pixelfonnat=V4L2_PIX_FMT_YUY:/foiPALfint.fint.pix.field=V4L2_FIELD_INTERLACED;ret=ioctl(fd,TDIOC_S_FMI;&伍it);if(retEnt.pix,0,size);memcpy(&f-fint.pix5&(ctil-v412.fimbuf.fint),size);return0;2)应用static
35、mtvideo_getfhit(intfd)mtret=0;stmctv412_fbnnatfoit;CLEAR(fint);fint.type=SL2_BUF_TYPE_nDEO_CAPTURE;ret=ioctl(fd,TDIOC_G_FMI;&fint);if(retmemory!=SL2_MEMORY_MMAP)eiT(”V4L2_MEMORY_MMAPisonlysupportedain);retiun-EINAAL;/*conti-oluserinput*/if(b-count4)b-count=4;elseif(b-coiuitcount=1;return0;staticmts3
36、c_fimc_v412_querybuf(structfile*filp,void*fh,stmctv412_buffer*b)stmcts3c_fiinc_control*ctrl=(stincts3c_fimc_control*)fh;if(b-type!=V4L2_BUF_TYPE_TDEO_O、卫RLAY&bfype!=V4L2JBUF_TYPE_TDEO_CAPTURE)retiun-EINAAL;if(b-menioiy!=4L2_MEMORY_MMAP)retiun-EINAAL;b-length=ctrl-out_framebusize;/*NOTE:weusethem.off
37、setasanindexformultipleframesout.Becauseallframesarenotcontiguous,wecannotuseitasonginalpurpose.Theindexvalueusedtofindoutwhichframeuserwantstorninap.*/b-m.offset=b-index*PAGE_SIZE;return0;staticmts3c_fimc_v412_qbuf(structfilevoid*fli,stmctv412_buffer*b)return0;应用层staticmtvideo_imnap(intfd)/*stepl*requestbufiersAllocatingMemoiy*/mtret=0;stmctv412_requestbuffersreq;CLEAR(req);req.coiuit=4;req.type=SL2_BUF_TYPE_TDEO_CAPTURE;req.memoty=4L2_WIEMORY_MMAP;ret=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消费者认知与品牌忠诚-洞察与解读
- 肾移植免疫调控策略-洞察与解读
- 情感共鸣研究-洞察与解读
- 第4课:分享喜悦教学设计小学信息技术(信息科技)旧版西师大版
- 2026年能源合作仓储托管协议
- 预加载性能瓶颈研究-洞察与解读
- 初中历史人教版(部编)版教学设计七年级下册 6 北宋的政治
- 第18课《紫藤萝瀑布》教学设计 2025-2026学年统编版语文七年级下册
- 车载网络故障预测-洞察与解读
- 美国药厂面试题目及答案
- 电商直播 课件 模块5、6 美妆类商品直播、服装类商品直播
- 纳入定点后使用医疗保障基金的预测性分析报告
- 铁路接触网运行维修规则-修程修制
- 【盒马鲜生生鲜类产品配送服务问题及优化建议分析10000字(论文)】
- 下肢假肢-下肢假肢的结构特点
- 安徽师范大学辅导员考试题库
- 手术室高频电刀
- 10档双中间轴变速器进行传动方案的设计
- 化工工艺的热安全
- 职工追悼会悼词范文
- GB 29216-2012食品安全国家标准食品添加剂丙二醇
评论
0/150
提交评论