实现键盘动作

This commit is contained in:
zqm
2026-04-09 13:10:24 +08:00
parent 9cd8e4081c
commit fe71dc7012
17 changed files with 11174 additions and 7215 deletions

View File

@@ -17,6 +17,12 @@ static const char *TAG = "USB";
#define USB_PID 0x50A6
#define USB_BCD 0x0200
enum {
ITF_NUM_KEYBOARD, // 0
ITF_NUM_MOUSE, // 1
ITF_NUM_TOTAL
};
static tusb_desc_device_t const desc_device =
{
.bLength = sizeof(tusb_desc_device_t),
@@ -35,40 +41,67 @@ static tusb_desc_device_t const desc_device =
.bNumConfigurations = 0x01
};
uint8_t const desc_hid_report[] =
{
TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD)),
// 独立键盘描述符
uint8_t const desc_hid_report_kb[] = {
TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(REPORT_ID_KEYBOARD))
};
// 独立鼠标描述符
uint8_t const desc_hid_report_mouse[] = {
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;
if (instance == ITF_NUM_KEYBOARD) {
return desc_hid_report_kb;
}
if (instance == ITF_NUM_MOUSE) {
return desc_hid_report_mouse;
}
return NULL;
}
static char const *hid_string_descriptor[] = {
(char[]){0x09, 0x04},
"久鼎智控",
"智控键鼠套装",
"1",
"HID 智控键盘",
"HID 智控鼠标",
};
enum {
ITF_NUM_KEYBOARD,
ITF_NUM_MOUSE,
ITF_NUM_TOTAL
(char[]){0x09, 0x04}, // 0: 语言ID
"久鼎智控", // 1: 厂商
"智控键鼠套装", // 2: 产品
"1", // 3: 序列号
"HID 智控键盘", // 4: 键盘接口
"HID 智控鼠标", // 5: 鼠标接口
};
#define EPNUM_KEYBOARD 0x81
#define EPNUM_MOUSE 0x82
// ==============================
// 🔥 这里是修复重点!!!
// ==============================
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_KEYBOARD, 4, HID_ITF_PROTOCOL_KEYBOARD, sizeof(desc_hid_report), EPNUM_KEYBOARD, CFG_TUD_HID_EP_BUFSIZE, 10),
TUD_HID_DESCRIPTOR(ITF_NUM_MOUSE, 5, HID_ITF_PROTOCOL_MOUSE, sizeof(desc_hid_report), EPNUM_MOUSE, CFG_TUD_HID_EP_BUFSIZE, 10)
// 键盘 HID 接口
TUD_HID_DESCRIPTOR(
ITF_NUM_KEYBOARD, // 接口号
4, // 字符串索引
0, // 协议 = 0必须
sizeof(desc_hid_report_kb),
EPNUM_KEYBOARD,
CFG_TUD_HID_EP_BUFSIZE,
10
),
// 鼠标 HID 接口
TUD_HID_DESCRIPTOR(
ITF_NUM_MOUSE, // 接口号
5, // 字符串索引
0, // 协议 = 0必须不能用 MOUSE 协议)
sizeof(desc_hid_report_mouse),
EPNUM_MOUSE,
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)
@@ -97,11 +130,16 @@ bool rust_is_usb_mounted() {
return mounted;
}
//====================================================================
// 键盘函数(不动)
//====================================================================
void rust_send_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t const* keycode) {
tud_hid_keyboard_report(report_id, modifier, keycode);
}
// 暴露鼠标报告函数给 Rust
//====================================================================
// 鼠标函数(正确 6 参数版)
//====================================================================
void rust_send_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t wheel, int8_t pan) {
tud_hid_mouse_report(report_id, buttons, x, y, wheel, pan);
}
@@ -136,7 +174,7 @@ void app_main(void)
.device = &desc_device,
.qualifier = NULL,
.string = hid_string_descriptor,
.string_count = sizeof(hid_string_descriptor) / sizeof(hid_string_descriptor[0]),
.string_count = sizeof(hid_string_descriptor)/sizeof(hid_string_descriptor[0]),
.full_speed_config = hid_configuration_descriptor,
.high_speed_config = NULL,
},
@@ -149,8 +187,7 @@ void app_main(void)
ESP_LOGI(TAG, "✅ USB HID 设备启动成功");
ESP_LOGI(TAG, "请连接 USB OTG 线到电脑");
// 暂时禁用 Rust 应用,先测试 USB 稳定性
// rust_app_wrapper_init();
rust_app_wrapper_init();
int count = 0;
bool last_mounted = false;
@@ -172,4 +209,4 @@ void app_main(void)
}
count++;
}
}
}