linux-old/drivers/usb/usb-debug.c
<<
>>
Prefs
   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
  19static void usb_show_endpoint(struct usb_endpoint_descriptor *endpoint)
  20{
  21        usb_show_endpoint_descriptor(endpoint);
  22}
  23
  24static void usb_show_interface(struct usb_interface_descriptor *altsetting)
  25{
  26        int i;
  27
  28        usb_show_interface_descriptor(altsetting);
  29
  30        for (i = 0; i < altsetting->bNumEndpoints; i++)
  31                usb_show_endpoint(altsetting->endpoint + i);
  32}
  33
  34static void usb_show_config(struct usb_config_descriptor *config)
  35{
  36        int i, j;
  37        struct usb_interface *ifp;
  38
  39        usb_show_config_descriptor(config);
  40        for (i = 0; i < config->bNumInterfaces; i++) {
  41                ifp = config->interface + i;
  42
  43                if (!ifp)
  44                        break;
  45
  46                printk("\n  Interface: %d\n", i);
  47                for (j = 0; j < ifp->num_altsetting; j++)
  48                        usb_show_interface(ifp->altsetting + j);
  49        }
  50}
  51
  52void usb_show_device(struct usb_device *dev)
  53{
  54        int i;
  55
  56        usb_show_device_descriptor(&dev->descriptor);
  57        for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
  58                usb_show_config(dev->config + i);
  59}
  60
  61/*
  62 * Parse and show the different USB descriptors.
  63 */
  64void usb_show_device_descriptor(struct usb_device_descriptor *desc)
  65{
  66        if (!desc)
  67        {
  68                printk("Invalid USB device descriptor (NULL POINTER)\n");
  69                return;
  70        }
  71        printk("  Length              = %2d%s\n", desc->bLength,
  72                desc->bLength == USB_DT_DEVICE_SIZE ? "" : " (!!!)");
  73        printk("  DescriptorType      = %02x\n", desc->bDescriptorType);
  74
  75        printk("  USB version         = %x.%02x\n",
  76                desc->bcdUSB >> 8, desc->bcdUSB & 0xff);
  77        printk("  Vendor:Product      = %04x:%04x\n",
  78                desc->idVendor, desc->idProduct);
  79        printk("  MaxPacketSize0      = %d\n", desc->bMaxPacketSize0);
  80        printk("  NumConfigurations   = %d\n", desc->bNumConfigurations);
  81        printk("  Device version      = %x.%02x\n",
  82                desc->bcdDevice >> 8, desc->bcdDevice & 0xff);
  83
  84        printk("  Device Class:SubClass:Protocol = %02x:%02x:%02x\n",
  85                desc->bDeviceClass, desc->bDeviceSubClass, desc->bDeviceProtocol);
  86        switch (desc->bDeviceClass) {
  87        case 0:
  88                printk("    Per-interface classes\n");
  89                break;
  90        case USB_CLASS_AUDIO:
  91                printk("    Audio device class\n");
  92                break;
  93        case USB_CLASS_COMM:
  94                printk("    Communications class\n");
  95                break;
  96        case USB_CLASS_HID:
  97                printk("    Human Interface Devices class\n");
  98                break;
  99        case USB_CLASS_PRINTER:
 100                printk("    Printer device class\n");
 101                break;
 102        case USB_CLASS_MASS_STORAGE:
 103                printk("    Mass Storage device class\n");
 104                break;
 105        case USB_CLASS_HUB:
 106                printk("    Hub device class\n");
 107                break;
 108        case USB_CLASS_VENDOR_SPEC:
 109                printk("    Vendor class\n");
 110                break;
 111        default:
 112                printk("    Unknown class\n");
 113        }
 114}
 115
 116void usb_show_config_descriptor(struct usb_config_descriptor *desc)
 117{
 118        printk("Configuration:\n");
 119        printk("  bLength             = %4d%s\n", desc->bLength,
 120                desc->bLength == USB_DT_CONFIG_SIZE ? "" : " (!!!)");
 121        printk("  bDescriptorType     =   %02x\n", desc->bDescriptorType);
 122        printk("  wTotalLength        = %04x\n", desc->wTotalLength);
 123        printk("  bNumInterfaces      =   %02x\n", desc->bNumInterfaces);
 124        printk("  bConfigurationValue =   %02x\n", desc->bConfigurationValue);
 125        printk("  iConfiguration      =   %02x\n", desc->iConfiguration);
 126        printk("  bmAttributes        =   %02x\n", desc->bmAttributes);
 127        printk("  MaxPower            = %4dmA\n", desc->MaxPower * 2);
 128}
 129
 130void usb_show_interface_descriptor(struct usb_interface_descriptor *desc)
 131{
 132        printk("  Alternate Setting: %2d\n", desc->bAlternateSetting);
 133        printk("    bLength             = %4d%s\n", desc->bLength,
 134                desc->bLength == USB_DT_INTERFACE_SIZE ? "" : " (!!!)");
 135        printk("    bDescriptorType     =   %02x\n", desc->bDescriptorType);
 136        printk("    bInterfaceNumber    =   %02x\n", desc->bInterfaceNumber);
 137        printk("    bAlternateSetting   =   %02x\n", desc->bAlternateSetting);
 138        printk("    bNumEndpoints       =   %02x\n", desc->bNumEndpoints);
 139        printk("    bInterface Class:SubClass:Protocol =   %02x:%02x:%02x\n",
 140                desc->bInterfaceClass, desc->bInterfaceSubClass, desc->bInterfaceProtocol);
 141        printk("    iInterface          =   %02x\n", desc->iInterface);
 142}
 143
 144void usb_show_endpoint_descriptor(struct usb_endpoint_descriptor *desc)
 145{
 146        char *LengthCommentString = (desc->bLength ==
 147                USB_DT_ENDPOINT_AUDIO_SIZE) ? " (Audio)" : (desc->bLength ==
 148                USB_DT_ENDPOINT_SIZE) ? "" : " (!!!)";
 149        char *EndpointType[4] = { "Control", "Isochronous", "Bulk", "Interrupt" };
 150
 151        printk("    Endpoint:\n");
 152        printk("      bLength             = %4d%s\n",
 153                desc->bLength, LengthCommentString);
 154        printk("      bDescriptorType     =   %02x\n", desc->bDescriptorType);
 155        printk("      bEndpointAddress    =   %02x (%s)\n", desc->bEndpointAddress,
 156                (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
 157                        USB_ENDPOINT_XFER_CONTROL ? "i/o" :
 158                (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK) ? "in" : "out");
 159        printk("      bmAttributes        =   %02x (%s)\n", desc->bmAttributes,
 160                EndpointType[USB_ENDPOINT_XFERTYPE_MASK & desc->bmAttributes]);
 161        printk("      wMaxPacketSize      = %04x\n", desc->wMaxPacketSize);
 162        printk("      bInterval           =   %02x\n", desc->bInterval);
 163
 164        /* Audio extensions to the endpoint descriptor */
 165        if (desc->bLength == USB_DT_ENDPOINT_AUDIO_SIZE) {
 166                printk("      bRefresh            =   %02x\n", desc->bRefresh);
 167                printk("      bSynchAddress       =   %02x\n", desc->bSynchAddress);
 168        }
 169}
 170
 171void usb_show_string(struct usb_device *dev, char *id, int index)
 172{
 173        char *buf;
 174
 175        if (!index)
 176                return;
 177        if (!(buf = kmalloc(256, GFP_KERNEL)))
 178                return;
 179        if (usb_string(dev, index, buf, 256) > 0)
 180                printk(KERN_INFO "%s: %s\n", id, buf);
 181        kfree(buf);
 182}
 183
 184void usb_dump_urb (struct urb *urb)
 185{
 186        printk ("urb                   :%p\n", urb);
 187        printk ("next                  :%p\n", urb->next);
 188        printk ("dev                   :%p\n", urb->dev);
 189        printk ("pipe                  :%08X\n", urb->pipe);
 190        printk ("status                :%d\n", urb->status);
 191        printk ("transfer_flags        :%08X\n", urb->transfer_flags);
 192        printk ("transfer_buffer       :%p\n", urb->transfer_buffer);
 193        printk ("transfer_buffer_length:%d\n", urb->transfer_buffer_length);
 194        printk ("actual_length         :%d\n", urb->actual_length);
 195        printk ("setup_packet          :%p\n", urb->setup_packet);
 196        printk ("start_frame           :%d\n", urb->start_frame);
 197        printk ("number_of_packets     :%d\n", urb->number_of_packets);
 198        printk ("interval              :%d\n", urb->interval);
 199        printk ("error_count           :%d\n", urb->error_count);
 200        printk ("context               :%p\n", urb->context);
 201        printk ("complete              :%p\n", urb->complete);
 202}
 203
 204
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.