Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 107 additions & 22 deletions examples/host/bare_api/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ int main(void)
board_init();

printf("TinyUSB Host HID Controller Example\r\n");
printf("Note: Events only displayed for explictly supported controllers\r\n");

tusb_init();

while (1)
Expand All @@ -64,10 +62,74 @@ int main(void)
// TinyUSB Callbacks
//--------------------------------------------------------------------+

uint8_t usb_buf[256] TU_ATTR_ALIGNED(4);
// English
#define LANGUAGE_ID 0x0409

//uint8_t usb_buf[256] TU_ATTR_ALIGNED(4);
tusb_desc_device_t desc_device;

static volatile xfer_result_t _get_string_result;

static bool _transfer_done_cb(uint8_t daddr, tusb_control_request_t const *request, xfer_result_t result) {
(void)daddr;
(void)request;
_get_string_result = result;
return true;
}

static void _convert_utf16le_to_utf8(const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) {
// TODO: Check for runover.
(void)utf8_len;
// Get the UTF-16 length out of the data itself.

for (size_t i = 0; i < utf16_len; i++) {
uint16_t chr = utf16[i];
if (chr < 0x80) {
*utf8++ = chr & 0xff;
} else if (chr < 0x800) {
*utf8++ = (uint8_t)(0xC0 | (chr >> 6 & 0x1F));
*utf8++ = (uint8_t)(0x80 | (chr >> 0 & 0x3F));
} else {
// TODO: Verify surrogate.
*utf8++ = (uint8_t)(0xE0 | (chr >> 12 & 0x0F));
*utf8++ = (uint8_t)(0x80 | (chr >> 6 & 0x3F));
*utf8++ = (uint8_t)(0x80 | (chr >> 0 & 0x3F));
}
// TODO: Handle UTF-16 code points that take two entries.
}
}

// Count how many bytes a utf-16-le encoded string will take in utf-8.
static int _count_utf8_bytes(const uint16_t *buf, size_t len) {
size_t total_bytes = 0;
for (size_t i = 0; i < len; i++) {
uint16_t chr = buf[i];
if (chr < 0x80) {
total_bytes += 1;
} else if (chr < 0x800) {
total_bytes += 2;
} else {
total_bytes += 3;
}
// TODO: Handle UTF-16 code points that take two entries.
}
return total_bytes;
}

static void _wait_and_convert(uint16_t *temp_buf, size_t buf_len) {
while (_get_string_result == 0xff) {
tuh_task();
}
if (_get_string_result != XFER_RESULT_SUCCESS) {
temp_buf[0] = 0;
return;
}
size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t);
size_t utf8_len = _count_utf8_bytes(temp_buf + 1, utf16_len);
_convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, sizeof(uint16_t) * buf_len);
((uint8_t*) temp_buf)[utf8_len] = '\0';
}

bool print_device_descriptor(uint8_t daddr, tusb_control_request_t const * request, xfer_result_t result)
{
(void) request;
Expand All @@ -78,26 +140,49 @@ bool print_device_descriptor(uint8_t daddr, tusb_control_request_t const * reque
return false;
}

printf("Rhport %u Device %u: ID %04x:%04x\r\n", 0, daddr, desc_device.idVendor, desc_device.idProduct);
printf("Device %u: ID %04x:%04x\r\n", daddr, desc_device.idVendor, desc_device.idProduct);
printf("Device Descriptor:\r\n");
printf(" bLength %u\r\n", desc_device.bLength);
printf(" bDescriptorType %u\r\n", desc_device.bDescriptorType);
printf(" bcdUSB %04x\r\n", desc_device.bcdUSB);

printf(" bDeviceClass %u\r\n", desc_device.bDeviceClass);
printf(" bDeviceSubClass %u\r\n", desc_device.bDeviceSubClass);
printf(" bDeviceProtocol %u\r\n", desc_device.bDeviceProtocol);
printf(" bMaxPacketSize0 %u\r\n", desc_device.bMaxPacketSize0);

printf(" idVendor 0x%04x\r\n", desc_device.idVendor);
printf(" idProduct 0x%04x\r\n", desc_device.idProduct);
printf(" bcdDevice %04x\r\n", desc_device.bcdDevice);

printf(" iManufacturer %u\r\n", desc_device.iManufacturer);
printf(" iProduct %u\r\n", desc_device.iProduct);
printf(" iSerialNumber %u\r\n", desc_device.iSerialNumber);
printf(" bLength %u\r\n" , desc_device.bLength);
printf(" bDescriptorType %u\r\n" , desc_device.bDescriptorType);
printf(" bcdUSB %04x\r\n" , desc_device.bcdUSB);
printf(" bDeviceClass %u\r\n" , desc_device.bDeviceClass);
printf(" bDeviceSubClass %u\r\n" , desc_device.bDeviceSubClass);
printf(" bDeviceProtocol %u\r\n" , desc_device.bDeviceProtocol);
printf(" bMaxPacketSize0 %u\r\n" , desc_device.bMaxPacketSize0);
printf(" idVendor 0x%04x\r\n" , desc_device.idVendor);
printf(" idProduct 0x%04x\r\n" , desc_device.idProduct);
printf(" bcdDevice %04x\r\n" , desc_device.bcdDevice);

_get_string_result = 0xff;
uint16_t temp_buf[128];

printf(" iManufacturer %u " , desc_device.iManufacturer);
temp_buf[0] = 0;
if (tuh_descriptor_get_manufacturer_string(daddr, LANGUAGE_ID, temp_buf, TU_ARRAY_SIZE(temp_buf), _transfer_done_cb)) {
_wait_and_convert(temp_buf, TU_ARRAY_SIZE(temp_buf));
printf((const char*) temp_buf);
}
printf("\r\n");

printf(" iProduct %u " , desc_device.iProduct);
_get_string_result = 0xff;
temp_buf[0] = 0;
if (tuh_descriptor_get_product_string(daddr, LANGUAGE_ID, temp_buf, TU_ARRAY_SIZE(temp_buf), _transfer_done_cb)) {
_wait_and_convert(temp_buf, TU_ARRAY_SIZE(temp_buf));
printf((const char*) temp_buf);
}
printf("\r\n");

printf(" iSerialNumber %u " , desc_device.iSerialNumber);
_get_string_result = 0xff;
temp_buf[0] = 0;
if (tuh_descriptor_get_serial_string(daddr, LANGUAGE_ID, temp_buf, TU_ARRAY_SIZE(temp_buf), _transfer_done_cb)) {
_wait_and_convert(temp_buf, TU_ARRAY_SIZE(temp_buf));
printf((const char*) temp_buf);
}
printf("\r\n");

printf(" bNumConfigurations %u\r\n", desc_device.bNumConfigurations);
printf(" bNumConfigurations %u\r\n" , desc_device.bNumConfigurations);

return true;
}
Expand All @@ -107,7 +192,7 @@ void tuh_mount_cb (uint8_t daddr)
{
printf("Device attached, address = %d\r\n", daddr);

// get device descriptor
// Get Device Descriptor
tuh_descriptor_get_device(daddr, &desc_device, 18, print_device_descriptor);
}

Expand Down
27 changes: 0 additions & 27 deletions examples/host/device_info/CMakeLists.txt

This file was deleted.

28 changes: 0 additions & 28 deletions examples/host/device_info/Makefile

This file was deleted.

9 changes: 0 additions & 9 deletions examples/host/device_info/only.txt

This file was deleted.

Loading