diff options
-rw-r--r-- | libusb/usb_common.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/libusb/usb_common.c b/libusb/usb_common.c index c9429e7..ccddceb 100644 --- a/libusb/usb_common.c +++ b/libusb/usb_common.c @@ -21,6 +21,17 @@ #include "config.h" +/* Globals ********************************************************************/ + +uint8_t cfgnum_std = 0; + +static struct { + uint8_t configc; + uint8_t **configv; + uint16_t *serial; + uint8_t serial_bytelen; +} globals = {0}; + /* Strings ********************************************************************/ /** @@ -74,9 +85,7 @@ uint16_t const *tud_descriptor_string_cb(uint8_t strid, uint16_t langid) { return (uint16_t *)&desc; } -/* Globals ********************************************************************/ - -uint8_t cfgnum_std = 0; +/* Main entrypoints ***********************************************************/ void usb_common_earlyinit(void) { if (cfgnum_std) @@ -108,19 +117,16 @@ COROUTINE usb_common_cr(void *_arg) { /* Main utilities *************************************************************/ -static uint8_t configc = 0; -static uint8_t **configv = NULL; - uint8_t usb_add_config(uint8_t iConfiguration, uint8_t bmAttributes, uint8_t bMaxPower_mA) { uint8_t *desc; - configv = reallocarray(configv, ++configc, sizeof configv[0]); - desc = configv[configc-1] = malloc(TUD_CONFIG_DESC_LEN); + globals.configv = reallocarray(globals.configv, ++globals.configc, sizeof globals.configv[0]); + desc = globals.configv[globals.configc-1] = malloc(TUD_CONFIG_DESC_LEN); memcpy(desc, (uint8_t[]){ /* USB configuration descriptor header (USB 2.0 §9.6.4 "Configuration") */ TUD_CONFIG_DESCRIPTOR( - configc, /* bConfigurationValue */ + globals.configc, /* bConfigurationValue */ 0, /* bNumInterfaces (will be incremented by usb_add_interface() */ iConfiguration, /* iConfiguration */ TUD_CONFIG_DESC_LEN, /* wTotalLength (will be incremented by usb_add_interface() */ @@ -128,15 +134,15 @@ uint8_t usb_add_config(uint8_t iConfiguration, uint8_t bmAttributes, uint8_t bMa bMaxPower_mA+1), /* bMaxPower (+1 because tusb just does n/2 instead of (n+1)/2) */ }, TUD_CONFIG_DESC_LEN); - return configc; + return globals.configc; } uint8_t usb_add_interface(uint8_t cfg_num, uint16_t ifc_len, uint8_t *ifc_dat) { - assert(cfg_num > 0 && cfg_num <= configc); + assert(cfg_num > 0 && cfg_num <= globals.configc); assert(ifc_len >= 3); assert(ifc_dat); - uint8_t *desc = configv[cfg_num-1]; + uint8_t *desc = globals.configv[cfg_num-1]; // wTotalLength uint16_t total_len = TU_U16(desc[3], desc[2]) + ifc_len; desc[3] = TU_U16_HIGH(total_len); @@ -144,7 +150,7 @@ uint8_t usb_add_interface(uint8_t cfg_num, uint16_t ifc_len, uint8_t *ifc_dat) { // bNumInterfaces ifc_dat[3] = desc[4]++; - desc = configv[cfg_num-1] = realloc(desc, total_len); + desc = globals.configv[cfg_num-1] = realloc(desc, total_len); memcpy(&desc[total_len-ifc_len], ifc_dat, ifc_len); return ifc_dat[3]; @@ -181,7 +187,7 @@ uint8_t const *tud_descriptor_device_cb(void) { .bNumConfigurations = 0, /* Number of possible configurations */ }; - desc.bNumConfigurations = configc; + desc.bNumConfigurations = globals.configc; return (uint8_t const *) &desc; } @@ -190,7 +196,7 @@ uint8_t const *tud_descriptor_device_cb(void) { * USB 2.0 §9.6.4 "Configuration") for the given index. */ uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { - if (index >= configc) + if (index >= globals.configc) return NULL; - return configv[index]; + return globals.configv[index]; } |