Merge pull request #4734 from dhalbert/dynamic-usb-fixes
fix HID; fix interface name table creation
This commit is contained in:
commit
4eb4f14840
|
@ -16,6 +16,7 @@ CIRCUITPY_FULL_BUILD = 0
|
|||
CIRCUITPY_ANALOGIO = 0
|
||||
CIRCUITPY_MATH = 0
|
||||
CIRCUITPY_NEOPIXEL_WRITE = 0
|
||||
CIRCUITPY_PULSEIO = 1
|
||||
CIRCUITPY_ROTARYIO = 0
|
||||
CIRCUITPY_RTC = 0
|
||||
CIRCUITPY_USB_MIDI = 1
|
||||
|
|
|
@ -97,7 +97,7 @@ static mp_obj_tuple_t default_hid_devices_tuple = {
|
|||
};
|
||||
|
||||
bool usb_hid_enabled(void) {
|
||||
return hid_devices_num == 0;
|
||||
return hid_devices_num > 0;
|
||||
}
|
||||
|
||||
void usb_hid_set_defaults(void) {
|
||||
|
@ -119,7 +119,7 @@ size_t usb_hid_add_descriptor(uint8_t *descriptor_buf, uint8_t *current_interfac
|
|||
descriptor_buf[HID_DESCRIPTOR_INTERFACE_INDEX] = *current_interface;
|
||||
(*current_interface)++;
|
||||
|
||||
usb_add_interface_string(*current_interface, usb_hid_interface_name);
|
||||
usb_add_interface_string(*current_interface_string, usb_hid_interface_name);
|
||||
descriptor_buf[HID_DESCRIPTOR_INTERFACE_STRING_INDEX] = *current_interface_string;
|
||||
(*current_interface_string)++;
|
||||
|
||||
|
|
|
@ -191,19 +191,19 @@ size_t usb_midi_add_descriptor(uint8_t *descriptor_buf, uint8_t *current_interfa
|
|||
descriptor_buf[MIDI_STREAMING_INTERFACE_NUMBER_INDEX_2] = *current_interface;
|
||||
(*current_interface)++;
|
||||
|
||||
usb_add_interface_string(*current_interface, midi_streaming_interface_name);
|
||||
usb_add_interface_string(*current_interface_string, midi_streaming_interface_name);
|
||||
descriptor_buf[MIDI_STREAMING_INTERFACE_STRING_INDEX] = *current_interface;
|
||||
(*current_interface_string)++;
|
||||
|
||||
usb_add_interface_string(*current_interface, midi_audio_control_interface_name);
|
||||
usb_add_interface_string(*current_interface_string, midi_audio_control_interface_name);
|
||||
descriptor_buf[MIDI_AUDIO_CONTROL_INTERFACE_STRING_INDEX] = *current_interface;
|
||||
(*current_interface_string)++;
|
||||
|
||||
usb_add_interface_string(*current_interface, midi_in_jack_name);
|
||||
usb_add_interface_string(*current_interface_string, midi_in_jack_name);
|
||||
descriptor_buf[MIDI_IN_JACK_STRING_INDEX] = *current_interface;
|
||||
(*current_interface_string)++;
|
||||
|
||||
usb_add_interface_string(*current_interface, midi_out_jack_name);
|
||||
usb_add_interface_string(*current_interface_string, midi_out_jack_name);
|
||||
descriptor_buf[MIDI_OUT_JACK_STRING_INDEX] = *current_interface;
|
||||
(*current_interface_string)++;
|
||||
|
||||
|
|
|
@ -247,6 +247,11 @@ void usb_add_interface_string(uint8_t interface_string_index, const char str[])
|
|||
collected_interface_strings_length += strlen(str);
|
||||
}
|
||||
|
||||
static const uint16_t language_id[] = {
|
||||
0x0304,
|
||||
0x0409,
|
||||
};
|
||||
|
||||
static void usb_build_interface_string_table(void) {
|
||||
// Allocate space for the le16 String descriptors.
|
||||
// Space needed is 2 bytes for String Descriptor header, then 2 bytes for each character
|
||||
|
@ -259,21 +264,20 @@ static void usb_build_interface_string_table(void) {
|
|||
uint16_t *string_descriptor = string_descriptors;
|
||||
|
||||
// Language ID is always the 0th string descriptor.
|
||||
collected_interface_strings[0].descriptor = (uint16_t[]) {
|
||||
0x0304,
|
||||
0x0409,
|
||||
};
|
||||
collected_interface_strings[0].descriptor = language_id;
|
||||
|
||||
// Build the le16 versions of all the descriptor strings.
|
||||
// Start at 1 to skip the Language ID.
|
||||
for (uint8_t string_index = 1; string_index < current_interface_string; string_index++) {
|
||||
const char *str = collected_interface_strings[string_index].char_str;
|
||||
const size_t str_len = strlen(str);
|
||||
uint8_t descriptor_size = 2 + (str_len * 2);
|
||||
string_descriptor[0] = 0x0300 | descriptor_size;
|
||||
// 1 word for descriptor type and length, 1 word for each character.
|
||||
const uint8_t descriptor_size_words = 1 + str_len;
|
||||
const uint8_t descriptor_size_bytes = descriptor_size_words * 2;
|
||||
string_descriptor[0] = 0x0300 | descriptor_size_bytes;
|
||||
|
||||
// Convert to le16.
|
||||
for (size_t i = 0; i <= str_len; i++) {
|
||||
for (size_t i = 0; i < str_len; i++) {
|
||||
string_descriptor[i + 1] = str[i];
|
||||
}
|
||||
|
||||
|
@ -281,7 +285,7 @@ static void usb_build_interface_string_table(void) {
|
|||
collected_interface_strings[string_index].descriptor = string_descriptor;
|
||||
|
||||
// Move to next descriptor slot.
|
||||
string_descriptor += descriptor_size;
|
||||
string_descriptor += descriptor_size_words;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue