camer学习之vivi模拟视频驱动学习总结

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

Vivi源码目录
linux-3.4.113\drivers\media\video\vivi.c

驱动入口函数:vivi_ini()
这里写图片描述

在vivi_init函数中调用vivi_create_instance创建虚拟视频驱动实例。

vivi_create_instance()
这里写图片描述

首先 v4l2_device_register这个函数主要是v4l2设备的初始化,如初始化自旋锁,引用计数等,不是真正的设备注册,不是主要的。不再进入分析。继续看vivi_create_instance,代码第1307行

这里写图片描述
这里写图片描述

上面的代码首先是调用video_device_alloc分配一个视频设备的结构体,然后设置设备结构体参数,如设备名称以及fops和ioctl操作函数等,Linux内核使用结构体struct video_device来描述一个视频设备。最后就是调用video_register_device注册一个视频设备。

那么这个video devisce又是怎么注册的?具体实现又是怎么么样的?其实就是linux注册的字符设备,下面就重点来分析这个函数。

这里写图片描述
注册视频设备时传入三个参数,一个是video device结构体,一个是类型,再一个是nr。根据传入的type不同会创建不同类型的设备。

\linux-3.4.113\include\media\v4l2-dev.h
这里写图片描述

\linux-3.4.113\drivers\media\video\v4l2-dev.c

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
到者里就回到了最原始的字符设备驱动注册流程。

至此Video device已经注册完毕,那么video device的读写过程又是怎么样的?
应用程序通过系统调用接口open(“/dev/video0”,…),从上面的分析可以知道我们注册的video device最终也是一个字符设备,通过cdev_add注册到内核中,在注册该字符设备时设置了字符设备的操作函数vdev->cdev->ops = &v4l2_fops;
这里写图片描述
即应用程序通过系统调用读写这个video device 时最终也会调用到这里的读写函数

vivi.c模拟视频驱动分析总结:
1. 描述一个video device,内核使用struct video_device
\linux-3.4.113\include\media\v4l2-dev.h
这里写图片描述

  1. 调用video_device_alloc分配一个video device 结构体。
  2. 设置结构体参数,主要是fops函数集合,对这个video device 的左右操作都在vivi_fops和vivi_ioctl_ops函数集合中
    这里写图片描述
  3. 调用video_register_device 向内核注册一个video device。这个函数最终会调用字符设备的注册函数cdev_add,这部分架构linux内核已经帮我们实现了。驱动程序只需要调用该函数注册设备即可。

驱动的基本架构基本了解,后面继续分析业务逻辑的实现代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值