文档章节

linux uvc深入理解(二)

coreyggj
 coreyggj
发布于 2017/06/16 16:26
字数 487
阅读 233
收藏 0

整个uvc驱动,在内核中的路径是drivers/media/video/uvc
在kernel中配置uvc驱动,需要自己手动在make menuconfig中勾选如下路径:

Device Drivers ---> Multimedia support ---> Video For Linux
Device Drivers ---> Multimedia support ---> [*] Video capture adapters ---> [*] V4L USB devices ---> USB Video Class (UVC)


我们先用tree看戏uvc目录下的文件组成:

guanguojin@WX-ASIC-S02-Android:uvc$ tree
.
├── Kconfig
├── Makefile
├── uvc_ctrl.c
├── uvc_driver.c //uvc驱动的入口处
├── uvc_isight.c
├── uvc_queue.c
├── uvc_status.c
├── uvc_v4l2.c
├── uvc_video.c
└── uvcvideo.h

那我们就先从uvc_driver.c开始剖析整个uvc驱动的架构
首先我们找到驱动的加载入口module_init宏定义的函数:

static int __init uvc_init(void)
{
int result;

INIT_LIST_HEAD(&uvc_driver.devices);
INIT_LIST_HEAD(&uvc_driver.controls);
mutex_init(&uvc_driver.ctrl_mutex);

uvc_ctrl_init();

result = usb_register(&uvc_driver.driver);
if (result == 0)
printk(KERN_INFO DRIVER_DESC " (" DRIVER_VERSION ")\n");
return result;
}
module_init(uvc_init);

加载函数很简单,除了必要的初始化外,最重要的两步操作就是:uvc_ctrl_init和usb_register

uvc_ctrl_init


void uvc_ctrl_init(void)
{
struct uvc_control_info *ctrl = uvc_ctrls;
struct uvc_control_info *cend = ctrl + ARRAY_SIZE(uvc_ctrls);
struct uvc_control_mapping *mapping = uvc_ctrl_mappings;
struct uvc_control_mapping *mend =
mapping + ARRAY_SIZE(uvc_ctrl_mappings);

for (; ctrl < cend; ++ctrl)
uvc_ctrl_add_info(ctrl);

for (; mapping < mend; ++mapping)
uvc_ctrl_add_mapping(mapping);
}

这里面将uvc支持的GUID(即uvc支持的操作选项,包括亮度调节、灰度调节....)
struct uvc_control_info添加到uvc_driver的controls这个队列中去,其中主要关注这个结构体即可:

struct uvc_control_info {
struct list_head list;
struct list_head mappings;----->添加结构体成员类型struct uvc_control_mapping

__u8 entity[16];
__u8 index;
__u8 selector;

__u16 size;
__u32 flags;
};

usb_register:

 
这是注册uvc驱动的接口,就是将

struct uvc_driver uvc_driver = {
.driver = {
.name = "uvcvideo",
.probe = uvc_probe,
.disconnect = uvc_disconnect,
.suspend = uvc_suspend,
.resume = uvc_resume,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
.reset_resume = uvc_reset_resume,
#endif
.id_table = uvc_ids,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
.supports_autosuspend = 1,
#endif
},
};

这个结构体注册到usb驱动中,其中uvc_ids就是usb的过滤器,只有将支持uvc camera的VID和PID填入这个结构体,usb驱动才会在识别到camera后将其分发给uvc驱动,当然在uvc_ids中最后有这么个赋值:
/* Generic USB Video Class */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) },
也即只要usb描述符中说明是USB_CLASS_VIDEO的,都会交由uvc处理,不必单独将其VID和PID填入了。

 

© 著作权归作者所有

coreyggj
粉丝 1
博文 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
475
1
深入学习Linux Kernel/Driver?还是深入学习C++?

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

朱一心
2013/05/30
2.6K
10
给PHP扩展/C语言/网络编程初学者推荐的几本书

Linux/Unix系统 深入理解计算机系统 UNIX环境高级编程 深入理解Linux内核 网络通信编程 UNIX网络编程 TCP/IP详解 Linux多线程服务端编程 数据结构与算法 算法导论 《数据结构》(C语言版) ...

Surjur
2014/08/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

宜信开源|一个实例解析PaaS平台LAIN的9大杀手级功能

一、基于Docker的PaaS平台LAIN 在金融的场景下,LAIN 是为解放各个团队和业务线的生产力而设计的一个云平台。LAIN 正式上线已经大约两年,基本已经成熟,为宜信大数据创新中心各个团队提供了...

宜信技术学院
17分钟前
2
0
DBeaver调整编辑窗口字体大小

窗口-->首选项: 点击“编辑”之后,字体大小设为11的大小即比较合适。

BG2KNT
23分钟前
1
0
【Kubernetes社区之路】Slack沟通工具简介

什么是Slack Slack(https://slack.com) 是一款沟通工具,它与国内常见的微信、微博、QQ、钉钉有很大的不同,Slack主要用于工作讨论,可以让讨论更加高效。 Slack的口号便是让工作变得简单、...

恋恋美食
36分钟前
1
0
Visual Paradigm 教程[UML]:如何在SoaML中建模多方服务?

下载Visual Paradigm最新试用版 编写本教程是为了解释多方服务在SoaML方面的含义以及如何使用各种SoaML图表指定此类服务Visual Paradigm。 本教程中将使用的示例是通过在线银行账户纳税。您将...

xiaochuachua
37分钟前
0
0
SpringMVC 的Controller方法声明为private 或者 public 有什么区别

平常没有区别,都能正常处理请求。只有在使用AOP时会有问题: Controller方法声明为private时会出现获取到的注入service属性为null的问题,public方法才能正常获取注入的service。 原因如下:...

为了美好的明天
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部