usb-debug.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * debug.c - USB debug helper routines.
  3.  *
  4.  * I just want these out of the way where they aren't in your
  5.  * face, but so that you can still use them..
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/version.h>
  9. #include <linux/kernel.h>
  10. #include <linux/mm.h>
  11. #include <linux/slab.h>
  12. #ifdef CONFIG_USB_DEBUG
  13. #define DEBUG
  14. #else
  15. #undef DEBUG
  16. #endif
  17. #include <linux/usb.h>
  18. static void usb_show_endpoint(struct usb_endpoint_descriptor *endpoint)
  19. {
  20. usb_show_endpoint_descriptor(endpoint);
  21. }
  22. static void usb_show_interface(struct usb_interface_descriptor *altsetting)
  23. {
  24. int i;
  25. usb_show_interface_descriptor(altsetting);
  26. for (i = 0; i < altsetting->bNumEndpoints; i++)
  27. usb_show_endpoint(altsetting->endpoint + i);
  28. }
  29. static void usb_show_config(struct usb_config_descriptor *config)
  30. {
  31. int i, j;
  32. struct usb_interface *ifp;
  33. usb_show_config_descriptor(config);
  34. for (i = 0; i < config->bNumInterfaces; i++) {
  35. ifp = config->interface + i;
  36. if (!ifp)
  37. break;
  38. printk("n  Interface: %dn", i);
  39. for (j = 0; j < ifp->num_altsetting; j++)
  40. usb_show_interface(ifp->altsetting + j);
  41. }
  42. }
  43. void usb_show_device(struct usb_device *dev)
  44. {
  45. int i;
  46. usb_show_device_descriptor(&dev->descriptor);
  47. for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
  48. usb_show_config(dev->config + i);
  49. }
  50. /*
  51.  * Parse and show the different USB descriptors.
  52.  */
  53. void usb_show_device_descriptor(struct usb_device_descriptor *desc)
  54. {
  55. if (!desc)
  56. {
  57. printk("Invalid USB device descriptor (NULL POINTER)n");
  58. return;
  59. }
  60. printk("  Length              = %2d%sn", desc->bLength,
  61. desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)");
  62. printk("  DescriptorType      = %02xn", desc->bDescriptorType);
  63. printk("  USB version         = %x.%02xn",
  64. desc->bcdUSB >> 8, desc->bcdUSB & 0xff);
  65. printk("  Vendor:Product      = %04x:%04xn",
  66. desc->idVendor, desc->idProduct);
  67. printk("  MaxPacketSize0      = %dn", desc->bMaxPacketSize0);
  68. printk("  NumConfigurations   = %dn", desc->bNumConfigurations);
  69. printk("  Device version      = %x.%02xn",
  70. desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
  71. printk("  Device Class:SubClass:Protocol = %02x:%02x:%02xn",
  72. desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol);
  73. switch (desc->bDeviceClass) {
  74. case 0:
  75. printk("    Per-interface classesn");
  76. break;
  77. case USB_CLASS_AUDIO:
  78. printk("    Audio device classn");
  79. break;
  80. case USB_CLASS_COMM:
  81. printk("    Communications classn");
  82. break;
  83. case USB_CLASS_HID:
  84. printk("    Human Interface Devices classn");
  85. break;
  86. case USB_CLASS_PRINTER:
  87. printk("    Printer device classn");
  88. break;
  89. case USB_CLASS_MASS_STORAGE:
  90. printk("    Mass Storage device classn");
  91. break;
  92. case USB_CLASS_HUB:
  93. printk("    Hub device classn");
  94. break;
  95. case USB_CLASS_VENDOR_SPEC:
  96. printk("    Vendor classn");
  97. break;
  98. default:
  99. printk("    Unknown classn");
  100. }
  101. }
  102. void usb_show_config_descriptor(struct usb_config_descriptor *desc)
  103. {
  104. printk("Configuration:n");
  105. printk("  bLength             = %4d%sn", desc->bLength,
  106. desc->bLength == USB_DT_CONFIG_SIZE ? "" : " (!!!)");
  107. printk("  bDescriptorType     =   %02xn", desc->bDescriptorType);
  108. printk("  wTotalLength        = %04xn", desc->wTotalLength);
  109. printk("  bNumInterfaces      =   %02xn", desc->bNumInterfaces);
  110. printk("  bConfigurationValue =   %02xn", desc->bConfigurationValue);
  111. printk("  iConfiguration      =   %02xn", desc->iConfiguration);
  112. printk("  bmAttributes        =   %02xn", desc->bmAttributes);
  113. printk("  MaxPower            = %4dmAn", desc->MaxPower * 2);
  114. }
  115. void usb_show_interface_descriptor(struct usb_interface_descriptor *desc)
  116. {
  117. printk("  Alternate Setting: %2dn", desc->bAlternateSetting);
  118. printk("    bLength             = %4d%sn", desc->bLength,
  119. desc->bLength == USB_DT_INTERFACE_SIZE ? "" : " (!!!)");
  120. printk("    bDescriptorType     =   %02xn", desc->bDescriptorType);
  121. printk("    bInterfaceNumber    =   %02xn", desc->bInterfaceNumber);
  122. printk("    bAlternateSetting   =   %02xn", desc->bAlternateSetting);
  123. printk("    bNumEndpoints       =   %02xn", desc->bNumEndpoints);
  124. printk("    bInterface Class:SubClass:Protocol =   %02x:%02x:%02xn",
  125. desc->bInterfaceClass, desc->bInterfaceSubClass, desc->bInterfaceProtocol);
  126. printk("    iInterface          =   %02xn", desc->iInterface);
  127. }
  128. void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc)
  129. {
  130. char *LengthCommentString = (desc->bLength ==
  131. USB_DT_ENDPOINT_AUDIO_SIZE) ? " (Audio)" : (desc->bLength ==
  132. USB_DT_ENDPOINT_SIZE) ? "" : " (!!!)";
  133. char *EndpointType[4] = { "Control", "Isochronous", "Bulk", "Interrupt" };
  134. printk("    Endpoint:n");
  135. printk("      bLength             = %4d%sn",
  136. desc->bLength, LengthCommentString);
  137. printk("      bDescriptorType     =   %02xn", desc->bDescriptorType);
  138. printk("      bEndpointAddress    =   %02x (%s)n", desc->bEndpointAddress,
  139. (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
  140. USB_ENDPOINT_XFER_CONTROL ? "i/o" :
  141. (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? "in" : "out");
  142. printk("      bmAttributes        =   %02x (%s)n", desc->bmAttributes,
  143. EndpointType[USB_ENDPOINT_XFERTYPE_MASK & desc->bmAttributes]);
  144. printk("      wMaxPacketSize      = %04xn", desc->wMaxPacketSize);
  145. printk("      bInterval           =   %02xn", desc->bInterval);
  146. /* Audio extensions to the endpoint descriptor */
  147. if (desc->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) {
  148. printk("      bRefresh            =   %02xn", desc->bRefresh);
  149. printk("      bSynchAddress       =   %02xn", desc->bSynchAddress);
  150. }
  151. }
  152. void usb_show_string(struct usb_device *dev, char *id, int index)
  153. {
  154. char *buf;
  155. if (!index)
  156. return;
  157. if (!(buf = kmalloc(256, GFP_KERNEL)))
  158. return;
  159. if (usb_string(dev, index, buf, 256) > 0)
  160. printk(KERN_INFO "%s: %sn", id, buf);
  161. kfree(buf);
  162. }
  163. void usb_dump_urb (struct urb *urb)
  164. {
  165. printk ("urb                   :%pn", urb);
  166. printk ("next                  :%pn", urb->next);
  167. printk ("dev                   :%pn", urb->dev);
  168. printk ("pipe                  :%08Xn", urb->pipe);
  169. printk ("status                :%dn", urb->status);
  170. printk ("transfer_flags        :%08Xn", urb->transfer_flags);
  171. printk ("transfer_buffer       :%pn", urb->transfer_buffer);
  172. printk ("transfer_buffer_length:%dn", urb->transfer_buffer_length);
  173. printk ("actual_length         :%dn", urb->actual_length);
  174. printk ("setup_packet          :%pn", urb->setup_packet);
  175. printk ("start_frame           :%dn", urb->start_frame);
  176. printk ("number_of_packets     :%dn", urb->number_of_packets);
  177. printk ("interval              :%dn", urb->interval);
  178. printk ("error_count           :%dn", urb->error_count);
  179. printk ("context               :%pn", urb->context);
  180. printk ("complete              :%pn", urb->complete);
  181. }