usb驱动之打印usb设备信息(二)

摘要:
以下是用于打印鼠标左键和右键以及其他输入的源代码。有关详细信息,请参阅https://www.cnblogs.com/zhu-g5may/p/9309381.html1/*请参阅/drivers/hid/usbhid/usbhouse。c*/23#包括<linux/内核。h>4#包括<linux/sslab。h>5#包括<linux/module.h&g

以下是打印鼠标左右键及其他输入的源代码,详细说明见https://www.cnblogs.com/zhu-g5may/p/9309381.html

 1 /*参考/drivers/hid/usbhid/usbmouse.c*/
 2 
 3 #include <linux/kernel.h>
 4 #include <linux/slab.h>
 5 #include <linux/module.h>
 6 #include <linux/init.h>
 7 #include <linux/usb/input.h>
 8 #include <linux/hid.h>
 9 
10 static struct urb *mouse_urb;
11 static int len;
12 static char *buf;
13 static dma_addr_t mouse_dma;
14 
15 static const struct usb_device_id mouse_table[] = {
16     { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
17         USB_INTERFACE_PROTOCOL_MOUSE) },        /* mouse */
18     { }/* Terminating entry */
19 };
20 
21 MODULE_DEVICE_TABLE (usb, mouse_table);
22 
23 static void usb_mouse_irq(struct urb *urb)
24 {
25      static int cnt = 0;
26      int i;
27      printk("data %d : 
",++cnt);
28      for(i = 0; i < len; i++){
29         printk("0x%02x
",buf[i]);
30      }
31      usb_submit_urb(mouse_urb, GFP_KERNEL);
32 }
33 
34 static int mouse_probe(struct usb_interface *intf,
35              const struct usb_device_id *id)
36 {
37       int pipe;
38       struct usb_device *mdev = interface_to_usbdev(intf);  //设备
39       struct usb_endpoint_descriptor *endpoint;
40       struct usb_host_interface *interface;
41       
42       interface = intf->cur_altsetting;  //接口
43       if (interface->desc.bNumEndpoints != 1)
44         return -ENODEV;
45       
46       endpoint = &interface->endpoint[0].desc;  //端点
47       if (!usb_endpoint_is_int_in(endpoint))
48         return -ENODEV;
49       
50       len = endpoint->wMaxPacketSize;    //长度(多少字节)
51 
52       buf = usb_alloc_coherent(mdev, len, GFP_ATOMIC, &mouse_dma); //传输buffer,目的
53 54 pipe=usb_rcvintpipe(mdev,endpoint->bEndpointAddress); // 55 56 mouse_urb = usb_alloc_urb(0, GFP_KERNEL); 57 58 usb_fill_int_urb(mouse_urb,mdev,pipe,buf,len,usb_mouse_irq, NULL, endpoint->bInterval); //初始化中断型urb结构体 59 mouse_urb->transfer_dma = mouse_dma; 60 mouse_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 61 62 usb_submit_urb(mouse_urb, GFP_KERNEL); 63 64 return 0; 65 } 66 67 static void mouse_disconnect(struct usb_interface *intf) 68 { 69 struct usb_device *mdev = interface_to_usbdev(intf); //设备 70 usb_kill_urb(mouse_urb); 71 usb_free_urb(mouse_urb); 72 usb_free_coherent(mdev, len, buf, mouse_dma); 73 } 74 75 static struct usb_driver usb_driver = { 76 .name = "mouse", 77 .probe = mouse_probe, 78 .disconnect = mouse_disconnect, 79 .id_table = mouse_table, 80 }; 81 82 static int usb_drv_init(void) 83 { 84 usb_register(&usb_driver); 85 return 0; 86 } 87 88 static void usb_drv_exit(void) 89 { 90 usb_deregister(&usb_driver); 91 } 92 93 module_init(usb_drv_init); 94 module_exit(usb_drv_exit); 95 //module_usb_driver(usb_driver); 96 97 MODULE_LICENSE("GPL"); 98 MODULE_AUTHOR("1653699780@qq.com");

免责声明:文章转载自《usb驱动之打印usb设备信息(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决SVN 被锁且Cleanup无效问题常用OID(SNMP)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux3.0.4编译LDD中的scull全过程

按照惯例,我是应该先写一些本章的收获的,不过太晚了。 在看完第三章之后开始编译,错误一堆,几乎崩溃,幸亏经过不断的百度,总算解决了问题,我发现 我遇到问题比较多,算是集中七个龙珠了吧,感谢先行的大神们。 1. CFLAGS was changed in "examples/scull/Makefile". Fix it to use EXTRA_CFLAG...

Linux路径名和文件名最大长度限制

UNIX标准对路径名和文件名最大长度限制做出了说明,但其上限值在实际应用长过小,Linux在具体实现时提升了该上限,该限制在Linux的 /usr/include/linux/limits.h 中做出了说明,具体如下: 1 #ifndef _LINUX_LIMITS_H 2 #define _LINUX_LIMITS_H 3 4 #define...

用组策略彻底禁止USB存储设备、光驱、软驱、ZIP软驱

转自:http://beyondhdf.blog.51cto.com/229452/131678 一、禁止USB存储设备、光驱、软驱、ZIP软驱 在现在企业网络环境下,由于企业网络越来越大环境越来越复杂。公司内员工素质参差不齐,公司为了加强网络安全性、数据保密性提出要封堵USB存储设备、光驱、软驱、ZIP软驱设备。首先我们在企业网络环境要想实现以上目的,必...

assert()函数用法总结

assert()函数用法总结assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h>void assert( int expression );   assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向s...

codeforces 765 F Souvenirs 线段树+set

题意:多次询问区间内 两数差的绝对值的最小值 题解:离线询问则可以按照询问的l排序,倒着询问,倒着从r更新到l 每次更新i+1到n这个区间,保证这次的更新不会影响到下一次以及以后的更新。因为当两个区间出现覆盖时,l更小的那个区间的值一定小于等于另一个,画个图就可以明白。 #include <iostream> #include <cstd...

centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′

原文连接: http://blog.csdn.net/jaket5219999/article/details/53512071 系统red hat6.7 也即centos6.7 python3.5.2 安装 django 之后 创建project 以及 import sqlite3 都出现  No module named ‘_sqlite3′  >...