struct usb_mouse {
char name[128];///USBÊó±êÉ豸Ãû³Æ
char phys[64];///·¾¶
struct usb_device *usbdev;///USBÉ豸
struct input_dev *dev;///Input É豸
struct urb *irq; ///urb½á¹¹Ìå
signed char *data;///Êý¾Ý´«Ê仺³åÇøÖ¸Õë
dma_addr_t data_dma;///
};
1 static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
2 {
3 struct usb_device *dev = interface_to_usbdev(intf);///ͨ¹ý USB ½Ó¿ÚÀ´»ñµÃ usb É豸
4 struct usb_host_interface *interface;
5 struct usb_endpoint_descriptor *endpoint;
6 struct usb_mouse *mouse;
7 struct input_dev *input_dev;
8 int pipe, maxp;
9 int error = -ENOMEM;
10
11 interface = intf->cur_altsetting;///»ñÈ¡ usb_host_interface
12
13 if (interface->desc.bNumEndpoints != 1)/// usbÊó±ê¶ËµãÓÐÇÒÖ»ÓÐÒ»¸ö¿ØÖƶ˵㣬·ñÔò·µ»Ø ENODEV
14 return -ENODEV;
15
16 endpoint = &interface->endpoint[0].desc; ///usbÊó±êÖ»ÓÐÒ»¸ö¶Ëµã£¬»ñÈ¡¶ËµãÃèÊö·û
17 if (!usb_endpoint_is_int_in(endpoint))///¼ì²é¶ËµãÊDz»ÊÇÖжÏÀàÐ͵ÄÊäÈë¶Ëµã
18 return -ENODEV;
19
20 pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);////»ñÈ¡ pipe()£¬¸ù¾Ý¶ËµãµØÖ·bEndpointAddress£¬ÖжϷ½Ê½£¬IN¶Ëµã¾Í¿ÉÒԵõ½Ò»¸öpipe£¬È»ºóÖ÷»ú¾ÍÖªµÀ¸úËȥͨÐÅ£¬¸ÃÈçºÎͨÐÅ
21 maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));///»ñÈ¡Ö÷»úºÍÉ豸һ´ÎͨѶµÄ×î´ó×Ö½ÚÊý
22
23 mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);///·ÖÅäÒ»¸öusb_mouse
24 input_dev = input_allocate_device();///³õʼ»¯ input É豸
25 if (!mouse || !input_dev)
26 goto fail1;
27
28 mouse->data = usb_alloc_coherent(dev, 8, GFP_ATOMIC, &mouse->data_dma);///ΪusbmouseµÄdata ·ÖÅä8¸ö×ֽڵĿռä
29 if (!mouse->data)
30 goto fail1;
31
32 mouse->irq = usb_alloc_urb(0, GFP_KERNEL);///ÉêÇë·ÖÅä urb £¬¸³Öµ¸ø usb_mouse µÄ urb
33 if (!mouse->irq)
34 goto fail2;
35
36 mouse->usbdev = dev; //ÉèÖÃusbÊó±êÉ豸µÄusbÉ豸¶ÔÏó
37 mouse->dev = input_dev;//É豸usbÊó±êÉ豸µÄinputÉ豸¶ÔÏó
38
39 if (dev->manufacturer)///ö¾ÙʱºòÓлñÈ¡µ½ÓÐЧµÄ³§ÉÌÃû
40 strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name));///¸´ÖƳ§ÉÌÃûµ½ name
41
42 if (dev->product) { //ö¾ÙʱºòÓлñÈ¡µ½ÓÐЧµÄ²úÆ·Ãû
43 if (dev->manufacturer) //Èç¹ûÒ²Óг§ÉÌÃû
44 strlcat(mouse->name, " ", sizeof(mouse->name)); //ÔòÓÿոñ½«³§ÉÌÃûºÍ²úÆ·Ãû¸ô¿ª
45 strlcat(mouse->name, dev->product, sizeof(mouse->name));//×·¼Ó²úÆ·Ãûµ½name
46 }
47
48 if (!strlen(mouse->name)) //Èç¹û³§É̺ͲúÆ·Ãû¶¼Ã»ÓÐ
49 snprintf(mouse->name, sizeof(mouse->name), //ÔòÖ±½Ó¸ù¾Ý³§ÉÌidºÍ²úÆ·id¸øname¸³Öµ
50 "USB HIDBP Mouse %04x:%04x",
51 le16_to_cpu(dev->descriptor.idVendor),
52 le16_to_cpu(dev->descriptor.idProduct));
53
54 usb_make_path(dev, mouse->phys, sizeof(mouse->phys)); //ÉèÖÃÉ豸·¾¶Ãû
55 strlcat(mouse->phys, "/input0", sizeof(mouse->phys)); //×·¼Ó/input0
56
57 input_dev->name = mouse->name; //ÊäÈëÉ豸µÄÃû×ÖÉèÖóÉusbÊó±êµÄÃû×Ö
58 input_dev->phys = mouse->phys; //ÊäÈëÉ豸µÄ·¾¶ÉèÖóÉusbÊó±êµÄ·¾¶
59 usb_to_input_id(dev, &input_dev->id); //ÉèÖÃÊäÈëÉ豸µÄbustype,vendor,product,version
60 input_dev->dev.parent = &intf->dev; //usb½Ó¿ÚÉ豸ΪÊäÈëÉ豸µÄ¸¸É豸
61
62 ////evbit ¹ØÓÚÉ豸֧³ÖʼþÀàÐ굀 bitmap
63 input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);¡¡///BIT_MASK ÕÒµ½²ÎÊýÖµËùÔÚµÄ bitλ,ÊäÈëʼþ°´¼üÀàÐÍ + Ïà¶ÔλÒÆ
64 input_dev->keybit[BIT_WORD(BTN_MOUSE)