summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Buren <braewoods+rb@braewoods.net>2021-10-06 16:40:54 -0500
committerAidan MacDonald <amachronic@protonmail.com>2021-10-06 17:59:17 -0400
commitc0a59b9a6a132425136f807787e22d78547f81b5 (patch)
tree3233f52a7fc54e1a88fb91c1a253c4fff1c7a9d9
parent4be81c23858ad59d25041c20159f1ef3970eb757 (diff)
downloadrockbox-c0a59b9a6a132425136f807787e22d78547f81b5.tar.gz
rockbox-c0a59b9a6a132425136f807787e22d78547f81b5.zip
usbstack: Revise usb string descriptor table to use enum values for indices
This makes it possible for macros of conditionally included string descriptors to get a correct index no matter what other usb drivers are enabled or disabled due to the nature behavior of enums. Change-Id: I8ccebbd316605bed0f5d90b6b73fab4a333c02fa
-rw-r--r--firmware/export/usb_core.h8
-rw-r--r--firmware/usbstack/usb_core.c19
2 files changed, 17 insertions, 10 deletions
diff --git a/firmware/export/usb_core.h b/firmware/export/usb_core.h
index 75fafc06a8..78a80435e1 100644
--- a/firmware/export/usb_core.h
+++ b/firmware/export/usb_core.h
@@ -39,6 +39,14 @@
39 39
40extern int usb_max_pkt_size; 40extern int usb_max_pkt_size;
41 41
42enum {
43 USB_STRING_INDEX_LANGUAGE,
44 USB_STRING_INDEX_MANUFACTURER,
45 USB_STRING_INDEX_PRODUCT,
46 USB_STRING_INDEX_SERIAL,
47 USB_STRING_INDEX_MAX,
48};
49
42struct usb_class_driver; 50struct usb_class_driver;
43 51
44void usb_core_init(void); 52void usb_core_init(void);
diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c
index 65bf7293c8..50d93f7561 100644
--- a/firmware/usbstack/usb_core.c
+++ b/firmware/usbstack/usb_core.c
@@ -90,9 +90,9 @@ static struct usb_device_descriptor __attribute__((aligned(2)))
90 .idVendor = USB_VENDOR_ID, 90 .idVendor = USB_VENDOR_ID,
91 .idProduct = USB_PRODUCT_ID, 91 .idProduct = USB_PRODUCT_ID,
92 .bcdDevice = 0x0100, 92 .bcdDevice = 0x0100,
93 .iManufacturer = 1, 93 .iManufacturer = USB_STRING_INDEX_MANUFACTURER,
94 .iProduct = 2, 94 .iProduct = USB_STRING_INDEX_PRODUCT,
95 .iSerialNumber = 3, 95 .iSerialNumber = USB_STRING_INDEX_SERIAL,
96 .bNumConfigurations = 1 96 .bNumConfigurations = 1
97} ; 97} ;
98 98
@@ -141,12 +141,12 @@ static const struct usb_string_descriptor __attribute__((aligned(2)))
141 lang_descriptor = 141 lang_descriptor =
142USB_STRING_INITIALIZER(u"\x0409"); /* LANGID US English */ 142USB_STRING_INITIALIZER(u"\x0409"); /* LANGID US English */
143 143
144static const struct usb_string_descriptor* const usb_strings[] = 144static const struct usb_string_descriptor* const usb_strings[USB_STRING_INDEX_MAX] =
145{ 145{
146 &lang_descriptor, 146 [USB_STRING_INDEX_LANGUAGE] = &lang_descriptor,
147 &usb_string_iManufacturer, 147 [USB_STRING_INDEX_MANUFACTURER] = &usb_string_iManufacturer,
148 &usb_string_iProduct, 148 [USB_STRING_INDEX_PRODUCT] = &usb_string_iProduct,
149 &usb_string_iSerial 149 [USB_STRING_INDEX_SERIAL] = &usb_string_iSerial,
150}; 150};
151 151
152static int usb_address = 0; 152static int usb_address = 0;
@@ -637,8 +637,7 @@ static void request_handler_device_get_descriptor(struct usb_ctrlrequest* req)
637 637
638 case USB_DT_STRING: 638 case USB_DT_STRING:
639 logf("STRING %d", index); 639 logf("STRING %d", index);
640 if((unsigned)index < (sizeof(usb_strings) / 640 if((unsigned)index < USB_STRING_INDEX_MAX) {
641 sizeof(struct usb_string_descriptor*))) {
642 size = usb_strings[index]->bLength; 641 size = usb_strings[index]->bLength;
643 ptr = usb_strings[index]; 642 ptr = usb_strings[index];
644 } 643 }