ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

Linux USBÇý¶¯Ñ§Ï°×ܽᣨÈý£©---- USBÊó±êµÄ¼ÓÔØ¡¢³õʼ»¯ºÍͨÐŹý³Ì(Ò»)
2017-10-11 16:48:02 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:5786´Î
Tags£ºLinux USB Çý¶¯ ѧϰ ×ܽá ---- ±êµÄ ¼ÓÔØ ³õʼ ͨÐÅ ¹ý³Ì

1¡¢usbmouseµÄ¶¨Ò壺usbÊó±ê¼È°üº¬usbÉ豸(usb_device)µÄÊôÐÔÒ²°üº¬inputÊäÈëÉ豸(input_dev)µÄÊôÐÔ

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;///

};

2¡¢usbmouseµÄ¼ÓÔØ£º

module_usb_driver(usb_mouse_driver);///ϵͳÆô¶¯Ê±×¢²áusb_mouse_driver

3¡¢usbmouseµÄ³õʼ»¯£º

 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)
Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 ÏÂÒ»Ò³ βҳ 1/3/3
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºBeaglebone Black - ×¼±¸ ÏÂһƪ£ºBeaglebone Black¨CGPIO ¸ßµÍµçÆ..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