USB摄像头驱动之分析描述符

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第 1 章 描述符初步试验
1.1 USB 摄像头驱动初步代码 #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h> #include <linux/usb.h> #include <linux/videodev2.h> #include <linux/vmalloc.h> #include <linux/wait.h> #include <asm/atomic.h> #include <asm/unaligned.h> #include <media/v4l2-common.h> static int myuvc_probe(struct usb_interface *intf,const struct usb_device_id *id) { static int cnt = 0; printk("myuvc_probe : cnt = %d\n", cnt++); return 0; } static void myuvc_disconnect(struct usb_interface *intf) { static int cnt = 0; printk("myuvc_disconnect : cnt = %d\n", cnt++); } static struct usb_device_id myuvc_ids[] = { /* Generic USB Video Class */ { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, 0) }, /* VideoControl Interface */ { USB_INTERFACE_INFO(USB_CLASS_VIDEO, 2, 0) }, Interface */ /* VideoStreaming
for (i = 0 ; i < config->bNumInterfaces ; i++) dump_interface(dev, &config->interface[i]); //3、打印接口描述符 for (i = 0; i < interface->num_altsetting; i++) dump_altsetting(dev, &interface->altsetting[i]); //4、打印设置描述符 一个配置描述符下可能有多个接口描述符, 一个接口描述符下面可能有多个设置描述符
前言
把任意一个 USB 设备接到 windows 上,都会弹框表示“发现了 xxx 设备”,windows 是 如何知道的呢?推测肯定是 USB 设备硬件包含了一些信息,这些信息表明了自己的身份。 这些信息的术语称之为描述符。描述符就是一些格式化的数据,操作系统 windows、linux 可以去访问这些格式化的数据,就可知道设备的信息。
USB 摄像头驱动之分析描述符
USB 摄像头驱动之分析描述符 .............................................................................................. 1 前言................................................................................................................................... 2 第 1 章 描述符初步试验 ................................................................................................. 2 1.1 USB 摄像头驱动初步代码 ............................................................................ 2 1.2 编译加载驱动 .................................................................................................... 3 第 2 章 分析 lsusb 源码................................................................................................... 4 2.1 lsusb.c.................................................................................................................. 4
第 2 章 分析 lsusb 源码
打开韦东山提供的 libusb-1.0.16-rc10 和 usbutils-006 源码,建立 sourceinsight 工程。 2.1 lsusb.c Main.c dumpdev dump_device dump_config
//1、打印设备描述符 //2、打印配置描述符
Leabharlann Baidu
myuvc_disconnect : cnt = 1 同样,disconnect 执行了两次。 4、重新插上 usb 摄像头,执行“lsusb –v –d 046d:”,可看到一大堆描述符,下面图只是 局部。
可以仿照 lsusb 的功能,把 usb 描述符分析一遍,最好的方法就是找到 lsusb 的源码。
{} }; /* 1. 分配 usb_driver */ /* 2. 设置 */ static struct usb_driver myuvc_driver = { .name = "myuvc", .probe = myuvc_probe, .disconnect = myuvc_disconnect, .id_table = myuvc_ids, }; static int myuvc_init(void) { /* 3. 注册 */ usb_register(&myuvc_driver); return 0; } static void myuvc_exit(void) { usb_deregister(&myuvc_driver); } module_init(myuvc_init); module_exit(myuvc_exit); MODULE_LICENSE("GPL"); 1.2 编译加载驱动 1、插上 usb 摄像头,先删除系统原来的 uvcvideo 驱动,执行“sudo rmmod uvcvideo”, 然后加载上面源代码编译生成的 myuvc.ko,执行“sudo insmod uvcvideo.ko”。执行”dmesg” 命令,打印如下: usbcore:deregistering interface driver uvcvideo myuvc_probe : cnt = 0 myuvc_probe : cnt = 1 usbcore:registered new interface driver myuvc 会发现 probe 被调用了两次,调用两次的原因是因为 myuvc_ids 里面含有 VideoControl Interface 和 VideoStreaming Interface。 2、执行“lsusb”,会发现摄像头设备,dmesg 打印如下: Bus 001 Device 004:ID 046d:0825 Logitech, Inc. 3、拔掉 usb 摄像头,执行”dmesg”命令: usb 1-1:USB disconnect, address 3 myuvc_disconnect : cnt = 0
相关文档
最新文档