Skip to content

Commit 4eb4f14

Browse files
authored
Merge pull request #4734 from dhalbert/dynamic-usb-fixes
fix HID; fix interface name table creation
2 parents 51120a9 + becff6f commit 4eb4f14

File tree

4 files changed

+19
-14
lines changed

4 files changed

+19
-14
lines changed

ports/atmel-samd/boards/pirkey_m0/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ CIRCUITPY_FULL_BUILD = 0
1616
CIRCUITPY_ANALOGIO = 0
1717
CIRCUITPY_MATH = 0
1818
CIRCUITPY_NEOPIXEL_WRITE = 0
19+
CIRCUITPY_PULSEIO = 1
1920
CIRCUITPY_ROTARYIO = 0
2021
CIRCUITPY_RTC = 0
2122
CIRCUITPY_USB_MIDI = 1

shared-module/usb_hid/__init__.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ static mp_obj_tuple_t default_hid_devices_tuple = {
9797
};
9898

9999
bool usb_hid_enabled(void) {
100-
return hid_devices_num == 0;
100+
return hid_devices_num > 0;
101101
}
102102

103103
void usb_hid_set_defaults(void) {
@@ -119,7 +119,7 @@ size_t usb_hid_add_descriptor(uint8_t *descriptor_buf, uint8_t *current_interfac
119119
descriptor_buf[HID_DESCRIPTOR_INTERFACE_INDEX] = *current_interface;
120120
(*current_interface)++;
121121

122-
usb_add_interface_string(*current_interface, usb_hid_interface_name);
122+
usb_add_interface_string(*current_interface_string, usb_hid_interface_name);
123123
descriptor_buf[HID_DESCRIPTOR_INTERFACE_STRING_INDEX] = *current_interface_string;
124124
(*current_interface_string)++;
125125

shared-module/usb_midi/__init__.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,19 @@ size_t usb_midi_add_descriptor(uint8_t *descriptor_buf, uint8_t *current_interfa
191191
descriptor_buf[MIDI_STREAMING_INTERFACE_NUMBER_INDEX_2] = *current_interface;
192192
(*current_interface)++;
193193

194-
usb_add_interface_string(*current_interface, midi_streaming_interface_name);
194+
usb_add_interface_string(*current_interface_string, midi_streaming_interface_name);
195195
descriptor_buf[MIDI_STREAMING_INTERFACE_STRING_INDEX] = *current_interface;
196196
(*current_interface_string)++;
197197

198-
usb_add_interface_string(*current_interface, midi_audio_control_interface_name);
198+
usb_add_interface_string(*current_interface_string, midi_audio_control_interface_name);
199199
descriptor_buf[MIDI_AUDIO_CONTROL_INTERFACE_STRING_INDEX] = *current_interface;
200200
(*current_interface_string)++;
201201

202-
usb_add_interface_string(*current_interface, midi_in_jack_name);
202+
usb_add_interface_string(*current_interface_string, midi_in_jack_name);
203203
descriptor_buf[MIDI_IN_JACK_STRING_INDEX] = *current_interface;
204204
(*current_interface_string)++;
205205

206-
usb_add_interface_string(*current_interface, midi_out_jack_name);
206+
usb_add_interface_string(*current_interface_string, midi_out_jack_name);
207207
descriptor_buf[MIDI_OUT_JACK_STRING_INDEX] = *current_interface;
208208
(*current_interface_string)++;
209209

supervisor/shared/usb/usb_desc.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ void usb_add_interface_string(uint8_t interface_string_index, const char str[])
247247
collected_interface_strings_length += strlen(str);
248248
}
249249

250+
static const uint16_t language_id[] = {
251+
0x0304,
252+
0x0409,
253+
};
254+
250255
static void usb_build_interface_string_table(void) {
251256
// Allocate space for the le16 String descriptors.
252257
// Space needed is 2 bytes for String Descriptor header, then 2 bytes for each character
@@ -259,29 +264,28 @@ static void usb_build_interface_string_table(void) {
259264
uint16_t *string_descriptor = string_descriptors;
260265

261266
// Language ID is always the 0th string descriptor.
262-
collected_interface_strings[0].descriptor = (uint16_t[]) {
263-
0x0304,
264-
0x0409,
265-
};
267+
collected_interface_strings[0].descriptor = language_id;
266268

267269
// Build the le16 versions of all the descriptor strings.
268270
// Start at 1 to skip the Language ID.
269271
for (uint8_t string_index = 1; string_index < current_interface_string; string_index++) {
270272
const char *str = collected_interface_strings[string_index].char_str;
271273
const size_t str_len = strlen(str);
272-
uint8_t descriptor_size = 2 + (str_len * 2);
273-
string_descriptor[0] = 0x0300 | descriptor_size;
274+
// 1 word for descriptor type and length, 1 word for each character.
275+
const uint8_t descriptor_size_words = 1 + str_len;
276+
const uint8_t descriptor_size_bytes = descriptor_size_words * 2;
277+
string_descriptor[0] = 0x0300 | descriptor_size_bytes;
274278

275279
// Convert to le16.
276-
for (size_t i = 0; i <= str_len; i++) {
280+
for (size_t i = 0; i < str_len; i++) {
277281
string_descriptor[i + 1] = str[i];
278282
}
279283

280284
// Save ptr to string descriptor with le16 str.
281285
collected_interface_strings[string_index].descriptor = string_descriptor;
282286

283287
// Move to next descriptor slot.
284-
string_descriptor += descriptor_size;
288+
string_descriptor += descriptor_size_words;
285289
}
286290
}
287291

0 commit comments

Comments
 (0)