`
isiqi
  • 浏览: 16088417 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

基于V4L2的视频驱动开发(4)

 
阅读更多

3 Video 核心层的实现

参见内核 /drivers/media/videodev.c

1 )注册 256 个视频设备

static int __init videodev_init(void)

{

int ret;

if (register_chrdev (VIDEO_MAJOR, VIDEO_NAME, &video_fops)) {

return -EIO;

}

ret = class_register(&video_class);

……

}

上面的代码注册了 256 个视频设备,并注册了 video_class 类。 video_fops 为这 256 个设备共同的操作方法。

2 V4L2 驱动注册函数的实现

int video_register_device(struct video_device *vfd, int type, int nr)

{

int i=0;

int base;

int end;

int ret;

char *name_base;

switch(type) // 根据不同的 type 确定设备名称、次设备号

{

case VFL_TYPE_GRABBER:

base=MINOR_VFL_TYPE_GRABBER_MIN;

end=MINOR_VFL_TYPE_GRABBER_MAX+1;

name_base = "video";

break;

case VFL_TYPE_VTX:

base=MINOR_VFL_TYPE_VTX_MIN;

end=MINOR_VFL_TYPE_VTX_MAX+1;

name_base = "vtx";

break;

case VFL_TYPE_VBI:

base=MINOR_VFL_TYPE_VBI_MIN;

end=MINOR_VFL_TYPE_VBI_MAX+1;

name_base = "vbi";

break;

case VFL_TYPE_RADIO:

base=MINOR_VFL_TYPE_RADIO_MIN;

end=MINOR_VFL_TYPE_RADIO_MAX+1;

name_base = "radio";

break;

default:

printk(KERN_ERR "%s called with unknown type: %d/n",

__func__, type);

return -1;

}

/* 计算出次设备号 */

mutex_lock(&videodev_lock);

if (nr >= 0 && nr < end-base) {

/* use the one the driver asked for */

i = base+nr;

if (NULL != video_device[i]) {

mutex_unlock(&videodev_lock);

return -ENFILE;

}

} else {

/* use first free */

for(i=base;i<end;i++)

if (NULL == video_device[i])

break;

if (i == end) {

mutex_unlock(&videodev_lock);

return -ENFILE;

}

}

video_device[i]=vfd; // 保存 video_device 结构指针到系统的结构数组中,最终的次设备号和 i 相关。

vfd->minor=i;

mutex_unlock(&videodev_lock);

mutex_init(&vfd->lock);

/* sysfs class */

memset(&vfd->class_dev, 0x00, sizeof(vfd->class_dev));

if (vfd->dev)

vfd->class_dev.parent = vfd->dev;

vfd->class_dev.class = &video_class;

vfd->class_dev.devt = MKDEV(VIDEO_MAJOR, vfd->minor);

sprintf(vfd->class_dev.bus_id, "%s%d", name_base, i - base);// 最后在 /dev 目录下的名称

ret = device_register(&vfd->class_dev);// 结合 udev mdev 可以实现自动在 /dev 下创建设备节点

……

}

从上面的注册函数中可以看出 V4L2 驱动的注册事实上只是完成了设备节点的创建,如: /dev/video0 。和 video_device 结构指针的保存。

3 )视频驱动的打开过程

当用户空间调用 open 打开对应的视频文件时,如:

int fd = open(/dev/video0, O_RDWR );

对应 /dev/video0 的文件操作结构是 /drivers/media/videodev.c 中定义的 video_fops

static const struct file_operations video_fops=

{

.owner = THIS_MODULE,

.llseek = no_llseek,

.open = video_open,

};

奇怪吧,这里只实现了 open 操作。那么后面的其它操作呢?还是先看看 video_open 吧。

static int video_open(struct inode *inode, struct file *file)

{

unsigned int minor = iminor(inode);

int err = 0;

struct video_device *vfl;

const struct file_operations *old_fops;

if(minor>=VIDEO_NUM_DEVICES)

return -ENODEV;

mutex_lock(&videodev_lock);

vfl=video_device[minor];

if(vfl==NULL) {

mutex_unlock(&videodev_lock);

request_module("char-major-%d-%d", VIDEO_MAJOR, minor);

mutex_lock(&videodev_lock);

vfl=video_device[minor]; // 根据次设备号取出 video_device 结构

if (vfl==NULL) {

mutex_unlock(&videodev_lock);

return -ENODEV;

}

}

old_fops = file->f_op;

file->f_op = fops_get(vfl->fops);// 替换此打开文件的 file_operation 结构。后面的其它针对此文件的操作都由新的结构来负责了。也就是由每个具体的 video_device fops 负责。

if(file->f_op->open)

err = file->f_op->open(inode,file);

if (err) {

fops_put(file->f_op);

file->f_op = fops_get(old_fops);

}

……

}

分享到:
评论

相关推荐

    基于V4L2的视频驱动开发.doc

    编写基于V4L2视频驱动主要涉及到以下几个知识点: l、摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 2、Camera解码器、控制器 如果摄像头是模拟量输出的,...

    基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点: ●摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 ●Camera解码器、控制器 如果摄像头是模拟量输出的,要...

    linux基于V4L2的视频驱动开发

    编写基于V4L2视频驱动主要涉及到以下几个知识点: ● 摄像头方面的知识 要了解选用的摄像头的特性,包括访问控制方法、各种参数的配置方法、信号输出类型等。 ● Camera解码器、控制器 如果摄像头是模拟量输出的,...

    V4L2的视频驱动/应用层开发

    基于V4L2的视频驱动开发,详细介绍了V4L2驱动模块与应用层的调用关系,应用层IOCTL命令参数详解,做摄像头驱动、或摄像头应用开发的均可适用。

    论文研究-基于Zynq-7000的V4L2双帧缓存驱动设计 .pdf

    基于Zynq-7000的V4L2双帧缓存驱动设计,王宇,胡若澜,V4L2是Linux2.6版本的一大特点,它主要为视频驱动程序的开发提供了相关的协议标准。Zynq-7000处理器结合了ARM架构和FPGA的特点,其软硬件��

    基于Qt开发平台,利用linux下视频采集驱动V4L2,实现视频的采集

    基于Qt开发平台,利用linux下视频采集驱动V4L2,实现视频的采集,同时可以捕捉一帧数据,将某一帧数据保存文件,以.jpg格式保存.rar

    基于DM365的网络高清编码模块软件的开发

    其中包括:基于V4L2的视频采集驱动的开发和性能优化;采用H.264视频编 码去除帧图片的空间和时间冗余性,以达到压缩视频数据的效果;分析H.264 视频编码核心技术,对H.264的快速模式选择进行了算法优化,降低了因...

    基于Zynq_7000高清视频采_省略_系统Linux移植与应用程序设计_李朗.caj

    在 Linux 操作系统移植任务中,充分研究了驱动程序和底层 IP 核的关系,基于 V4L2 框架完成了视频处理 IP 核驱动程序开发,通过视频 IP 核的优化处理,完成了 RGB 格式高清图像采集与显示。在应用层采用软硬件协同...

    基于DM6446的立体图像显示系统和视频捕捉系统的设计与实现

    本文选用TI公司的双核多媒体处理器DM6446作为处理平台,...编写了基于DM6446平台的视频捕捉驱动程序V4L2(Video for Linux 2)及用于系统控制和配置的12C设备驱动程序;编写了多种用户应用程序,使整个系统能稳定地工作。

    OpenCV在嵌入式智能监控系统中的应用_吴其发.caj

    系统视频采集模块基于V4L2驱动框架设计,并实现监控视频的本地显示;远程监控部分通过S5PV210芯片内置的MFC视频硬编码器实现对监控视频的H.264硬压缩,然后依照RTP/RTCP协议将压缩后的H.264码流发送到Internet,使用...

    3U深度学习GPU+FPGA图像处理卡

    TX2侧的V4L2视频捕获Demo 演示如何通过V4L2驱动抓取前端视频 经典的算法Demo 在线学习型目标跟踪(可提供源码,作为您的开发起点) 前沿的算法Demo Yolo—基于深度学习的多目标识别框架(可提供源码,作为您的...

    基于ARM和Linux的视频图像采集系统

    研究了USB摄像头在Linux中的驱动开发,对系统总体结构、基于V4L2的视频采集以及视频动态显示应用程序等功能模块设计做了具体介绍。试验结果表明,本系统实现了在LCD显示器上动态显示USB摄像头采集的图像,且视频采集...

    android系统原理及开发要点详解

     3.3.3 v4l2摄像头——视频驱动 50  3.3.4 OSS音频驱动 53  3.3.5 ALSA音频驱动 54  3.3.6 MTD驱动 56  3.3.7 蓝牙驱动 57  3.3.8 Wlan驱动 58  第4章 Android的底层库和程序 60  4.1 底层库和程序的结构 60...

    基于TMS320DM365的高速网络摄像机的设计

    通过时基于TMS320DM365的高速网络摄像机进行硬件软件设计,从前端摄像头采集视频数据,通过Linux操作系统的V4L2编写驱动程序从而实现视频的采集。经H.264压缩算法对视频数据进行处理,通过RTP以及RTCP编码后经由100 ...

    嵌入式系统/ARM技术中的基于TMS320DM365的高速网络摄像机的设计

    通过时基于TMS320DM365的高速网络摄像机进行硬件软件设计,从前端摄像头采集视频数据,通过Linux操作系统的V4L2编写驱动程序从而实现视频的采集。经H.264压缩算法对视频数据进行处理,最后通过RTP以及RTCP编码后经由...

    Android技术内幕.系统卷(扫描版)

    5.2 视频驱动(v4l和v4l2)/201 5.2.1 v4l2介绍 /201 5.2.2 v4l2的原理和构架 /201 5.2.3 v4l2的实现 /202 5.3 音频驱动(oss和alsa)/208 5.3.1 oss与alsa介绍 /208 5.3.2 oss的构架与实现 /209 5.3.3 alsa的构架与...

    android 完全中文版 开发应用详解

    3.3.3 v4l2摄像头——视频驱动 50 3.3.4 oss音频驱动 53 3.3.5 alsa音频驱动 54 3.3.6 mtd驱动 56 3.3.7 蓝牙驱动 57 3.3.8 wlan驱动 58 第4章 android的底层库和程序 60 4.1 底层库和程序的结构 60 4.1.1 本地实现...

    Android技术内幕.系统卷 pdf

    5.2 视频驱动(v4l和v4l2)/201 5.2.1 v4l2介绍 /201 5.2.2 v4l2的原理和构架 /201 5.2.3 v4l2的实现 /202 5.3 音频驱动(oss和alsa)/208 5.3.1 oss与alsa介绍 /208 5.3.2 oss的构架与实现 /209 5.3.3 alsa...

Global site tag (gtag.js) - Google Analytics