这段时间开始搞安卓camera底层驱动了,把以前的的Linux视频驱动回顾一下,本篇主要概述一下vfl2(video for linux 2).

一. V4L2框架: video for linux version 2

虚拟视频驱动vivi.c分析:

1.分配video_device

2.设置

3.注册:video_register_device

vivi_init

vivi_create_instance

v4l2_device_register   // 不是主要, 只是用于初始化一些东西,比如自旋锁、引用计数

video_device_alloc

// 设置

1. vfd:

.fops           = &vivi_fops,

.ioctl_ops  = &vivi_ioctl_ops,

.release = video_device_release,

2.

vfd->v4l2_dev = &dev->v4l2_dev;

3. 设置"ctrl属性"(用于APP的ioctl):

v4l2_ctrl_handler_init(hdl, 11);

dev->volume = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,

V4L2_CID_AUDIO_VOLUME, 0, 255, 1, 200);

dev->brightness = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,

V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);

dev->contrast = v4l2_ctrl_new_std(hdl, &vivi_ctrl_ops,

V4L2_CID_CONTRAST, 0, 255, 1, 16);

video_register_device(video_device, type:VFL_TYPE_GRABBER, nr)

__video_register_device

vdev->cdev = cdev_alloc();

vdev->cdev->ops = &v4l2_fops;

cdev_add

video_device[vdev->minor] = vdev;

if (vdev->ctrl_handler == NULL)

vdev->ctrl_handler = vdev->v4l2_dev->ctrl_handler;

分析vivi.c的open,read,write,ioctl过程

1. open

app:     open("/dev/video0",....)

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

drv:     v4l2_fops.v4l2_open

vdev = video_devdata(filp);  // 根据次设备号从数组中得到video_device

ret = vdev->fops->open(filp);

vivi_ioctl_ops.open

v4l2_fh_open

2. read

app:    read ....

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

drv:    v4l2_fops.v4l2_read

struct video_device *vdev = video_devdata(filp);

ret = vdev->fops->read(filp, buf, sz, off);

3. ioctl

app:   ioctl

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

drv:   v4l2_fops.unlocked_ioctl

v4l2_ioctl

struct video_device *vdev = video_devdata(filp);

ret = vdev->fops->unlocked_ioctl(filp, cmd, arg);

video_ioctl2

video_usercopy(file, cmd, arg, __video_do_ioctl);

__video_do_ioctl

struct video_device *vfd = video_devdata(file);

根据APP传入的cmd来获得、设置"某些属性"v4l2_ctrl_handler的使用过程:

__video_do_ioctl

struct video_device *vfd = video_devdata(file);     case VIDIOC_QUERYCTRL:

{

struct v4l2_queryctrl *p = arg;

if (vfh && vfh->ctrl_handler)

ret = v4l2_queryctrl(vfh->ctrl_handler, p);

else if (vfd->ctrl_handler)  // 在哪设置?在video_register_device

ret = v4l2_queryctrl(vfd->ctrl_handler, p);

// 根据ID在ctrl_handler里找到v4l2_ctrl,返回它的值...}

[18721.327983] usb 2-1: USB disconnect, address 4

[18724.929301] usb 2-1: new full speed USB device using uhci_hcd and address 5

[18725.196200] usb 2-1: configuration #1 chosen from 1 choice

[18725.204999] uvcvideo: Found UVC 1.00 device (1b3b:2977)

[18725.222065] input: UVC Camera (1b3b:2977) as /devices/pci0000:00/0000:00:07.2/usb2/2-1/2-1:1.0/input/input7

[25252.578719] usb 2-1: USB disconnect, address 5

由以上usb摄像头插入的dmesg打印信息,搜索UVC关键字得到相关代码:uvc.driver.c ->uvc_driver结构体->video_register_device方法。

二、如何写v4l2驱动:

①构造、设置、注册: v4l2_device : v4l2_device_register, v4l2_device

②分配:video_device, video_device_alloc

③设置: a. vfd->v4l2_dev

b. vfd: .fops = ***.open/read/write

.ioctl_ops

c.APP通过ioctl来设置,获得亮度 等信息。

驱动程序: v4l2_ctrl : 属性。

v4l2_ctrl_handler : 管理 ===>(1)初始化:v4l2_ctrl_handler_init

(2)设置:v4l2_ctrl_new_std , v4l2_ctrl_new_custom ,设置创建v4l2_ctrl并加入链表。

(3)跟vdev关联: v4l2_dev.ctrl_handler = hdl

video_dev -> v4l2_dev.

具体驱动代码的编写将在下篇继续....

Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动样例)

