上一篇文章中,已经介绍了v4l2_open、v4l2_read、v4l2_write的调用过程,相对于v4l2_ioctl,它们是比较简单的。下面来分析v4l2_ioctl。注意在这里还是分析以vivi.c为例,进行分析。

app:          ioctl

---------------------------------------------------------------------------

drv:           v4L2_fops.unlocked_ioctl

      .v4L2_ioctl

        vdev = video_devdata(filp);

        vdev->fops->unlocked_ioctl(filp, cmd, arg);//调用具体设备提供的unlocked_ioctl,因为本篇文章是以vivi.c为例进行分析,.unlocked_ioctl = video_ioctl2

          video_ioctl2

            video_usercopy(file, cmd, arg, __video_do_ioctl)

              __video_do_ioctl

video_ioctl2 

  long video_ioctl2(struct file *file,unsigned int cmd, unsigned long arg)
  {
    //根据命令cmd的不同,调用__video_do_ioctl,将数据拷贝到内核空间

    return video_usercopy(file, cmd, arg, __video_do_ioctl);
  }

__video_do_ioctl

  //以次设备号为下标,从video_device[]中取出对应的video_device,此处就是vivi_template

  struct video_device *vfd = video_devdata(file);

  //获取vivi_template的ioctl_ops

  const struct v4l2_ioctl_ops *ops = vfd->ioctl_ops;

  ---------- 

  switch (cmd) {

    /* --- capabilities ------------------------------------------ */

    case VIDIOC_QUERYCAP://cmd命令
    {
      //v4l2设备的能力结构体

      struct v4l2_capability *cap = (struct v4l2_capability *)arg;

      if (!ops->vidioc_querycap)
        break;

      cap->version = LINUX_VERSION_CODE;

      //根据不同的cmd,调用到了ioctl_ops中的vidioc_querycap
      ret = ops->vidioc_querycap(file, fh, cap);

      ----

      break

    }

现总结一下这个过程:

1、video_device被设置成了vivi_template  //在函数vivi_create_instance中被设置

2、vdev->cdev->ops = &v4l2_fops; //在函数__video_register_device中被设置

3、video_device[vdev->minor] = vdev;//在函数__video_register_device中被设置

当用户空间调用ioctl的时候,v4l2_fops的v4l2_ioctl将被调用;

在v4l2_ioctl中,vivi_template->fops->unlocked_ioctl(filp, cmd, arg) 即video_ioctl2函数会被调用;

在video_ioctl2中,__video_do_ioctl函数会被调用;

在__video_do_ioctl中,根据cmd来调用vivi_template中的vivi_ioctl_ops结构体中对应的函数。

              

初识v4l2(五)-------v4l2_ioctl浅析的更多相关文章

  1. (二) V4L2引入(含浅析UVC)

    title: V4L2引入(含浅析UVC) date: 2019/4/23 19:00:00 toc: true --- V4L2引入(含浅析UVC) 基本框架 V4L2全名是video for li ...

  2. 初识V4l2(二)-------浅析video_register_device

    在V4l2初识(一)中,我们已经知道当插上一个摄像头的时候,在uvc_driver.c中最终会调用函数video_register_device函数.接下来我们就简要分析这个函数做了哪些事情,揭开其神 ...

  3. 初识v4l2(四)-------v4l2_open、v4l2_read、v4l2_write浅析

    原文:https://blog.csdn.net/leesagacious/article/details/49995729 1.app:     open("/dev/video0&quo ...

  4. V4l2初识(七)-----------浅析app获取虚拟摄像头数据的过程

    继续分析数据的获取过程: 1.请求分配的缓冲区: ioctl(4,VIDIOC_REQBUFS) vidioc_reqbufs 2.查询和映射缓冲区   ioctl(4,VIDIOC_QUERYBUF ...

  5. 初识V4L2(三)-------分析vivi.c 虚拟视频驱动

    1.分配video_device结构体 2.设置 3.注册  video_register_device 分析vivi.c: vivi_init( )//入口函数 vivi_create_instan ...

  6. 初识V4L2(一)

    V4L2驱动框架概述 V4L2(video for linux two)是linux为视频设备提供的一套标准接口.它也属于字符设备驱动程序. 首先回顾普通字符设备驱动程序的写法: app :      ...

  7. 初识Haskell 五:自定义数据类型和类型类

    对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 自定义数据类型 data type de ...

  8. Python正则表达式初识(五)

    正则表达式的内容很丰富,今天小编继续给大家分享Python正则表达式的基础知识.今天要给大家的讲的特殊字符是竖线“|”.竖线“|”实质上是一个或的关系. 1.直接上代码演示,比方说我们需要匹配一个字符 ...

  9. pandas 初识(五)

    1. 如何实现把一个属性(列)拆分成多列,产生pivot,形成向量信息,计算相关性? 例: class_ timestamp count 0 10 2019-01-20 13:23:00 1 1 10 ...

随机推荐

  1. json.loads() json解码

    有些json数据里面套着json    一次json.loads()后还是会有数据是json格式 { "result": { "error_code": 0, ...

  2. GitHub 注册失败的原因 以及解决 。

    1.注册的时候老是卡在第一步: 提交用户名和密码 还有邮箱的时候 提交成功后. 不跳出 第二步.若现在去登录账号和密码,不管输对的还是输错的都是显示错误的.2.查看GitHub官网帮助后,不难发现问题 ...

  3. vue项目搭建介绍01

    目录 vue项目搭建介绍01 vue 项目框架环境搭建: 创建项目: vue 项目创建流程: vue项目搭建介绍01 vue 项目框架环境搭建: vue 项目框架: vue django(类似)(vu ...

  4. 物联网架构成长之路(32)-SpringBoot集成MQTT客户端

    一.前言 这里虽然是说MQTT客户端.其实对于服务器来说,这里的一个具有超级权限的MQTT客户端,就可以做很多事情.比如手机APP或者网页或者第三方服务需要发送数据到设备,但是这些又不是设备,又不能让 ...

  5. golang--单元测试综合实例

    实例说明: (1)一个Monster结构体,字段Name,Age,Skill (2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中: (3)Monster有一个R ...

  6. MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。

    MySQL如果频繁的修改一个表的数据,那么这么表会被锁死.造成假死现象. 比如用Navicat等连接工具操作,Navicat会直接未响应,只能强制关闭软件,但是重启后依然无效. 解决办法: 首先执行: ...

  7. Java-100天知识进阶-GC种类-知识铺(六)

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 一.GC回收器的 4个指标: 1.Throughput,非gc时间与总运行时间的比重. ...

  8. 《 .NET并发编程实战》扩展阅读 - 元胞自动机 - 1 - 为什么要学元胞自动机

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  9. linq 数据库已存在,直接添加数据

    using System.Data.Linq;using System.Data.Linq.Mapping; namespace ConsoleApplication1388{ class Progr ...

  10. Unable to connect to web server 'IIS Express'(无法连接到Web服务器“IIS Express”)的解决方式-Jexus Manager

    在运行微软示例工程eShopOnWeb时候, 在经过一段时间再运行启动报Error "Unable to connect to web server 'IIS Express'"  ...