#include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" #include "tinyusb.h" #include "tusb.h" #include "rust_app_wrapper.h" static const char *TAG = "USB"; #define REPORT_ID_KEYBOARD 1 #define REPORT_ID_MOUSE 2 #define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN) #define USB_VID 0x30D8 #define USB_PID 0x50A6 #define USB_BCD 0x0200 static tusb_desc_device_t const desc_device = { .bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, .bcdUSB = USB_BCD, .bDeviceClass = 0x00, .bDeviceSubClass = 0x00, .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, .idVendor = USB_VID, .idProduct = USB_PID, .bcdDevice = 0x0100, .iManufacturer = 0x01, .iProduct = 0x02, .iSerialNumber = 0x03, .bNumConfigurations = 0x01 }; uint8_t const desc_hid_report[] = { TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD)), TUD_HID_REPORT_DESC_MOUSE(HID_REPORT_ID(REPORT_ID_MOUSE)) }; uint8_t const * tud_hid_descriptor_report_cb(uint8_t instance) { (void) instance; return desc_hid_report; } static char const *hid_string_descriptor[] = { (char[]){0x09, 0x04}, "JoyD", "Virtual Keyboard Mouse", "123456", }; enum { ITF_NUM_HID, ITF_NUM_TOTAL }; #define EPNUM_HID 0x81 static uint8_t const hid_configuration_descriptor[] = { TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100), TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 10) }; uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { (void) instance; (void) report_id; (void) report_type; (void) buffer; (void) reqlen; return 0; } void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { (void) instance; (void) report_id; (void) report_type; (void) buffer; (void) bufsize; } void app_main(void) { ESP_LOGI(TAG, "USB 初始化"); const tinyusb_config_t tusb_cfg = { .port = TINYUSB_PORT_FULL_SPEED_0, .phy = { .skip_setup = false, .self_powered = false, .vbus_monitor_io = 0, }, .task = { .size = 3500, .priority = 14, .xCoreID = 0, }, .descriptor = { .device = &desc_device, .qualifier = NULL, .string = hid_string_descriptor, .string_count = sizeof(hid_string_descriptor) / sizeof(hid_string_descriptor[0]), .full_speed_config = hid_configuration_descriptor, .high_speed_config = NULL, }, .event_cb = NULL, .event_arg = NULL, }; ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg)); ESP_LOGI(TAG, "✅ USB HID 设备启动成功"); ESP_LOGI(TAG, "启动 Rust 应用..."); rust_app_wrapper_init(); while (1) { vTaskDelay(1000 / portTICK_PERIOD_MS); ESP_LOGI(TAG, "USB 设备运行中..."); } }