#include #include "pico/unique_id.h" #include "tusb.h" constexpr uint16_t USB_VID = 0x2E8A; constexpr uint16_t USB_PID = 0x000A; static constexpr tusb_desc_device_t desc_device = { sizeof(tusb_desc_device_t), TUSB_DESC_DEVICE, 0x0200, TUSB_CLASS_MISC, MISC_SUBCLASS_COMMON, MISC_PROTOCOL_IAD, CFG_TUD_ENDPOINT0_SIZE, USB_VID, USB_PID, 0x0100, 1, 2, 3, 1, }; enum { ITF_NUM_CDC, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL }; constexpr uint8_t EPNUM_CDC_NOTIF = 0x81; constexpr uint8_t EPNUM_CDC_OUT = 0x02; constexpr uint8_t EPNUM_CDC_IN = 0x82; constexpr uint16_t CONFIG_TOTAL_LEN = TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN; static uint8_t const desc_configuration[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 0, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64), }; static constexpr const char* string_desc[] = { "\x09\x04", "picomap", "picomap", nullptr, }; static uint16_t desc_str_buf[33]; extern "C" { uint8_t const* tud_descriptor_device_cb(void) { return reinterpret_cast(&desc_device); } uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { return desc_configuration; } uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { uint8_t chr_count; if (index == 0) { memcpy(&desc_str_buf[1], string_desc[0], 2); chr_count = 1; } else if (index == 3) { pico_unique_board_id_t uid; pico_get_unique_board_id(&uid); chr_count = 0; for (int i = 0; i < 8; i++) { desc_str_buf[1 + chr_count++] = "0123456789ABCDEF"[uid.id[i] >> 4]; desc_str_buf[1 + chr_count++] = "0123456789ABCDEF"[uid.id[i] & 0xF]; } } else { if (index >= sizeof(string_desc) / sizeof(string_desc[0])) return nullptr; const char* str = string_desc[index]; if (!str) return nullptr; chr_count = strlen(str); if (chr_count > 31) chr_count = 31; for (uint8_t i = 0; i < chr_count; i++) desc_str_buf[1 + i] = str[i]; } desc_str_buf[0] = static_cast((TUSB_DESC_STRING << 8) | (2 * chr_count + 2)); return desc_str_buf; } } // extern "C"