在Linux,网络分为两个层,各自是网络堆栈协议支持层,以及接收和发送网络协议的设备驱动程序层. 网络堆栈是硬件中独立出来的部分.主要用来支持TCP/IP等多种协议,网络设备驱动层是连接网络堆栈协议层 ...

Linux摄像头驱动学习之:(六)UVC-基本框架代码分析

仿照内核的自带UVC(usb video class)驱动程序写的一版简化驱动,仅供学习,实际项目开发中应该尽量使用内核自带的驱动,除非内核自带的驱动不支持此款硬件才需要自己写驱动. 下面就直接上代码 ...

Linux摄像头驱动学习之:(四)UVC-摄像头驱动框架分析

UVC: USB Video ClassUVC驱动:drivers\media\video\uvc\ uvc_driver.c分析:1. usb_register(&uvc_driver.dr ...

Linux摄像头驱动学习之:(五)UVC-分析设备描述符

linux系统上插上USB摄像头设备后,内存就会有相应的设备描述符信息,后期可以根据这些信息进一步写驱动程序. 流程:Device(设备) -> Configuration(配置) -> ...

Linux摄像头驱动学习之:(三)从零写虚拟驱动(仿照vivi.c)

本篇仿照vivi.c 写虚拟视频驱动,代码(myvivi.c+fillbuf.c+Makefile)如下: //==========================myvivi.c========== ...

Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动

一.通过指令 "strace -o xawtv.log xawtv" 得到以下调用信息:// 1~7都是在v4l2_open里调用1. open2. ioctl(4, VIDIOC ...

Linux内核驱动学习(八)GPIO驱动模拟输出PWM

文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

Linux内核驱动学习(十)Input子系统详解

文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...

Linux内核驱动学习(三)字符型设备驱动之初体验

Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...

随机推荐

【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

android 画虚线、实线,画圆角矩形,一半圆角

1.画虚线,实线: 建立dotted_line_gray.xml文件放在drawable文件夹下面. android:shape="line" 可以修改你想要的形状 <?xm ...

tomcat 日志 按天自动分割 设定时任务定时清除

一.日志分割所需jar包 1.下载tomcat   apache-tomcat-7.0.79.tar.gz 地址:http://www.apache.org/dist/tomcat/tomcat-7/ ...

Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)

Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解.监控和控制容器.千言万语不及一张图,先感受一下. 下面开始实践 Weave Scope. 安装 执行如 ...

mongodb将时间作为条件查询

