文档章节

linux uvc深入理解(三)

coreyggj
 coreyggj
发布于 2017/06/16 16:31
字数 453
阅读 207
收藏 0

上一篇讲到usb_register将uvc_driver.driver注册进去,今天我们来梳理下uvc_driver.driver中最重要的函数probe(即uvc_probe)。
uvc_probe会传入2组参数,分别是struct usb_interface *intf和const struct usb_device_id *id。
通过intf我们可以获取usb最重要的结构体struct usb_device,通过id我们可以得到挂载uvc驱动的usb设备的PID和VID。
在uvc_probe中主要是构建了struct uvc_device

struct uvc_device {
struct usb_device *udev;
struct usb_interface *intf;
unsigned long warnings;
__u32 quirks;
int intfnum;
char name[32];

enum uvc_device_state state;
struct list_head list;
atomic_t users;

/* Video control interface */
__u16 uvc_version;
__u32 clock_frequency;

struct list_head entities;
struct list_head chains;

/* Video Streaming interfaces */
struct list_head streams;
atomic_t nstreams;

/* Status Interrupt Endpoint */
struct usb_host_endpoint *int_ep;
struct urb *int_urb;
__u8 *status;
struct input_dev *input;
char input_phys[64];
};

下面我们介绍下几个在probe函数中比较重要的函数

uvc_parse_control

主要作用是解析uvc设备的usb描述符

uvc_ctrl_init_device

将之前uvc_drive中controls队列中的uvc控制参数添加到struct uvc_device的entities队列里,最后

list_add_tail(&dev->list, &uvc_driver.devices);

将uvc_device挂接到uvc_drive中,实现设备和驱动的挂载过程

uvc_scan_device&uvc_register_terms

将video设备注册到uvc链中,最后通过uvc_register_video将所有video设备都注册成支持v4l2接口的uvc设备
让我们看下v4l2的ops结构体内容

const struct v4l2_file_operations uvc_fops = {
.owner = THIS_MODULE,
.open = uvc_v4l2_open,
.release = uvc_v4l2_release,
.ioctl = uvc_v4l2_ioctl,
.read = uvc_v4l2_read,
.mmap = uvc_v4l2_mmap,
.poll = uvc_v4l2_poll,
};

通过这种方式我们的uvc设备就能提供给上层v4l2的接口了

uvc_status_init

如果你的uvc设备还支持input的话,就需要单独为它注册input device节点(input_register_device),除此之外该函数还初始化中了中断urb,当你进行中断传输完成时会待用uvc_status_complete返回urb的提交状态,我们一般看到Non-zero status (-71) in status completion handler这种错误就是在这个函数返回的。

 

© 著作权归作者所有

coreyggj
粉丝 2
博文 42
码字总数 19193
作品 0
无锡
程序员
私信 提问
ROS进阶学习的过程

环境的安装与配置 这里有第一次按照书上的方法进行安装的步骤,也有后面学习中遇到的问题,需要对ROS进行重新安装配置的过程。 ROS使用教程-关于安装 初次在ubuntu14上安装ros-indigo的过程,...

CSDNhuaong
2017/11/04
0
0
linux内核中的webcam模块该如何使用?

我在im.x51硬件平台上想实现USB摄像头功能,网上看到实现uvc协议的usb摄像头,pc机上无需装驱动,我看到内核linux-2.6.35.3中的webcam模块实现了UVC协议,于是就想直接用该模块。但使用过程中...

大葱
2012/12/12
1K
0
嵌入式linux内核中的webcam模块能不能使用?

我在im.x51硬件平台上想实现USB摄像头功能,网上看到实现uvc协议的usb摄像头,pc机上无需装驱动,我看到内核linux-2.6.35.3中的webcam模块实现了UVC协议,于是就想直接用该模块。但使用过程中...

大葱
2012/12/11
507
1
深入学习Linux Kernel/Driver?还是深入学习C++?

最近很纠结一个问题:我有两本书《深入理解Linux内核》、《C++ Primer》;先深入的研究那一本??? 因为踏入软件行业也一年多了!大部分时间都是在学习、调试驱动、研究Linux kernel源码、A...

朱一心
2013/05/30
2.6K
10
通用的C基础库 - Gear Lib

Gear Lib是一组通用的C基础库 全部用POSIX C实现,目标是为了跨平台兼容x86, arm, android, ios. 每个库都是一个独立工程,使用时,只需要把真正用到的库加入你的项目中即可,无需导入整个工...

gozfree
06/18
999
0

没有更多内容

加载失败,请刷新页面

加载更多

手持式人证核验设备助力国家安全系统

手持式人证核验设备,是针对公共安全领域的移动化身份核验、追逃等需求推出的手持式一体化设备。其特点是具备人员信息采集、存储和比对功能,将采集到的人脸信息与居民身份证芯片中的人脸信息...

非思丸智能FaceTo
4分钟前
1
0
好程序员web前端教程分享JavaScript简写方法

今天好程序员web前端教程为大家分享JavaScript简写方法,小伙伴们快来看一看吧。 1.三元操作符 当想写if...else语句时,使用三元操作符来代替。 constx =20; let answer; if(x >10) { answer...

好程序员官网
7分钟前
2
0
PHP面试题2019年小米工程师面试题和答案解析

一、单选题(共29题,每题5分) 1.PHP面向对象方法重写描述错误的是? A、子类必须继承父类 B、子类可以重写父类已有方法 C、重写之后子类会调用父类方法 D、子类也可以具有与父类同名的属性...

一个PHP程序媛
11分钟前
2
0
K8s 从懵圈到熟练 – 镜像拉取这件小事

导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的。而镜像拉取失败,大多数情况下都和权限有关。所以,在处理相关问题的时候,我们往往会轻松的说:这问题很简单...

Mr_zebra
11分钟前
1
0
分布式锁简单入门以及实现方法

学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源的一种线程同步机制。 在学习或者使用Java的过程中进程会遇到各种各样的锁的...

yanlijun_java
14分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部