Skip to content

Commit 7352b4d

Browse files
committed
shared/tinyusb,extmod/machine_usb_device: Simplify class state to flags.
Replace mp_usbd_class_state_t boolean fields (cdc_enabled, msc_enabled) with single uint8_t flags field to eliminate redundant state storage. Changes: - Use MP_USBD_CDC_ENABLED() and MP_USBD_MSC_ENABLED() macros for checks - Remove mp_usbd_update_class_state() and mp_usbd_class_state_to_flags() - Store and access flags directly in mp_usbd_class_state.flags - Add compile-time guards (#if CFG_TUD_CDC) in descriptor length calc Code size impact (NUCLEO_H563ZI): - Runtime mode: +24 bytes - Static mode: +16 bytes The slight size increase is due to macro expansion overhead, but the code is simpler with single source of truth for enabled class state. Signed-off-by: Andrew Leech <[email protected]>
1 parent 69072b1 commit 7352b4d

File tree

4 files changed

+25
-49
lines changed

4 files changed

+25
-49
lines changed

extmod/machine_usb_device.c

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -84,30 +84,15 @@ static mp_obj_t usb_device_make_new(const mp_obj_type_t *type, size_t n_args, si
8484
o->base.type = &machine_usb_device_type;
8585

8686
// Initialize fields common to both minimal and full modes
87+
extern mp_usbd_class_state_t mp_usbd_class_state;
8788
#if MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE
8889
// Runtime mode: read current class state to reflect default CDC configuration
89-
extern mp_usbd_class_state_t mp_usbd_class_state;
90-
uint8_t flags = 0;
91-
if (mp_usbd_class_state.cdc_enabled) {
92-
flags |= USB_BUILTIN_FLAG_CDC;
93-
}
94-
if (mp_usbd_class_state.msc_enabled) {
95-
flags |= USB_BUILTIN_FLAG_MSC;
96-
}
97-
o->builtin_driver = flags;
90+
o->builtin_driver = mp_usbd_class_state.flags;
9891
o->active = tud_inited();
9992
#else
10093
// In static mode, USB is always initialized at boot
10194
// Class state is set during early boot, create a USBBuiltin object from it
102-
extern mp_usbd_class_state_t mp_usbd_class_state;
103-
uint8_t flags = 0;
104-
if (mp_usbd_class_state.cdc_enabled) {
105-
flags |= USB_BUILTIN_FLAG_CDC;
106-
}
107-
if (mp_usbd_class_state.msc_enabled) {
108-
flags |= USB_BUILTIN_FLAG_MSC;
109-
}
110-
o->builtin_driver = mp_usbd_create_builtin_config(flags);
95+
o->builtin_driver = mp_usbd_create_builtin_config(mp_usbd_class_state.flags);
11196
o->active = tud_inited();
11297
#endif
11398

@@ -546,7 +531,7 @@ static void usb_device_attr(mp_obj_t self_in, qstr attr, mp_obj_t *dest) {
546531
}
547532

548533
// Update the internal class state based on flags
549-
mp_usbd_update_class_state(flags);
534+
mp_usbd_class_state.flags = flags;
550535

551536
#if MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE
552537
// In runtime mode, store flags directly

shared/tinyusb/mp_usbd.h

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ void mp_usbd_hex_str(char *out_str, const uint8_t *bytes, size_t bytes_len);
5858

5959
// Per-class runtime enable/disable state
6060
typedef struct {
61-
bool cdc_enabled;
62-
bool msc_enabled;
61+
uint8_t flags; // Bitfield of enabled USB classes (USB_BUILTIN_FLAG_*)
6362
} mp_usbd_class_state_t;
6463

6564
// Global class enable state
@@ -103,25 +102,23 @@ extern const mp_obj_type_t mp_type_usb_builtin;
103102
#define USB_BUILTIN_FLAG_MSC 0x02
104103
#define USB_BUILTIN_FLAG_NCM 0x04
105104

105+
// Helper macros for checking enabled classes
106+
#define MP_USBD_CDC_ENABLED() (mp_usbd_class_state.flags & USB_BUILTIN_FLAG_CDC)
107+
#define MP_USBD_MSC_ENABLED() (mp_usbd_class_state.flags & USB_BUILTIN_FLAG_MSC)
108+
106109
// Initialize class state based on compile-time configuration and runtime mode
107110
static inline void mp_usbd_init_class_state(void) {
108111
#if MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE
109112
// In runtime mode, only CDC enabled by default
110-
mp_usbd_class_state.cdc_enabled = (CFG_TUD_CDC == 1);
111-
mp_usbd_class_state.msc_enabled = false;
113+
mp_usbd_class_state.flags = (CFG_TUD_CDC ? USB_BUILTIN_FLAG_CDC : 0);
112114
#else
113115
// In static mode, enable all compiled classes
114-
mp_usbd_class_state.cdc_enabled = (CFG_TUD_CDC == 1);
115-
mp_usbd_class_state.msc_enabled = (CFG_TUD_MSC == 1);
116+
mp_usbd_class_state.flags =
117+
(CFG_TUD_CDC ? USB_BUILTIN_FLAG_CDC : 0) |
118+
(CFG_TUD_MSC ? USB_BUILTIN_FLAG_MSC : 0);
116119
#endif
117120
}
118121

119-
// Update class state based on bitfield flags
120-
static inline void mp_usbd_update_class_state(uint8_t flags) {
121-
mp_usbd_class_state.cdc_enabled = (flags & USB_BUILTIN_FLAG_CDC) && (CFG_TUD_CDC == 1);
122-
mp_usbd_class_state.msc_enabled = (flags & USB_BUILTIN_FLAG_MSC) && (CFG_TUD_MSC == 1);
123-
}
124-
125122
// Calculate descriptor length from flags using compile-time conditionals
126123
static inline size_t mp_usbd_get_descriptor_cfg_len_from_flags(uint8_t flags) {
127124
size_t len = TUD_CONFIG_DESC_LEN;

shared/tinyusb/mp_usbd_descriptor.c

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,10 @@ const usb_desc_entry_t usb_desc_table[] = {
108108
#endif
109109
};
110110

111-
// Global descriptor buffer for runtime configuration (used by both runtime and static modes)
111+
// Global descriptor buffer for runtime configuration (only needed in runtime mode)
112+
#if MICROPY_HW_ENABLE_USB_RUNTIME_DEVICE
112113
uint8_t mp_usbd_desc_cfg_buffer[MP_USBD_BUILTIN_DESC_CFG_LEN];
114+
#endif
113115

114116
// Unified descriptor generation function using lookup table
115117
const uint8_t *mp_usbd_generate_desc_cfg_unified(uint8_t flags, uint8_t *buffer) {
@@ -165,12 +167,16 @@ const uint8_t *mp_usbd_generate_desc_cfg_unified(uint8_t flags, uint8_t *buffer)
165167
size_t mp_usbd_get_descriptor_cfg_len(void) {
166168
size_t len = TUD_CONFIG_DESC_LEN;
167169

168-
if (mp_usbd_class_state.cdc_enabled && CFG_TUD_CDC) {
170+
#if CFG_TUD_CDC
171+
if (MP_USBD_CDC_ENABLED()) {
169172
len += TUD_CDC_DESC_LEN;
170173
}
171-
if (mp_usbd_class_state.msc_enabled && CFG_TUD_MSC) {
174+
#endif
175+
#if CFG_TUD_MSC
176+
if (MP_USBD_MSC_ENABLED()) {
172177
len += TUD_MSC_DESC_LEN;
173178
}
179+
#endif
174180

175181
return len;
176182
}
@@ -196,22 +202,9 @@ static const uint8_t mp_usbd_builtin_desc_cfg_max[MP_USBD_BUILTIN_DESC_CFG_LEN]
196202
// Dynamic descriptor buffer for runtime configuration
197203
static uint8_t mp_usbd_dynamic_desc_cfg[MP_USBD_BUILTIN_DESC_CFG_LEN];
198204

199-
// Convert class state to flags
200-
static uint8_t mp_usbd_class_state_to_flags(void) {
201-
uint8_t flags = USB_BUILTIN_FLAG_NONE;
202-
if (mp_usbd_class_state.cdc_enabled) {
203-
flags |= USB_BUILTIN_FLAG_CDC;
204-
}
205-
if (mp_usbd_class_state.msc_enabled) {
206-
flags |= USB_BUILTIN_FLAG_MSC;
207-
}
208-
return flags;
209-
}
210-
211205
// Generate dynamic configuration descriptor based on enabled classes
212206
static const uint8_t *mp_usbd_generate_desc_cfg(void) {
213-
uint8_t flags = mp_usbd_class_state_to_flags();
214-
return mp_usbd_generate_desc_cfg_unified(flags, mp_usbd_dynamic_desc_cfg);
207+
return mp_usbd_generate_desc_cfg_unified(mp_usbd_class_state.flags, mp_usbd_dynamic_desc_cfg);
215208
}
216209
#endif
217210

shared/tinyusb/mp_usbd_runtime.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) {
125125
if (!result && usbd->builtin_driver != USB_BUILTIN_FLAG_NONE) {
126126
extern uint8_t mp_usbd_desc_cfg_buffer[];
127127
extern const uint8_t *mp_usbd_generate_desc_cfg_unified(uint8_t flags, uint8_t *buffer);
128-
mp_usbd_update_class_state(usbd->builtin_driver);
128+
extern mp_usbd_class_state_t mp_usbd_class_state;
129+
mp_usbd_class_state.flags = usbd->builtin_driver;
129130
result = mp_usbd_generate_desc_cfg_unified(usbd->builtin_driver, mp_usbd_desc_cfg_buffer);
130131
}
131132
}

0 commit comments

Comments
 (0)