db.stock_signal_single.find({"createtime": { "$lt" : ISODate("2019-04-08T00 ...

Luogu P2057 &lbrack;SHOI2007&rsqb;善意的投票

题目链接 \(Click\) \(Here\) 考虑模型转换.变成文理分科二选一带收益模型,就一波带走了. 如果没有见过这个模型的话,这里讲的很详细. #include

Hibernate根据实体类自动创建表

Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码

ajax 传递中文字符参数 问题

使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码,  到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...

linux常用命令和关闭防火墙

linux常用命令和关闭防火墙   2.        linux常用命令 Mkdir 创建 Rm -rf 删除 Chmod -R 777 权限 Mysql -uroot -r quit退出 find ...

Oracle性能优化4-索引

Oracle优化可以分为通过改写sql优化和不改写sql优化不改写sql优化一般通过index来实现 在Oracle数据库中,索引按照索引机制的不同,可以分为三种. 1. B-Tree索引 B-Tre ...

linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析相关推荐

  1. Linux文件关联详解 linux 修改默认文件关联打开程序

    linux 修改默认文件关联打开程序 从总体上讲 /etc/gnome/defaults.list 保存了全局的打开方式 /.local/share/applications/mimeapps.lis ...

  2. linux who命令详解,Linux who命令详解

    Linux who命令详解教程 Linux who命令详解 功能 显示系统中哪些使用者. 语法 who [options] 参数 参数 描述 options who 命令使用的参数. who命令常用参 ...

  3. 清理linux服务器缓存,详解Linux手动释放缓存的方法

    详解Linux手动释放缓存的方法 发布时间:2020-08-20 07:53:27 来源:脚本之家 阅读:87 作者:闪电王国 栏目:服务器 Linux释放内存的命令: sync echo 1 > ...

  4. linux命令 正则表达式,详解Linux命令中的正则表达式

    详解Linux命令中的正则表达式 Mark Do 2017年9月19日 暂无评论 阅读 981 次 命令中的正则表达式 如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式.正则表达式 ...

  5. linux sed.写文件,Linux文件处理sed命令-linux sed命令详解-linux sed写入文件-嗨客网

    Linux文件处理sed命令详解教程 Linux sed命令使用 Linux sed 命令处理时,把当前处理的行存储在临时缓冲区中,称为 "模式空间"( oattern space ...

  6. linux的退出tail命令,Linux显示文件最后几行-Linux tail命令详解-Linux tail命令退出-嗨客网...

    Linux显示文件最后几行(tail) Linux显示文件最后几行(tail)教程 Linux tail命令详解 功能 查看文件的最后几行. 语法 tail [options] file.. 参数 参 ...

  7. linux管道命令详解,Linux系统中的管道命令的用法详解

    Linux系统中管道命令是linux系统的一个强大之处.下面由学习啦小编为大家整理了Linux系统中的管道命令的用法详解的相关知识,希望对大家有帮助! Linux系统中的管道命令的用法详解 管道命令操 ...

  8. linux 日志监控工具,详解 Linux系统常用监控工具

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? top 命令有点类似于 Windows下的任务管理器,能够实时动态地监控并显示系统中各个进程的资源占用状况,是 Linu ...

  9. linux eval命令详解,linux命令详解——eval

    shell中的eval 功能说明:从新运算求出参数的内容. 语 法:eval [参数] 补充说明:eval可读取一连串的参数,而后再依参数自己的特性来执行. 参 数:参数不限数目,彼此之间用分号分开. ...

最新文章

  1. 特征选择、特征选择方法
  2. poj3934Queue(dp)
  3. ArcGIS JS API 4.10跨域问题(本地切片无法加载)解决办法
  4. Selenium with Python 001 - 安装篇
  5. Source Insight上手教程
  6. 重建控制文件--Rebuild controlfile
  7. oracle call 存储过程 带out_详解oracle数据库存储过程调试方法
  8. 【资源】图深度学习文献列表
  9. ajax是异步非阻塞,[转帖]再谈IO的异步,同步,阻塞和非阻塞
  10. 小谷机器人连不上wifi_小谷连不上网怎么办
  11. 知识图谱学习(二):电商知识图谱
  12. VSSDK 系列 - 创建 灯泡提示 ,替换 单词
  13. 《认文识字•简述》【小结】
  14. 第四章 语料库与语言知识库
  15. 全景拼接python旗舰版
  16. 什么是UART中的FIFO ?
  17. Java百度鹰眼轨迹批量上传
  18. android 监听短信并获取验证码
  19. 张正友相机标定(全流程,含畸变,matlab源代码解析)
  20. 测试员与程序员如何相处

热门文章

  1. 08.音频系统:第003课_Linux音频驱动程序:第001节_alsa音频驱动框架
  2. 《大数据时代》 概要
  3. 云游戏的2022:破局、新生、元宇宙
  4. eyoucms如何判断第一条和最后一条数据
  5. 某金融机构身份国产化LDAP创新实践——国产自主可控 LDAP目录服务建设经验分享
  6. checkra1n越狱错误79_新的unc0ver漏洞可让运行iOS / iPadOS 12至13.5的苹果iPhone和iPad越狱...
  7. 恶意代码分析实战-通过IDA对恶意代码进行静态分析(Lab05-01.dll)
  8. 2021年小米日常实习一面(自己整理的答案)
  9. 商城后台管理系统学习日志-01
  10. python3自动爬取网页资源并保存为epub电子书