title: 编写vivid

date: 2019/4/23 19:40:00

toc: true

编写vivid

新内核对video_buf的封装更好了,很多函数基本上套个名字就好了,这个可以参考

下面的分析是韦老师的2.x版本的,基本流程如下

1.注册平台设备和驱动;
2.probe()函数:
  a.分配video_device;
  b.设置video_device,包括:release、fops、ioctl_ops、v4l2_dev;
  c.注册设置video_device;
  d.其它:定义/初始化自旋锁/定时器;
3.填充操作函数v4l2_file_operations:
  a.open():初始buf化队列和设置定时器;
  b.close():删除定时器和释放buf队列;
  c.mmap():调用videobuf_mmap_mapper开辟虚拟内存;
  d.poll():调用videobuf_poll_stream实现poll机制非阻塞访问;
4.填充操作函数v4l2_ioctl_ops:
  前面介绍的11个必须ioctl,几乎都是调用内核提供的API;
5.填充操作函数videobuf_queue_ops:
  对buf进行一些操作;
6.填充数据:
  利用定时器,不断产生数据并唤醒进程,实现获取到图像采集数据;

细致流程如下

请求缓冲区 VIDIOC_QUERYBUF
v4l2_fops
v4l2_file_operations vivi_fops .unlocked_ioctl = video_ioctl2
__video_do_ioctl
ops->vidioc_querybuf(file, fh, p); //.vidioc_querybuf = vidioc_querybuf,
vidioc_querybuf
vb2_querybuf(&dev->vb_vidq, p)
查询缓冲区 VIDIOC_QUERYBUF
ops->vidioc_querybuf(file, fh, p)
vb2_querybuf(&dev->vb_vidq, p)
vb = q->bufs[b->index]
__fill_v4l2_buffer(vb, b) 填充 v4l2_buffer 获得缓冲区的格式大小等信息 vivi_mmap
v4l2_fops.v4l2_mmap > vdev->fops->mmap
vivi_mmap
vb2_mmap(&dev->vb_vidq, vma)
ret = call_memop(q, mmap, vb->planes[plane].mem_priv, vma);
// 搜索
#define call_memop(q, op, args...) \
(((q)->mem_ops->op) ? \
((q)->mem_ops->op(args)) : 0) q->ops = &vivi_video_qops;
q->mem_ops = &vb2_vmalloc_memops; 也就是调用 vb2_vmalloc_memops.mmap
vb2_vmalloc_mmap
remap_vmalloc_range 放入队列 VIDIOC_QBUF
ops->vidioc_qbuf
vb2_qbuf(&dev->vb_vidq, p)
call_qop(q, wait_prepare, q);
down_read(mmap_sem);
call_qop(q, wait_finish, q);
list_add_tail(&vb->queued_entry, &q->queued_list);
__enqueue_in_driver(vb); 这里执行驱动自身可能需要的入队列后的初始化
__fill_v4l2_buffer(vb, b); 启动摄像头 VIDIOC_STREAMON
vb2_streamon
start_streaming
q->streaming = 1; v4l2_poll
vdev->fops->poll
vivi_poll
搜索 wait
队列 DECLARE_WAITQUEUE(wait, current); timeout = msecs_to_jiffies(frames_to_ms(1));
vivi_thread_tick(dev);
vb2_buffer_done
wake_up(&q->done_wq); //唤醒
//创建了一个线程
static int vivi_thread(void *data)
{
vivi_sleep(dev); //具体30ms唤醒一次 #define frames_to_ms(frames) \
((frames * WAKE_NUMERATOR * 1000) / WAKE_DENOMINATOR)
#define WAKE_NUMERATOR 30 } VIDIOC_DQBUF 取出缓冲
ops->vidioc_dqbuf
vb2_dqbuf(&dev->vb_vidq, p, file->f_flags & O_NONBLOCK)
call_qop(q, buf_finish, vb)
list_del(&vb->queued_entry);
vb->state = VB2_BUF_STATE_DEQUEUED;

(六) 编写vivid的更多相关文章

  1. 简明python教程六----编写一个python脚本

    备份程序: #!/usr/bin/python #Filename:backup_ver1.py import os import time source = ['/home/liuxj/python ...

  2. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  3. jquery常用语句总结

    一.jquery中text val html attr的使用区别 html和innerHTMl是一样的,可以获得和设置指定元素如<p>中的html标签和文本如:设置值: $("p ...

  4. Delphi下DLL编程知识(转)

    一.  DLL和系统变量     在 System 单元声明的变量中,有几个对DLL编程有特殊影响.IsLibrary 可以检测代码是执行在应用程序中还是执行在DLL中,在应用程序中 IsLibrar ...

  5. Spring框架的第三天

    ## Spring框架的第三天 ## ---------- **课程回顾:Spring框架第二天** 1. IOC的注解方式 * @Value * @Resource(name="" ...

  6. spring配置和下载

    步骤一:下载 Spring 的开发包: 官网:http://spring.io/ 下 载 地 址 : http://repo.springsource.org/libs-release-local/o ...

  7. 6.1 如何在spring中自定义xml标签

    dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...

  8. 与python的第一次邂逅

    python简介 一.什么是python python是一种面向对象.直译式的计算机程序语言,所以有了武老师的那句名言:一切皆为对象 python的设计哲学是:“优雅”,“明确”,“简单” pytho ...

  9. gulp使用 实现文件修改实时刷新

    gulp例子:https://github.com/Aquarius1993/gulpDemo 淘宝镜像:$ npm install -g cnpm --registry=https://regist ...

随机推荐

  1. 大华门禁SDK二次开发(一)-技术沟通

    项目中需要能够查询门禁信号和控制门禁设备,因此需要基于大华门禁SDK进行二次开发,开发语言C#.门禁开发中遇到了一些问题,经过与大华技术的邮件沟通也一一解决.做这个开发的时候,发现网上的资料比较少,想 ...

  2. OpenCL——把vector变成scalar

    https://stackoverflow.com/questions/46556471/how-may-i-convert-cast-scalar-to-vector-and-vice-versa- ...

  3. python xlrd 读取excel.md

    文章链接:https://mp.weixin.qq.com/s/fojkVO-AB2cCu7FtDtPBjw 之前的文章介绍过关于写入excel表格的方法,近期自己在做一个网站,涉及到读取excel, ...

  4. 智能指针std::unique_ptr

    std::unique_ptr 1.特性 1) 任意时刻只能由一个unique_ptr指向某个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象) 2)禁止拷贝和赋值 ...

  5. 转:Git Submodule管理项目子模块

    使用场景 当项目越来越庞大之后,不可避免的要拆分成多个子模块,我们希望各个子模块有独立的版本管理,并且由专门的人去维护,这时候我们就要用到git的submodule功能. 常用命令 git clone ...

  6. d3js scales深入理解

    转自:https://www.cnblogs.com/kidsitcn/p/7182274.html 比例尺函数是这样的javascript函数: 接收通常是数字,日期,类别等data输入并且: 返回 ...

  7. vue build错误异常的解决方法

    在生成vue项目的时候,出现如下错误 ERROR in static/js/index.d66d806fcdd72b36147b.js from UglifyJs Unexpected token: ...

  8. Redis5.0.4复制

    redis的复制很简单,由于资源限制,本例中采用两台虚拟机,每台虚拟机安装两个redis实例,共四个来测试 一.安装redis https://www.cnblogs.com/qq931399960/ ...

  9. 工具(2): 极简MarkDown排版介绍(How to)

    如何切换编辑器 切换博客园编辑器为MarkDown:MarkDown Editor 选择一个在线编辑和预览站点:StackEdit 如何排版章节 MarkDown: 大标题 ========== 小标 ...

  10. Linux安装Kafka

    https://blog.csdn.net/qq_33257527/article/details/85227478 https://jingyan.baidu.com/article/36d6ed1 ...