@@ -102,22 +102,38 @@ const tusb_desc_device_t usbd_desc_device_default = {
102
102
};
103
103
static tusb_desc_device_t usbd_desc_device ;
104
104
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
+
105
116
// 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 )
107
118
STATIC mp_obj_t usb_device_descriptor_device (mp_uint_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
108
119
enum {
109
120
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
111
123
};
112
124
static const mp_arg_t allowed_args [] = {
113
125
{ MP_QSTR_bDeviceClass , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
114
126
{ MP_QSTR_bDeviceSubclass , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
115
127
{ MP_QSTR_bDeviceProtocol , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
116
128
{ MP_QSTR_idVendor , MP_ARG_OBJ , {.u_obj = MP_ROM_NONE } },
117
129
{ 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 } }
119
133
};
134
+ tusb_desc_configuration_t * desc_config ;
120
135
136
+ desc_config = (tusb_desc_configuration_t * ) usbd_desc_cfg .cfg ;
121
137
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
122
138
mp_arg_parse_all (n_args - 1 , pos_args + 1 , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
123
139
@@ -139,21 +155,55 @@ STATIC mp_obj_t usb_device_descriptor_device(mp_uint_t n_args, const mp_obj_t *p
139
155
if (args [ARG_bDeviceClass ].u_obj != mp_const_none ) {
140
156
usbd_desc_device .bDeviceClass = mp_obj_get_int (args [ARG_bDeviceClass ].u_obj );
141
157
}
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
+
142
165
143
166
return mp_const_none ;
144
167
}
145
168
STATIC MP_DEFINE_CONST_FUN_OBJ_KW (usb_device_descriptor_device_obj , 1 , usb_device_descriptor_device );
146
169
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 );
157
207
158
208
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 )};
159
209
@@ -341,6 +391,7 @@ void usbd_reset_descriptor(void) {
341
391
342
392
STATIC const mp_rom_map_elem_t usb_device_descriptors_locals_dict_table [] = {
343
393
{ 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 },
344
395
345
396
{ MP_ROM_QSTR (MP_QSTR_CLASS_UNSPECIFIED ), MP_ROM_INT (TUSB_CLASS_UNSPECIFIED )},
346
397
{ MP_ROM_QSTR (MP_QSTR_CLASS_AUDIO ), MP_ROM_INT (TUSB_CLASS_AUDIO )},
0 commit comments