Skip to content

Commit 9c31ee9

Browse files
committed
Added ability to change USB device names and power settings.
1 parent 472b318 commit 9c31ee9

File tree

1 file changed

+64
-13
lines changed

1 file changed

+64
-13
lines changed

shared/tinyusb/usbd_descriptor.c

Lines changed: 64 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,22 +102,38 @@ const tusb_desc_device_t usbd_desc_device_default = {
102102
};
103103
static tusb_desc_device_t usbd_desc_device;
104104

105+
typedef struct {
106+
uint8_t cfg[512];
107+
int len;
108+
int itf_count;
109+
int in_count;
110+
int out_count;
111+
char names[MICROPY_HW_USB_MAX_DESCRIPTORS][DESC_STR_MAX];
112+
int names_len;
113+
} desc_cfg_t;
114+
static desc_cfg_t usbd_desc_cfg;
115+
105116
// device(bDeviceClass=None, bDeviceSubclass=None, bDeviceProtocol=None,
106-
// idVendor=None, idProduct=None, bcdDevice=None)
117+
// idVendor=None, idProduct=None, bcdDevice=None, bmAttributes=None, bMaxPower=None)
107118
STATIC mp_obj_t usb_device_descriptor_device(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
108119
enum {
109120
ARG_bDeviceClass, ARG_bDeviceSubClass, ARG_bDeviceProtocol,
110-
ARG_idVendor, ARG_idProduct, ARG_bcdDevice
121+
ARG_idVendor, ARG_idProduct, ARG_bcdDevice,
122+
ARG_bmAttributes, ARG_bMaxPower
111123
};
112124
static const mp_arg_t allowed_args[] = {
113125
{ MP_QSTR_bDeviceClass, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
114126
{ MP_QSTR_bDeviceSubclass, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
115127
{ MP_QSTR_bDeviceProtocol, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
116128
{ MP_QSTR_idVendor, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
117129
{ MP_QSTR_idProduct, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
118-
{ MP_QSTR_bcdDevice, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} }
130+
{ MP_QSTR_bcdDevice, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
131+
{ MP_QSTR_bmAttributes, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} },
132+
{ MP_QSTR_bMaxPower, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE} }
119133
};
134+
tusb_desc_configuration_t *desc_config;
120135

136+
desc_config = (tusb_desc_configuration_t*) usbd_desc_cfg.cfg;
121137
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
122138
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
123139

@@ -139,21 +155,55 @@ STATIC mp_obj_t usb_device_descriptor_device(mp_uint_t n_args, const mp_obj_t *p
139155
if (args[ARG_bDeviceClass].u_obj != mp_const_none) {
140156
usbd_desc_device.bDeviceClass = mp_obj_get_int(args[ARG_bDeviceClass].u_obj);
141157
}
158+
if (args[ARG_bmAttributes].u_obj != mp_const_none) {
159+
desc_config->bmAttributes = mp_obj_get_int(args[ARG_bmAttributes].u_obj);
160+
}
161+
if (args[ARG_bMaxPower].u_obj != mp_const_none) {
162+
desc_config->bMaxPower = mp_obj_get_int(args[ARG_bMaxPower].u_obj);
163+
}
164+
142165

143166
return mp_const_none;
144167
}
145168
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(usb_device_descriptor_device_obj, 1, usb_device_descriptor_device);
146169

147-
typedef struct {
148-
uint8_t cfg[512];
149-
int len;
150-
int itf_count;
151-
int in_count;
152-
int out_count;
153-
char names[MICROPY_HW_USB_MAX_DESCRIPTORS][DESC_STR_MAX];
154-
int names_len;
155-
} desc_cfg_t;
156-
static desc_cfg_t usbd_desc_cfg;
170+
STATIC mp_obj_t usb_device_descriptor_strings(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
171+
enum {
172+
ARG_Manufacturer, ARG_Product, ARG_CDC, ARG_MSC
173+
};
174+
char *name;
175+
static const mp_arg_t allowed_args[] = {
176+
{ MP_QSTR_Manufacturer, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}},
177+
{ MP_QSTR_Product, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}},
178+
{ MP_QSTR_CDC, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}},
179+
{ MP_QSTR_MSC, MP_ARG_OBJ, {.u_obj = MP_ROM_NONE}}
180+
};
181+
182+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
183+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
184+
185+
if (args[ARG_Manufacturer].u_obj != mp_const_none) {
186+
name = (char*) mp_obj_str_get_str(args[ARG_Manufacturer].u_obj);
187+
strcpy(usbd_desc_cfg.names[1], name);
188+
}
189+
if (args[ARG_Product].u_obj != mp_const_none) {
190+
name = (char*) mp_obj_str_get_str(args[ARG_Product].u_obj);
191+
strcpy(usbd_desc_cfg.names[2], name);
192+
}
193+
if (args[ARG_CDC].u_obj != mp_const_none) {
194+
name = (char*) mp_obj_str_get_str(args[ARG_CDC].u_obj);
195+
strcpy(usbd_desc_cfg.names[4], name);
196+
}
197+
#if CFG_TUD_MSC
198+
if (args[ARG_MSC].u_obj != mp_const_none) {
199+
name = (char*) mp_obj_str_get_str(args[ARG_MSC].u_obj);
200+
strcpy(usbd_desc_cfg.names[5], name);
201+
}
202+
#endif
203+
204+
return mp_const_none;
205+
}
206+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(usb_device_descriptor_strings_obj, 1, usb_device_descriptor_strings);
157207

158208
uint8_t usbd_desc_cfg_cdc[] = {TUD_CDC_DESCRIPTOR(USBD_ITF_CDC, USBD_STR_CDC, USBD_CDC_EP_CMD, USBD_CDC_CMD_MAX_SIZE, USBD_CDC_EP_OUT, USBD_CDC_EP_IN, USBD_CDC_IN_OUT_MAX_SIZE)};
159209

@@ -341,6 +391,7 @@ void usbd_reset_descriptor(void) {
341391

342392
STATIC const mp_rom_map_elem_t usb_device_descriptors_locals_dict_table[] = {
343393
{ MP_ROM_QSTR(MP_QSTR_device), (mp_obj_t)&usb_device_descriptor_device_obj},
394+
{ MP_ROM_QSTR(MP_QSTR_strings), (mp_obj_t)&usb_device_descriptor_strings_obj},
344395

345396
{ MP_ROM_QSTR(MP_QSTR_CLASS_UNSPECIFIED), MP_ROM_INT(TUSB_CLASS_UNSPECIFIED)},
346397
{ MP_ROM_QSTR(MP_QSTR_CLASS_AUDIO), MP_ROM_INT(TUSB_CLASS_AUDIO)},

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy