上一篇文章中,已经介绍了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. 第十一周小组Scrum会议

    会议照片 本周会议内 回顾上一周的内容 总结上一轮的得失: 我们在第一轮中,并没有做出什么东西,为此我们痛定思痛,制定了计划,确定第二轮迭代的目标: 1. 实现小程序与后台代码的交互 2. 将检索书籍 ...

  2. MongoDB图形化工具(三)

    一.安装 下载地址:https://www.mongodbmanager.com/download 注意:在下载的时候需要对应上自己安装的mongodb版本. 双击安装 选择“Full install ...

  3. LG2921 [USACO2008DEC]Trick or Treat on the Farm 内向基环树

    问题描述 LG2921 题解 发现一共有 \(n\) 个点,每个点只有一条出边,即只有 \(n\) 条边,于是就是一个内向基环树. \(\mathrm{Tarjan}\) 缩点. 但是这个题比较猥琐的 ...

  4. Linux应试技巧

    前言:此文是为了CSP-S第二轮认证所用系统NOI-Linux的写的,但其他的Linux系统也可以按照相同或类似的方法进行配置. 配置NOI-Linux 我大约是一个月以前由于比赛的原因才开始接触NO ...

  5. [NewLife.XCode]导入导出(实体对象百变魔君)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  6. Windows环境Tomcat开启APR并配置http/2.0访问

    1.http/2.0需要开启https 参考:https://www.cnblogs.com/zhi-leaf/p/11978615.html 2.下载tcnative-1.dll文件 官网下载地址: ...

  7. 造轮子ArrayList

    这篇博客实现一个简单的ArrayList集合.博客里的代码首先根据自己的想法实现,在走不动的情况下会去参考JDK源代码.所以阅读本文,不要抱着跟JDK源码对比的心态.于我个人而言,国庆期间,纯属娱乐. ...

  8. 利用Python爬虫刷店铺微博等访问量最简单有效教程

    一.安装必要插件 测试环境:Windows 10 + Python 3.7.0 (1)安装Selenium pip install selenium (2)安装Requests pip install ...

  9. WPF 有任何Focus问题,就找 Keyboard_Navigation

    牛牛的博客 https://www.cnblogs.com/smallidea/p/3412699.html 参照官网教程: https://docs.microsoft.com/en-us/dotn ...

  10. .net Dapper 学习系列(1) ---Dapper入门

    目录 写在前面 为什么选择Dapper 在项目中安装Dapper 在项目中使用Dapper 在项目中使用Dapper 进行单表增删改数据操作 总结 写在前面 Dapper 是一款轻量级ORM架构.为解 ...