博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux uvc深入理解(二)
阅读量:5880 次
发布时间:2019-06-19

本文共 2290 字,大约阅读时间需要 7 分钟。

hot3.png

整个uvc驱动,在内核中的路径是drivers/media/video/uvc

在kernel中配置uvc驱动,需要自己手动在make menuconfig中勾选如下路径:

Device Drivers ---> Multimedia support ---> Video For LinuxDevice 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填入了。

 

转载于:https://my.oschina.net/u/2007478/blog/968470

你可能感兴趣的文章
作为一个新手程序员该如何成长?
查看>>
《C语言编程魔法书:基于C11标准》——1.6 本章小结
查看>>
芬兰诺基亚欲投靠Android 但需等到2016年
查看>>
第十四天:规划质量管理,一致性成本、非一致性成本、质量七工具
查看>>
维基解密发布了 CIA 黑客攻击操作的代码
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——2.2 bash脚本编程
查看>>
Oracle存储过程迁移ODPS-00(专有云):Oracle - ODPS数据类型转换
查看>>
Ubuntu 发行版将停止支持 i386 架构
查看>>
《电路分析导论(原书第12版)》一第2章 电压和电流
查看>>
wine32和wine64共存编译安装方法
查看>>
《数字短片创作(修订版)》——数字短片原创理念的生成
查看>>
这个骨骼“有毒” 穿上它你就变成老人
查看>>
存储分层:企业数据存储类型选择与优化
查看>>
《Python参考手册(第4版•修订版)》——1.5 字符串
查看>>
2016:如何选择 Linux 发行版
查看>>
怎样在 Chromebook 上安装 Linux 系统?
查看>>
《循序渐进学Docker》——3.2 安装Windows和Ubuntu双系统
查看>>
《JavaScript开发框架权威指南》——1.7 创建Bower包
查看>>
《树莓派实战秘籍》——1.7 技巧07使用过压获得更高的性能
查看>>
我的 10 年自学编程之路
查看>>