usbsample.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:8k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * This sample driver implements USB protocol decoding for both an USB
  3.  * keyboard and an USB mouse. You can test it using either device, provided
  4.  * they are not already managed by the official drivers. If you want
  5.  * to only experiment with one device, pass the nokbd=1 or the
  6.  * no_mouse=1 option to the command line of insmod
  7.  */
  8. #ifndef __KERNEL__
  9. #  define __KERNEL__
  10. #endif
  11. #ifndef MODULE
  12. #  define MODULE
  13. #endif
  14. #include <linux/config.h>
  15. #include <linux/module.h>
  16. /* No USB with 2.0, make an explicit error and avoid strange ones */
  17. #if LINUX_VERSION_CODE < 0x020200
  18. #  error "This module needs kmod, so it won't run with 2.0"
  19. #else
  20. #include <linux/kernel.h>
  21. #include <linux/malloc.h>
  22. #include <linux/init.h>
  23. #include <linux/usb.h>
  24. /*
  25.  * Note: <linux/usb.h> in 2.2 includes <linux/kcomp.h> that breaks
  26.  * our sysdep.h . You can't disable kcomp.h from entering the game,
  27.  * so "sysdep.h" can't be included here. If you write a backward-portable
  28.  * driver with both USB and something-else support, you need to separate
  29.  * the USB stuff in order not to rely on sysdep.h in USB-related  files
  30.  */
  31. #if 0
  32.   #include "sysdep.h"
  33. #else
  34.   #include "usb-sysdep.h"
  35. #endif
  36. /*
  37.  * We need a local data structure, as it must be allocated for each new
  38.  * mouse device plugged in the USB bus
  39.  */
  40. struct sample_device {
  41.     unsigned char data[8];   /* enough for keyboard and mouse protocols */
  42.     char *name;              /* either "kdb" or "mouse" */
  43.     struct urb urb;          /* USB Request block, to get USB data*/
  44.     int maxp;                /* packet len */
  45.     char output[80];         /* used for printk at irq time */
  46. };
  47. /*
  48.  * Handler for data sent in by the device. The function is called by
  49.  * the USB kernel subsystem whenever a device spits out new data
  50.  */
  51. static void sample_irq(struct urb *urb)
  52. {
  53.     struct sample_device *sample = urb->context;
  54.     char *pos = sample->output;
  55.     int i;
  56.     if (urb->status != USB_ST_NOERROR) return;
  57.     pos += sprintf(pos, "usbsample: data from %-8s =",
  58.    sample->name);
  59.     for (i=0; i<sample->maxp; i++) {
  60. pos += sprintf(pos, " %02x", sample->data[i]);
  61.     }
  62.     printk(KERN_INFO "%sn", sample->output);
  63. }
  64. /*
  65.  * These two callbacks are invoked when an USB device is detached or attached
  66.  * to the bus
  67.  */
  68. static void sample_disconnect(struct usb_device *udev, void *clientdata)
  69. {
  70.     /* the clientdata is the sample_device we passed originally */
  71.     struct sample_device *sample = clientdata;
  72.     /* remove the URB, remove the input device, free memory */
  73.     usb_unlink_urb(&sample->urb);
  74.     kfree(sample);
  75.     printk(KERN_INFO "sample: USB %s disconnectedn", sample->name);
  76.     /*
  77.      * here you might MOD_DEC_USE_COUNT, but only if you increment
  78.      * the count in sample_probe() below
  79.      */
  80.     return;
  81. }
  82. static void *sample_probe(struct usb_device *udev, unsigned int ifnum,
  83.   const struct usb_device_id *id)
  84. {
  85.     /*
  86.      * The probe procedure is pretty standard. Device matching has already
  87.      * been performed based on the id_table structure (defined later)
  88.      */
  89.     struct usb_interface *iface;
  90.     struct usb_interface_descriptor *interface;
  91.     struct usb_endpoint_descriptor *endpoint;
  92.     struct sample_device *sample;
  93.     printk(KERN_INFO "usbsample: probe called for %s devicen",
  94.    (char *)id->driver_info /* "mouse" or "keyboard" */ );
  95.     iface = &udev->actconfig->interface[ifnum];
  96.     interface = &iface->altsetting[iface->act_altsetting];
  97.     if (interface->bNumEndpoints != 1) return NULL;
  98.     endpoint = interface->endpoint + 0;
  99.     if (!(endpoint->bEndpointAddress & 0x80)) return NULL;
  100.     if ((endpoint->bmAttributes & 3) != 3) return NULL;
  101.     usb_set_protocol(udev, interface->bInterfaceNumber, 0);
  102.     usb_set_idle(udev, interface->bInterfaceNumber, 0, 0);
  103.     /* allocate and zero a new data structure for the new device */
  104.     sample = kmalloc(sizeof(struct sample_device), GFP_KERNEL);
  105.     if (!sample) return NULL; /* failure */
  106.     memset(sample, 0, sizeof(*sample));
  107.     sample->name = (char *)id->driver_info;
  108.     /* fill the URB data structure using the FILL_INT_URB macro */
  109.     {
  110. int pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
  111. int maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe));
  112. if (maxp > 8) maxp = 8; sample->maxp = maxp; /* remember for later */
  113. FILL_INT_URB(&sample->urb, udev, pipe, sample->data, maxp,
  114.       sample_irq, sample, endpoint->bInterval);
  115.     }
  116.     /* register the URB within the USB subsystem */
  117.     if (usb_submit_urb(&sample->urb)) {
  118. kfree(sample);
  119. return NULL;
  120.     }
  121.     /* announce yourself */
  122.     printk(KERN_INFO "usbsample: probe successful for %s (maxp is %i)n",
  123.    sample->name, sample->maxp);
  124.     /*
  125.      * here you might MOD_INC_USE_COUNT; if you do, you'll need to unplug
  126.      * the device or the devices before being able to unload the module
  127.      */
  128.     /* and return the new structure */
  129.     return sample;
  130. }
  131. /*
  132.  * The id_table, lists all devices that can be handled by this driver.
  133.  * The three numbers are class, subclass, protocol. <linux/usb.h> has
  134.  * more details about interface mathces and vendor/device matches.
  135.  * This feature is not there in version 2.2, see below, sample_probe_22()
  136.  * for details. Here we use a fake usb_device_id structure defined in 
  137.  * ./usb-sysdep.h
  138.  */
  139. static struct usb_device_id sample_id_table [] = {
  140.     {
  141. USB_INTERFACE_INFO(3, 1, 1),
  142. driver_info: (unsigned long)"keyboard"
  143.     },
  144.     {
  145. USB_INTERFACE_INFO(3, 1, 2),
  146. driver_info: (unsigned long)"mouse"
  147.     },
  148.     {
  149. 0, /* no more matches */
  150.     }
  151. };
  152. /*
  153.  * The callbacks are registered within the USB subsystem using the
  154.  * usb_driver data structure
  155.  */
  156. #ifdef LINUX_24
  157. static struct usb_driver sample_usb_driver = {
  158.         name:        "sample",
  159.         probe:       sample_probe,
  160.         disconnect:  sample_disconnect,
  161.         id_table:    sample_id_table,
  162. };
  163. #else /* 2.2 */
  164. /*
  165.  * With version 2.2, there is no device_id support: the probe function
  166.  * is called for every device being plugged, and it must select whether
  167.  * the device is going to be handled or not. Here we extract the identification
  168.  * phase (based on class/subclass/protocol in this case) and rely on
  169.  * sample_probe() above for the interesting part of the game. Note
  170.  * that a 2.4 driver can use this approach as well, by not defining an
  171.  * id table (and achieving a 2.2 and 2.4 source with less ifdef). We think
  172.  * the id_table way is much cleaner, so we chose to exploit it where available
  173.  */
  174. static void *sample_probe_22(struct usb_device *udev, unsigned int ifnum)
  175. {
  176.     struct usb_device_id *id;
  177.     struct usb_interface_descriptor *interface;
  178.     printk(KERN_INFO "sample_probe_22 calledn");
  179.     if (udev->descriptor.bNumConfigurations != 1) return NULL;
  180.     interface = udev->config[0].interface[ifnum].altsetting;
  181.     for (id = sample_id_table; id->driver_info; id++) {
  182.         if (interface->bInterfaceClass !=    id->class)    continue;
  183.         if (interface->bInterfaceSubClass != id->subclass) continue;
  184.         if (interface->bInterfaceProtocol != id->protocol) continue;
  185. break; /* found */
  186.     }
  187.     if (!id->driver_info)
  188. return NULL; /* not ours */
  189.     return sample_probe(udev, ifnum, id);
  190. }
  191. static struct usb_driver sample_usb_driver = {
  192.         name:        "sample",
  193.         probe:       sample_probe_22,
  194.         disconnect:  sample_disconnect,
  195. /* no id_table field here */
  196. };
  197. #endif /* 2.2 */
  198. /*
  199.  * Functions called at module load and unload time: only register and
  200.  * unregister the USB callbacks
  201.  */
  202. int sample_init(void)
  203. {
  204.     /* just register it, returns 0 or error code */
  205.     return usb_register(&sample_usb_driver);
  206. }
  207. void sample_exit(void)
  208. {
  209.     usb_deregister(&sample_usb_driver);
  210. }
  211. module_init(sample_init);
  212. module_exit(sample_exit);
  213. #endif /* no 2.0 */