Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97777
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 384
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-06 16:52
文章分类

全部博文(38)

文章存档

2014年(38)

我的朋友

分类: 嵌入式

2014-05-12 16:48:04

目的:只要在接入USB鼠标后打印"find usbmouse!\n"及设备编号等信息,移除后打印"disconnect usbmouse!\n"

可以参考内核目录下的drivers\hid\usbhid\usbmouse.c
步骤如下:
1. 分配/设置usb_driver结构体
        .id_table
        .probe
        .disconnect
2. 注册

代码如下:

点击(此处)折叠或打开

  1. /*
  2.  * 参考drivers\hid\usbhid\usbmouse.c
  3.  */

  4. #include <linux/kernel.h>
  5. #include <linux/slab.h>
  6. #include <linux/module.h>
  7. #include <linux/init.h>
  8. #include <linux/usb/input.h>
  9. #include <linux/hid.h>

  10. static struct usb_device_id usbmouse_as_key_id_table [] = {
  11.     { USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,USB_INTERFACE_PROTOCOL_MOUSE) },
  12.     //只要USB设备的接口描述符里的类是HID,子类是BOOT,协议是MOUSE,那就支持该设备
  13.         
  14.     //{USB_DEVICE(0x1234,0x5678)},
  15.     //只支持某个厂家生产的某个产品,厂家编号0x1234,设备编号0x5678
  16.     
  17.     { }    /* Terminating entry */
  18. };

  19. static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
  20. {
  21.     struct usb_device *dev = interface_to_usbdev(intf);

  22.     printk("find usbmouse!\n");
  23.     printk("bcdUSB = %x\n", dev->descriptor.bcdUSB);
  24.     printk("VID    = 0x%x\n", dev->descriptor.idVendor);
  25.     printk("PID    = 0x%x\n", dev->descriptor.idProduct);

  26.     return 0;
  27. }

  28. static void usbmouse_as_key_disconnect(struct usb_interface *intf)
  29. {
  30.     printk("disconnect usbmouse!\n");
  31. }

  32. /* 1. 分配/设置usb_driver */
  33. static struct usb_driver usbmouse_as_key_driver = {
  34.     .name        = "usbmouse_as_key",
  35.     .probe        = usbmouse_as_key_probe,
  36.     .disconnect    = usbmouse_as_key_disconnect,
  37.     .id_table    = usbmouse_as_key_id_table,
  38. };


  39. static int usbmouse_as_key_init(void)
  40. {
  41.     /* 2. 注册 */
  42.     usb_register(&usbmouse_as_key_driver);
  43.     return 0;
  44. }

  45. static void usbmouse_as_key_exit(void)
  46. {
  47.     usb_deregister(&usbmouse_as_key_driver);    
  48. }

  49. module_init(usbmouse_as_key_init);
  50. module_exit(usbmouse_as_key_exit);

  51. MODULE_LICENSE("GPL");

测试:
先要去除内核的usb鼠标驱动 ,
     make menuconfig去掉原来的USB鼠标驱动
        -> Device Drivers 
              -> HID support
                  ->USB HID support
                     < > USB HID transport layer         
                      [ ] PID device support 

用新内核启动,接入USB鼠标后打印"find usbmouse!\n"及设备编号等信息,移除后打印"disconnect usbmouse!\n"

阅读(1151) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~