201504010 IMX257 USB鼠标驱动程序编写
2015-04-10 Lover雪儿
USB驱动程序包括为USB总线驱动程序以及USB设备驱动程序.
USB总线驱动程序的功能是:
1.识别
2.找到匹配的设备驱动程序
3.提供USB读写函数(不知道数据的含义)
USB设备驱动程序功能是: 分析USB的数据,上报相应的事件
今天,我们来实现一个USB鼠标的设备驱动程序,让鼠标的左键模拟为键盘的L键,鼠标的右键模拟为键盘的S键,鼠标的中键模拟为键盘的ENTER键,接下来我们先来实现一个简单程序,让操作系统找到USB鼠标.
一.简单的USB鼠标设备驱动程序
1.分配/注册一个USB结构体usb_driver
如图所示,定义一个usb_driver结构体,里面分别有三个函数:
usb_mouse_key_probe usb鼠标探测函数
usb_mouse_key_disconnect usb鼠标移出函数
usb_mouse_key_id_table 里面包含了usb鼠标的协议等信息
接下来分别实现上面的三个函数:
如图所示:我们现在先不做什么复杂的操作,知识简单的让它打印信息.
2.注册一个USB结构体usb_driver
3.调试:
make menuconfig去除自带的鼠标驱动程序:
1. make menuconfig 去掉原来鼠标的驱动程序
--> Device Drivers
--> HID Device
<>USB Human Interface Device(full HID) support
2. make uImage 使用新的内核启动
3. insmod usb_mouse_key.ko
4. 在开发板上接入和拔除USB设备
插入鼠标:打印出found usbmouse!
拔出鼠标:打印出disconnect usbmouse!
附上驱动程序1如下:
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 usb_device_id usb_mouse_key_id_table [] = { 11 { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID /*usb接口描述符的类为HID*/ 12 , USB_INTERFACE_SUBCLASS_BOOT, /*子类为BOOT*/ 13 USB_INTERFACE_PROTOCOL_MOUSE) }, /*协议为MOUSE*/ 14 /*{USB_DEVICE(vend,prod)} //若要自定义驱动支持某一款usb,在此处填充 */ 15 { } /* Terminating entry */ 16 }; 17 18 static int usb_mouse_key_probe(struct usb_interface *intf, const struct usb_device_id *id) 19 { 20 printk("<0>found usbmouse !\n"); 21 22 return 0; 23 } 24 25 static void usb_mouse_key_disconnect(struct usb_interface *intf) 26 { 27 printk("<0>disconnect usbmouse !\n"); 28 } 29 30 31 //1. 分配/设置/注册一个USB结构体usb_driver 32 static struct usb_driver usb_mouse_key_driver = { 33 .name = "usb_mouse_key", 34 .probe = usb_mouse_key_probe, 35 .disconnect = usb_mouse_key_disconnect, 36 .id_table = usb_mouse_key_id_table, 37 }; 38 39 static int usb_mouse_key_init(void){ 40 41 42 /*2.注册USB结构体*/ 43 usb_register(&usb_mouse_key_driver); 44 45 return 0; 46 } 47 48 static void usb_mouse_key_exit(void){ 49 50 //卸载USB结构体 51 usb_deregister(&usb_mouse_key_driver); 52 } 53 54 module_init(usb_mouse_key_init); 55 module_exit(usb_mouse_key_exit); 56 57 MODULE_LICENSE("GPL"); 58 59 60 /* 61 测试: 62 1. make menuconfig 去掉原来鼠标的驱动程序 63 --> Device Drivers 64 --> HID Device 65 <>USB Human Interface Device(full HID) support 66 2. make uImage 使用新的内核启动 67 3. insmod usb_mouse_key.ko 68 4. 在开发板上接入和拔除USB设备 69 70 */