1.1 --- a/test.c Thu Mar 14 23:32:30 2013 +0000
1.2 +++ b/test.c Sat Mar 23 17:31:34 2013 +0000
1.3 @@ -746,6 +746,38 @@
1.4 max_control_status(false);
1.5 }
1.6
1.7 +const char *usb_endpoint_address_str(uint8_t bEndpointAddress)
1.8 +{
1.9 + static char output[] = "255 (127 OUT)";
1.10 +
1.11 + sprintf(output, "%03d (%03d %3s)", bEndpointAddress,
1.12 + bEndpointAddress & ~USB_ENDPOINT_IN,
1.13 + bEndpointAddress & USB_ENDPOINT_IN ? "IN" : "OUT");
1.14 +
1.15 + return output;
1.16 +}
1.17 +
1.18 +const char *usb_endpoint_attributes_str(uint8_t bmAttributes)
1.19 +{
1.20 + switch (bmAttributes & USB_ENDPOINT_TYPE_MASK)
1.21 + {
1.22 + case USB_ENDPOINT_TYPE_CONTROL:
1.23 + return "CONTROL";
1.24 +
1.25 + case USB_ENDPOINT_TYPE_ISOCHRONOUS:
1.26 + return "ISO";
1.27 +
1.28 + case USB_ENDPOINT_TYPE_BULK:
1.29 + return "BULK";
1.30 +
1.31 + case USB_ENDPOINT_TYPE_INTERRUPT:
1.32 + return "INT";
1.33 +
1.34 + default:
1.35 + return "";
1.36 + }
1.37 +}
1.38 +
1.39 void usb_show_device(max_device *device)
1.40 {
1.41 printf("bLength: %d\n", device->desc.bLength);
1.42 @@ -781,28 +813,90 @@
1.43 }
1.44 }
1.45
1.46 -void usb_show_configuration(uint8_t *data)
1.47 +/**
1.48 + * Obtain a configuration descriptor with usable structure members.
1.49 + */
1.50 +struct usb_config_descriptor *usb_get_config_descriptor(uint8_t *data)
1.51 {
1.52 struct usb_config_descriptor *conf = (struct usb_config_descriptor *) data;
1.53 - uint8_t *current, *last, total = le16toh(conf->wTotalLength);
1.54 - struct usb_descriptor_header *desc;
1.55 - struct usb_interface_descriptor *intf;
1.56 - struct usb_endpoint_descriptor *endp;
1.57 + conf->wTotalLength = le16toh(conf->wTotalLength);
1.58 + return conf;
1.59 +}
1.60 +
1.61 +/**
1.62 + * Obtain an endpoint descriptor with usable structure members.
1.63 + */
1.64 +struct usb_endpoint_descriptor *usb_get_endpoint_descriptor(uint8_t *data)
1.65 +{
1.66 + struct usb_endpoint_descriptor *endp = (struct usb_endpoint_descriptor *) data;
1.67 + endp->wMaxPacketSize = le16toh(endp->wMaxPacketSize);
1.68 + return endp;
1.69 +}
1.70
1.71 - if (data == NULL)
1.72 - return;
1.73 +uint8_t *usb_descriptor_start(struct usb_config_descriptor *conf)
1.74 +{
1.75 + return ((uint8_t *) conf) + conf->bLength;
1.76 +}
1.77 +
1.78 +uint8_t *usb_descriptor_end(struct usb_config_descriptor *conf)
1.79 +{
1.80 + return ((uint8_t *) conf) + conf->wTotalLength;
1.81 +}
1.82
1.83 +uint8_t *usb_descriptor_next(uint8_t *current)
1.84 +{
1.85 + struct usb_descriptor_header *desc = (struct usb_descriptor_header *) current;
1.86 + if (desc->bLength)
1.87 + return current + desc->bLength;
1.88 + else
1.89 + return NULL;
1.90 +}
1.91 +
1.92 +void usb_show_configuration(struct usb_config_descriptor *conf)
1.93 +{
1.94 printf("bLength: %d\n", conf->bLength);
1.95 printf("bDescriptorType: %d\n", conf->bDescriptorType);
1.96 - printf("wTotalLength: %d\n", total);
1.97 + printf("wTotalLength: %d\n", conf->wTotalLength);
1.98 printf("bNumInterfaces: %d\n", conf->bNumInterfaces);
1.99 printf("bConfigurationValue: %d\n", conf->bConfigurationValue);
1.100 printf("iConfiguration: %d\n", conf->iConfiguration);
1.101 printf("bmAttributes: %x\n", conf->bmAttributes);
1.102 printf("MaxPower: %d\n", conf->MaxPower);
1.103 +}
1.104
1.105 - current = ((uint8_t *) conf) + conf->bLength;
1.106 - last = ((uint8_t *) conf) + total;
1.107 +void usb_show_interface(struct usb_interface_descriptor *intf)
1.108 +{
1.109 + printf("bInterfaceNumber: %d\n", intf->bInterfaceNumber);
1.110 + printf("bAlternateSetting: %d\n", intf->bAlternateSetting);
1.111 + printf("bNumEndpoints: %d\n", intf->bNumEndpoints);
1.112 + printf("bInterfaceClass: %x\n", intf->bInterfaceClass);
1.113 + printf("bInterfaceSubClass: %x\n", intf->bInterfaceSubClass);
1.114 + printf("bInterfaceProtocol: %x\n", intf->bInterfaceProtocol);
1.115 + printf("iInterface: %d\n", intf->iInterface);
1.116 +}
1.117 +
1.118 +void usb_show_endpoint(struct usb_endpoint_descriptor *endp)
1.119 +{
1.120 + printf("bEndpointAddress: %s\n", usb_endpoint_address_str(endp->bEndpointAddress));
1.121 + printf("bmAttributes: %s\n", usb_endpoint_attributes_str(endp->bmAttributes));
1.122 + printf("wMaxPacketSize: %d\n", endp->wMaxPacketSize);
1.123 + printf("bInterval: %d\n", endp->bInterval);
1.124 +}
1.125 +
1.126 +void usb_show_configuration_full(uint8_t *data)
1.127 +{
1.128 + struct usb_config_descriptor *conf;
1.129 + struct usb_descriptor_header *desc;
1.130 + struct usb_interface_descriptor *intf;
1.131 + struct usb_endpoint_descriptor *endp;
1.132 + uint8_t *current, *last;
1.133 +
1.134 + if (data == NULL)
1.135 + return;
1.136 +
1.137 + conf = usb_get_config_descriptor(data);
1.138 + current = usb_descriptor_start(conf);
1.139 + last = usb_descriptor_end(conf);
1.140
1.141 while (current < last)
1.142 {
1.143 @@ -814,30 +908,21 @@
1.144 {
1.145 case USB_DT_INTERFACE:
1.146 intf = (struct usb_interface_descriptor *) current;
1.147 - printf("bInterfaceNumber: %d\n", intf->bInterfaceNumber);
1.148 - printf("bAlternateSetting: %d\n", intf->bAlternateSetting);
1.149 - printf("bNumEndpoints: %d\n", intf->bNumEndpoints);
1.150 - printf("bInterfaceClass: %x\n", intf->bInterfaceClass);
1.151 - printf("bInterfaceSubClass: %x\n", intf->bInterfaceSubClass);
1.152 - printf("bInterfaceProtocol: %x\n", intf->bInterfaceProtocol);
1.153 - printf("iInterface: %d\n", intf->iInterface);
1.154 + usb_show_interface(intf);
1.155 break;
1.156
1.157 case USB_DT_ENDPOINT:
1.158 - endp = (struct usb_endpoint_descriptor *) current;
1.159 - printf("bEndpointAddress: %d\n", endp->bEndpointAddress);
1.160 - printf("bmAttributes: %x\n", endp->bmAttributes);
1.161 - printf("wMaxPacketSize: %d\n", le16toh(endp->wMaxPacketSize));
1.162 - printf("bInterval: %d\n", endp->bInterval);
1.163 + endp = usb_get_endpoint_descriptor(current);
1.164 + usb_show_endpoint(endp);
1.165 break;
1.166
1.167 default:
1.168 break;
1.169 }
1.170
1.171 - if (desc->bLength)
1.172 - current += desc->bLength;
1.173 - else
1.174 + current = usb_descriptor_next(current);
1.175 +
1.176 + if (current == NULL)
1.177 {
1.178 printf("END (zero length record)\n");
1.179 break;
1.180 @@ -1045,7 +1130,7 @@
1.181 printf("DEVICE?\n");
1.182
1.183 usb_show_languages(max_get_descriptor(&device, USB_DT_STRING, 0, 0, 0));
1.184 - usb_show_configuration(max_get_descriptor(&device, USB_DT_CONFIG, 0, 0, 0));
1.185 + usb_show_configuration_full(max_get_descriptor(&device, USB_DT_CONFIG, 0, 0, 0));
1.186 devstate = MAX_DEVSTATE_READY;
1.187 printf("READY\n");
1.188 }