summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libusb/usb_common.c38
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];
}