本文共 2591 字,大约阅读时间需要 8 分钟。
1.1分配/设置USB_driver结构体
.id_table .probe .disconnect 1.2.注册*参考:\itop4412_kernel_3.0\drivers\hid\usbhid\Usbmouse.c*/#include#include #include #include #include #include static int len;static char *usb_buf;static struct urb *uk_urb; static dma_addr_t usb_buf_phys;struct input_dev *uk_dev;static struct usb_device_id usbmouse_as_key_id_table [] = { { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, USB_INTERFACE_PROTOCOL_MOUSE) }, { } /* Terminating entry */};static void usbmouse_as_key_irq(struct urb *urb){ static unsigned char pre_val;#if 0 int i; static int cnt = 0; printk("data cnt %d: ",++cnt); for(i=0;i cur_altsetting; int pipe; //a.分配一个input_dev uk_dev = input_allocate_device(); //b.设置 //b.1能产生哪类事件 set_bit(EV_KEY,uk_dev->evbit); set_bit(EV_REP,uk_dev->evbit); //b.2能产生哪些事件 set_bit(KEY_L,uk_dev->keybit); set_bit(KEY_S,uk_dev->keybit); set_bit(KEY_ENTER,uk_dev->keybit); //c.注册 input_register_device(uk_dev); //d.硬件相关操作 /*数据传输3要素*/ //源:USB设备的某个端点 endpoint = &interface->endpoint[0].desc; pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); //长度 len=endpoint->wMaxPacketSize; //目的 usb_buf=usb_alloc_coherent(dev,len,GFP_ATOMIC,&usb_buf_phys); /*使用三要素*/ //分配USB请求块 uk_urb=usb_alloc_urb(0,GFP_KERNEL); /*使用3要素设置urb*/ usb_fill_int_urb(uk_urb, dev, pipe, usb_buf,len,usbmouse_as_key_irq, NULL, endpoint->bInterval); uk_urb->transfer_dma = usb_buf_phys; uk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; /*使用URB*/ usb_submit_urb(uk_urb,GFP_KERNEL); return 0;}static void usbmouse_as_key_disconnect(struct usb_interface *intf){ struct usb_device *dev = interface_to_usbdev(intf); usb_kill_urb(uk_urb); usb_free_urb(uk_urb); usb_free_coherent(dev,len,usb_buf,usb_buf_phys); input_unregister_device(uk_dev); input_free_device(uk_dev);}//分配、设置usb_driver结构体static struct usb_driver usbmouse_as_key_driver = { .name = "usbmouse_as_key", .probe = usbmouse_as_key_probe, .disconnect = usbmouse_as_key_disconnect, .id_table = usbmouse_as_key_id_table,};static int usbmouse_init(){ /*注册*/ usb_register(&usbmouse_as_key_driver); return 0;}static void usbmouse_exit(){usb_deregister(&usbmouse_as_key_driver);}module_init(usbmouse_init);module_exit(usbmouse_exit);MODULE_LICENSE("GPL");
2.1make menuconfig去掉原来的USB鼠标驱动
-> Device Drivers │ -> HID Devices (HID_SUPPORT [=y]) │ <>USB Human interface Device (full HID) support 2.2make zImage并使用新内核启动 2.3insmod usbmouse_as_key.ko 2.4在开发板上接入、拔出USB鼠标 2.2测试3: 2.2.1 insmod usbmouse_as_key.ko 2.2.2接上鼠标 2.2.3查看鼠标数据转载地址:http://txomb.baihongyu.com/