v4l2驱动编写篇(2)
- 博客分类:
- 技术杂绘
v4l2驱动编写篇(2)
2011年04月01日
应用可以通过调用VIDIOC_G_FMT知道硬件现在的配置如何。这种情况下传递的参数是一个v4l2_format 结构体:
struct v4l2_format
{
enum v4l2_buf_type type;
union
{
struct v4l2_pix_format pix;
struct v4l2_window win;
struct v4l2_vbi_format vbi;
struct v4l2_sliced_vbi_format sliced;
__u8 raw_data[200];
} fmt;
};
同样,type 描述的是缓冲区类型;V4L2层会根据type的不同,将调用解释成不同的驱动的回调函数. 对于视频捕获设备而言,这个回调函数就是:
int (*vidioc_g_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
对于视频捕获(和输出)设备, 联合体中pix 字段是我们关注的重点. 这是我们在上一期中见过的v4l2_pix_format 结构体;驱动应该用现在的硬件设置填充那个结构体并且返回。这个调用通常不会失败,除非是硬件出现了非常严重的问题。
其他的回调函数还有:
int (*vidioc_s_fmt_overlay)(file, private_data, f);
int (*vidioc_s_fmt_video_output)(file, private_data, f);
int (*vidioc_s_fmt_vbi)(file, private_data, f);
int (*vidioc_s_fmt_vbi_output)(file, private_data, f);
int (*vidioc_s_fmt_vbi_capture)(file, private_data, f);
int (*vidioc_s_fmt_type_private)(file, private_data, f);
vidioc_s_fmt_video_output()与捕获接口一样使用相同的方式使用同一个pix字段。
多数应用都想最终对硬件进行配置以使其为应用提供一种符合其目的的格式。改变视频格有两个接口。第一个是VIDIOC_TRY_FMT 调用,它在V4L2驱动中转化为下面的回调函数:
int (*vidioc_try_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
int (*vidioc_try_fmt_video_output)(struct file *file, void *private_data,
struct v4l2_format *f);
/* And so on for the other buffer types */
要处理这个调用,驱动会查看请求的视频格式,然后断定硬件是否支持这个格式。如果应用请求的格式是不能支持的,就会返回-EINVAL.所以,例如,一个描述了一个不支持格的fourcc编码或者请求了一个隔行扫描的视频,而设备只支持逐行扫描的就会失败。在另一方面,驱动可以调整size字段,以与硬件支持的图像大小相适应。普便的做法是可能的话就将大小调小。所以一个只能处理VGA分辨率的设备驱动会根据情况相应地调整width和height参数而成功返回。v4l2_format 结构体会在调用后复制给用户空间;驱动应该更新这个结构体以反映改变的参数,这样应用才可以知道它真正得到就是什么。
VIDIOC_TRY_FMT 这个处理对于驱动来说是可选的,但是不推荐忽略这个功能.如果提供了的话,这个函数可以在任何时候调用,甚至时设备正在工作的时候。它不可以对实质上的硬件参数做任何改变,只是让应用知道都可以做什么的一种方式。
如果应用要真正的改变硬件的格式,它使用VIDIOC_S_FMT 调用,它以下面的方式到达驱动:
int (*vidioc_s_fmt_cap)(struct file *file, void *private_data,
struct v4l2_format *f);
int (*vidioc_s_fmt_video_output)(struct file *file, void *private_data,
struct v4l2_format *f);
与VIDIOC_TRY_FMT不同,这个调用是不能随时调用的.如果硬件正在工作,或者有流缓冲器己经开辟了(未来另一篇文章的),改变格式会带来无尽的麻烦。想想会发生什么,比如说,一个新的格式比现在使的缓冲区大的时候。所以驱动要一直保证硬件是空闲的,如果不空闲就对请求返回失败 (-EBUSY).
格式的改变应该是原子的
发表评论
-
Sharepoint+MOSS分册第2轮筛选结果文章列表
2012-01-20 00:34 717Sharepoint+MOSS分册第2轮筛 ... -
在 Android 平台上应用 Berkeley DB 11gR2 SQL(drop-in模式)(转http://www.cnmsdn.com/html/201004/1270362092ID3134.html)
2012-01-20 00:34 774在 Android 平台上应用 Ber ... -
编程心得
2012-01-20 00:34 663编程心得 2011年03月21日 转自:http://w ... -
在 C# 中通过 P/Invoke 调用Win32 DLL
2012-01-20 00:34 746在 C# 中通过 P/Invoke 调用Win32 DLL ... -
http://www.cnblogs.com/yungboy/archive/2010/05/28/1746376.html
2012-01-20 00:33 850http://www.cnblogs.com/yungboy/ ... -
10] 建立C帝国(GDAL编译安装以及一般的C库编译步骤)
2012-01-19 01:31 86610] 建立C帝国(GDAL编译安 ... -
Android开发之Android体系架构介绍
2012-01-19 01:31 1534Android开发之Android体系 ... -
EGLIBC库介绍
2012-01-19 01:31 594EGLIBC库介绍 2011年05月05 ... -
给Win32 GUI程序调试信息输出方法
2012-01-19 01:31 1335给Win32 GUI程序调试信息输出方法 2011年09月2 ... -
SAMSUNG S3C2440的简易BootLoader ㈢
2012-01-19 01:31 596SAMSUNG S3C2440的简易BootLoa ... -
Application/Session/Cookie/viewstate/Cache/隐藏域/查询字符串的比较
2012-01-17 00:48 632Application/Session/Cookie/view ... -
file_operation结构体详解
2012-01-17 00:48 1002file_operation结构体详解 2011年06月22 ... -
电脑蓝屏自动关机故障的检修方法
2012-01-17 00:48 637电脑蓝屏自动关机故障的检修方法 2011年09月23日 ... -
Video4Linux
2012-01-17 00:48 763Video4Linux 2011年12月05日 Vide ... -
HK-2000数据采集仪WEB服务器BOA的移植方法
2012-01-15 19:37 667HK-2000数据采集仪WEB服务器BOA的移植方法 200 ... -
如何为linux嵌入式开发建立交叉编译环境(2.4内核)
2012-01-15 19:36 683如何为linux嵌入式开发建立交叉编译环境(2.4内核) 2 ... -
【转】如何为嵌入式开发建立交叉编译环境
2012-01-15 19:36 743【转】如何为嵌入式开发建立交叉编译环境 2009年10月26 ... -
EGLIBC库介绍
2012-01-15 19:36 537EGLIBC库介绍 2011年05月05 ... -
c库函数qsort使用方法实例
2012-01-15 19:36 534c库函数qsort使用方法实例 2010年01月03日 ...
相关推荐
Video for Linux Two,v4l2驱动编写指南
花了很大的经历,搜集并整理了v4l2开发的文档,这些文档写的比较...⑤V4L2驱动编写指南 ⑥V4L2驱动程序架构 ⑦v4l2驱动高级编写篇 ⑧V4L2驱动的移植与应用(一) ⑨V4L2驱动的移植与应用(二) ⑩V4L2驱动的移植与应用(三)
有关V4L2的说明文档
是基于 http://lwn.net/网站上的经典系列文章《Video4Linux2》的翻译整理。V4L2 驱动编程指南,适合初步者或者参考手册。
v4l2 spec v0.24中文版全五章、带标签,包括“第五章驱动程序编写指南”,有需要的可以看看,希望有人帮忙审校一下,如果愿意可以发邮:fishOnFly@outlook.com ...
V4L2较V4L有较大的改动,并已成为2.6的标准接口,函盖video\dvb\FM...,多数驱动都在向V4l2迁移。更好地了解V4L2先从应 用入手,然后再深入到内核中结合物理设备/接口的规范实现相应的驱动。本文先就V4L2在视频捕捉...
编写基于V4L2视频驱动主要涉及到以下几个知识点: l、摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 2、Camera解码器、控制器 如果摄像头是模拟量输出的,...
编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 ●Camera解码器、控制器 如果摄像头是模拟量输出的,要...
v4l2 spec v0.24中文版全五章、带标签,包括“第五章驱动程序编写指南”,有需要的可以看看,希望有人帮忙审校一下,如果愿意可以发邮:fishOnFly@liitokala.com
编写基于V4L2视频驱动主要涉及到以下几个知识点: ● 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 ● Camera解码器、控制器 如果摄像头是模拟量输出的,...
在linux环境下,用Qt编写显示视频的界面,摄像头使用v4l2驱动的 在linux环境下,用Qt编写显示视频的界面,摄像头使用v4l2驱动的
介绍 video for linux two (V4L2) 驱动编写指南
内容包括: 1. V4L2 spec 中文 v0.625.pdf 2. v4l2-api-document.pdf 3. v4l2编程经典_.pdf 4. V4L2驱动编写指南.pdf 5. V4L2驱动程序架构.pdf
Linux下I.MX6U开发板的摄像头应用程序。...通过该程序,能够实现摄像头数据显示在LCD上,通过该程序,可以掌握Linux应用开发中v4l2框架的摄像头驱动函数,以及对/dev/video0,/dev/fb0的打开、读取和关闭等操作。
这份代码是TI针对OMAP3 ISP模块的驱动实现,编写遵守V4L2框架,涉及多个v4l2_subdev,非常典型的V4L2的编写场景,代码清新,很适合对V4L2的深入学习理解。另:TI对应的datasheet对ISP的硬件描述也非常详尽,可辅助...
【eoe_Android特刊】第十七期:Android摄像头的应用.pdf 210的摄像头驱动框架.doc 6410-linux驱动程序的位置.pdf ... Video for Linux Two(V4L2)——驱动编写指南.pdf 基于Android的 USB照相机的研究与实现.pdf
关于在嵌入式下视频监控的运用,在摄像头端加的视频驱动,V4Linux2驱动的编写
2、v4l2框架 目前linux上的camera都是按照v4l2框架来设计,它的地址位于drivers/media/v4l2-core 3、查看三星soc是如何支持camera的,可以查看drviers/media/platform/Kconfig config VIDEO_S3C_CAMIF tristate ...