# HG changeset patch # User Paul Boddie # Date 1362425245 0 # Node ID a11494bd42ccad4c669f237a80c86a9f8113f91d # Parent 26c62ea1aef90455d8da5375dcae620290f4bf76 Introduced a generic descriptor retrieval function, using it in device initialisation and to get the available languages. Made the display of language codes a separate function. diff -r 26c62ea1aef9 -r a11494bd42cc test.c --- a/test.c Fri Mar 01 23:38:54 2013 +0000 +++ b/test.c Mon Mar 04 19:27:25 2013 +0000 @@ -586,6 +586,43 @@ setup[7] = length >> 8; } +uint8_t usb_descriptor_size(uint8_t type) +{ + switch (type) + { + case USB_DT_DEVICE: return USB_DT_DEVICE_SIZE; + case USB_DT_CONFIG: return USB_DT_CONFIG_SIZE; + case USB_DT_STRING: return sizeof(struct usb_string_descriptor); + case USB_DT_INTERFACE: return USB_DT_INTERFACE_SIZE; + case USB_DT_ENDPOINT: return USB_DT_ENDPOINT_SIZE; + default: return 0; + } +} + +uint8_t *max_get_descriptor(max_device *device, uint8_t type, uint8_t value, uint8_t index) +{ + static uint8_t data[64]; + uint8_t len = 64, setup[8]; + + printf("Sending descriptor request to address %d, endpoint 0...\n", device->address); + + max_write(MAX_REG_PERADDR, device->address); + + setup_packet(setup, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, usb_descriptor_type(type) | value, index, 64); + max_control(setup); + if (!max_control_input(data, &len, device)) + { + printf("Failed.\n"); + return NULL; + } + max_control_status(true); + + if (len >= usb_descriptor_size(type)) + return data; + else + return NULL; +} + /** * Perform initialisation on a device, obtaining the device details and storing * this information in the device structure, returning true if successful and @@ -593,23 +630,19 @@ */ bool max_init_device(max_device *device) { - uint8_t data[64], len = 64, setup[8]; + struct usb_device_descriptor *desc; printf("Sending control request to address 0, endpoint 0...\n"); - max_write(MAX_REG_PERADDR, 0); + device->address = 0; /* Send a "get descriptor" request for the device descriptor. */ - setup_packet(setup, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, usb_descriptor_type(USB_DT_DEVICE), 0, USB_DT_DEVICE_SIZE); - max_control(setup); - if (!max_control_input(data, &len, device)) - return false; - max_control_status(true); + desc = (struct usb_device_descriptor *) max_get_descriptor(device, USB_DT_DEVICE, 0, 0); - if (len >= sizeof(struct usb_device_descriptor)) + if (desc != NULL) { - memcpy(&device->desc, data, sizeof(struct usb_device_descriptor)); + memcpy(&device->desc, desc, sizeof(struct usb_device_descriptor)); device->desc.bcdUSB = le16toh(device->desc.bcdUSB); device->desc.idVendor = le16toh(device->desc.idVendor); device->desc.idProduct = le16toh(device->desc.idProduct); @@ -657,37 +690,20 @@ max_control_status(false); } - -void max_get_descriptor(max_device *device) +void usb_show_languages(uint8_t *data) { - uint8_t data[64], len = 64, setup[8]; - struct usb_string_descriptor *desc; + struct usb_string_descriptor *desc = (struct usb_string_descriptor *) data; uint16_t *lang; - printf("Sending descriptor request to address %d, endpoint 0...\n", device->address); - - max_write(MAX_REG_PERADDR, device->address); - - setup_packet(setup, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, usb_descriptor_type(USB_DT_STRING), 0, 64); - max_control(setup); - if (!max_control_input(data, &len, device)) - { - printf("Failed.\n"); + if (data == NULL) return; - } - max_control_status(true); - if (len >= sizeof(struct usb_string_descriptor)) - { - desc = (struct usb_string_descriptor *) data; + printf("bLength: %d\n", desc->bLength); + printf("bDescriptorType: %d\n", desc->bDescriptorType); - printf("bLength: %d\n", desc->bLength); - printf("bDescriptorType: %d\n", desc->bDescriptorType); - - for (lang = desc->wData; lang < (uint16_t *) (data + desc->bLength); lang++) - { - printf("wLangId: %04x\n", le16toh(*lang)); - } + for (lang = desc->wData; lang < (uint16_t *) (data + desc->bLength); lang++) + { + printf("wLangId: %04x\n", le16toh(*lang)); } } @@ -866,7 +882,7 @@ max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) & ~MAX_MODE_SOFKAENAB); max_set_address(&device); devstate = MAX_DEVSTATE_READY; - max_get_descriptor(&device); + usb_show_languages(max_get_descriptor(&device, USB_DT_STRING, 0, 0)); printf("READY\n"); }