8000 Provide language code to string descriptors · ladyada/circuitpython@0cf3a66 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0cf3a66

Browse files
committed
Provide language code to string descriptors
This improves adafruit#8885 but doesn't fix the read error.
1 parent 89437cf commit 0cf3a66

File tree

3 files changed

+29
- 10000 5
lines changed

3 files changed

+29
-5
lines changed

shared-module/usb/core/Device.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ bool common_hal_usb_core_device_construct(usb_core_device_obj_t *self, uint8_t d
6262
return false;
6363
}
6464
self->device_number = device_number;
65+
self->first_langid = 0;
6566
_xfer_result = 0xff;
6667
return true;
6768
}
@@ -108,9 +109,23 @@ STATIC mp_obj_t _get_string(const uint16_t *temp_buf) {
108109
return utf16le_to_string(temp_buf + 1, utf16_len);
109110
}
110111

112+
STATIC void _get_langid(usb_core_device_obj_t *self) {
113+
if (self->first_langid != 0) {
114+
return;
115+
}
116+
// Two control bytes and one uint16_t language code.
117+
uint16_t temp_buf[2];
118+
if (!tuh_descriptor_get_string(self->device_number, 0, 0, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) ||
119+
!_wait_for_callback()) {
120+
return;
121+
}
122+
self->first_langid = temp_buf[1];
123+
}
124+
111125
mp_obj_t common_hal_usb_core_device_get_serial_number(usb_core_device_obj_t *self) {
112126
uint16_t temp_buf[127];
113-
if (!tuh_descriptor_get_serial_string(self->device_number, 0, temp_buf, MP_ARRAY_SIZE(temp_buf), _transfer_done_cb, 0) ||
127+
_get_langid(self);
128+
if (!tuh_descriptor_get_serial_string(self->device_number, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) ||
114129
!_wait_for_callback()) {
115130
return mp_const_none;
116131
}
@@ -119,7 +134,8 @@ mp_obj_t common_hal_usb_core_device_get_serial_number(usb_core_device_obj_t *sel
119134

120135
mp_obj_t common_hal_usb_core_device_get_product(usb_core_device_obj_t *self) {
121136
uint16_t temp_buf[127];
122-
if (!tuh_descriptor_get_product_string(self->device_number, 0, temp_buf, MP_ARRAY_SIZE(temp_buf), _transfer_done_cb, 0) ||
137+
_get_langid(self);
138+
if (!tuh_descriptor_get_product_string(self->device_number, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) ||
123139
!_wait_for_callback()) {
124140
return mp_const_none;
125141
}
@@ -128,7 +144,8 @@ mp_obj_t common_hal_usb_core_device_get_product(usb_core_device_obj_t *self) {
128144

129145
mp_obj_t common_hal_usb_core_device_get_manufacturer(usb_core_device_obj_t *self) {
130146
uint16_t temp_buf[127];
131-
if (!tuh_descriptor_get_manufacturer_string(self->device_number, 0, temp_buf, MP_ARRAY_SIZE(temp_buf), _transfer_done_cb, 0) ||
147+
_get_langid(self);
148+
if (!tuh_descriptor_get_manufacturer_string(self->device_number, self->first_langid, temp_buf, sizeof(temp_buf), _transfer_done_cb, 0) ||
132149
!_wait_for_callback()) {
133150
return mp_const_none;
134151
}

shared-module/usb/core/Device.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ typedef struct {
3535
uint8_t configuration_index; // not bConfigurationValue
3636
uint8_t *configuration_descriptor; // Contains the length of the all descriptors.
3737
uint8_t open_endpoints[8];
38+
uint16_t first_langid;
3839
} usb_core_device_obj_t;
3940

4041
#endif // MICROPY_INCLUDED_SHARED_MODULE_USB_CORE_DEVICE_H

tests/circuitpython-manual/usb/basic_keyboard.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import array
22
import usb.core
33
import sys
4+
import time
45

56
# This is a WASD Code Keyboard with a generic controller in it.
67
USB_VID = 0x04D9
78
USB_PID = 0x0169
89
# This is ordered by bit position.
910
MODIFIERS = []
1011

11-
device = usb.core.find(idVendor=USB_VID, idProduct=USB_PID)
12+
device = None
13+
while device is None:
14+
device = usb.core.find(idVendor=USB_VID, idProduct=USB_PID)
15+
time.sleep(0.1)
1216

13-
print(device.manufacturer, device.product)
17+
device.set_configuration()
18+
19+
print(device.manufacturer, device.product, device.serial_number)
1420

1521
# Test to see if the kernel is using the device and detach it.
1622
if device.is_kernel_driver_active(0):

0 commit comments

Comments
 (0)
0