实现键盘动作

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

@@ -1 +1 @@
ac6c4f81e7cb42b3e7774330b11a3e4f D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/my_usb_project.bin
70645470755440fd6ae78c81beea77a9 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/my_usb_project.bin

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
708a7c8bf0dca8daf952a8943c85d5d1e5319e35
b69e7f6b153cff3c1f6aad0cae7efe2bdb1139ef

View File

@@ -118,3 +118,61 @@
10570 10751 7973431402851307 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
28 254 7973988033708213 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
28 254 7973988033708213 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 76 7973996737498280 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 76 7973996737498280 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 79 7974001867544917 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 79 7974001867544917 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 70 7974003513511657 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 70 7974003513511657 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 82 7974016319736828 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 82 7974016319736828 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 82 7974018121033601 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 82 7974018121033601 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 90 7974023189221902 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 90 7974023189221902 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
34 204 7974039229823010 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
34 204 7974039229823010 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 118 7974040993249886 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 118 7974040993249886 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
11 69 7974044999538966 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
11 69 7974044999538966 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 152 7974046565208720 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 152 7974046565208720 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 73 7974059640883965 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 73 7974059640883965 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 98 7974060035915483 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 98 7974060035915483 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 94 7974080945077153 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 94 7974080945077153 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 86 7974081344490856 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 86 7974081344490856 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 171 7974086255712488 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 171 7974086255712488 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
31 117 7974087271807394 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
31 117 7974087271807394 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
50 360 7974092642414257 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
50 360 7974092642414257 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 105 7974110211908537 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
14 105 7974110211908537 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 135 7974110631094295 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 135 7974110631094295 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 73 7974114461438477 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
12 73 7974114461438477 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 124 7974115243068263 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
24 124 7974115243068263 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
19 160 7974117314985364 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
19 160 7974117314985364 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
20 167 7974119659123756 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
20 167 7974119659123756 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
26 151 7974120714982095 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
26 151 7974120714982095 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
15 109 7974121550145057 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
15 109 7974121550145057 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 77 7974122619730602 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
13 77 7974122619730602 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 72 7974123750823476 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
10 72 7974123750823476 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 91 7974139704553387 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
23 91 7974139704553387 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
17 116 7974140497374632 esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4
17 116 7974140497374632 D:/Projects/trunk/JoyD/ESP32/my_usb_project/build/bootloader/esp-idf/esptool_py/CMakeFiles/bootloader_check_size 3e73059819fce7a4

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,7 @@
{
"version": "1.2",
"project_name": "my_usb_project",
"project_version": "708a7c8-dirty",
"project_version": "b69e7f6-dirty",
"project_path": "D:/Projects/trunk/JoyD/ESP32/my_usb_project",
"idf_path": "D:/DiskC/ProgramFiles/Espressif/frameworks/esp-idf-v5.2.6",
"build_dir": "D:/Projects/trunk/JoyD/ESP32/my_usb_project/build",

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++;
}
}
}

View File

@@ -32,28 +32,22 @@ extern "C" {
/// 日志函数
fn log_info(message: &'static str) {
// 转换 Rust 静态字符串为 C 字符串
let tag = b"RustApp\0";
// 直接使用静态字符串的指针,确保它在整个程序生命周期内有效
// 注意Rust 的字符串字面量已经以 null 结尾
let msg_ptr = message.as_ptr();
let tag = b"RustApp\0";
unsafe {
rust_esp_log_i(tag.as_ptr(), msg_ptr);
rust_esp_log_i(tag.as_ptr(), message.as_ptr());
}
}
#[no_mangle]
extern "C" fn rust_app_main() {
extern "C" fn rust_app_main() -> !{
// 初始化代码 - 添加延迟确保系统稳定
unsafe {
rust_vTaskDelay(100); // 等待 1 秒让系统稳定
}
log_info("========================");
log_info("Rust app started");
log_info("========================");
log_info("========================\0");
log_info("Rust app started\0");
log_info("========================\0");
// 等待 USB 挂载成功
wait_usb_mounted();
@@ -62,13 +56,13 @@ extern "C" fn rust_app_main() {
loop {
// 每 5 秒 (500 ticks @ 10ms/tick) 按下一个随机键
if tick_count % 500 == 0 {
log_info("Sending random key...");
log_info("Sending random key...\0");
send_random_key();
}
// 每 6 秒 (600 ticks @ 10ms/tick) 随机移动一下鼠标
if tick_count % 600 == 0 {
log_info("Sending random mouse move...");
log_info("Sending random mouse move...\0");
send_random_mouse_move();
}
@@ -87,8 +81,8 @@ extern "C" fn rust_app_main() {
/// 等待 USB 挂载成功
fn wait_usb_mounted() {
log_info("Waiting for USB to mount...");
log_info("Please connect USB OTG cable to host");
log_info("Waiting for USB to mount...\0");
log_info("Please connect USB OTG cable to host\0");
let mut retry_count = 0;
loop {
@@ -97,13 +91,13 @@ fn wait_usb_mounted() {
};
if mounted {
log_info("USB mounted successfully!");
log_info("USB mounted successfully!\0");
break;
}
retry_count += 1;
if retry_count % 50 == 0 { // 每 5 秒输出一次
log_info("Still waiting for USB connection...");
log_info("Still waiting for USB connection...\0");
}
// 喂看门狗,防止复位
@@ -126,7 +120,7 @@ fn send_random_key() {
};
if !mounted {
log_info("USB not mounted, skipping key press");
log_info("USB not mounted, skipping key press\0");
return;
}
@@ -136,13 +130,13 @@ fn send_random_key() {
// 发送随机键按下事件
let keycode = [random_key, 0, 0, 0, 0, 0];
log_info("Sending key press event");
log_info("Sending key press event\0");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
// 等待 50ms (5 ticks @ 10ms/tick)
log_info("Waiting 50ms...");
log_info("Waiting 50ms...\0");
unsafe {
rust_vTaskDelay(5);
}
@@ -153,13 +147,13 @@ fn send_random_key() {
};
if !mounted {
log_info("USB not mounted, skipping key release");
log_info("USB not mounted, skipping key release\0");
return;
}
// 发送随机键释放事件
let keycode = [0, 0, 0, 0, 0, 0];
log_info("Sending key release event");
log_info("Sending key release event\0");
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
@@ -167,22 +161,12 @@ fn send_random_key() {
/// 发送随机鼠标移动事件
fn send_random_mouse_move() {
// 检查 USB 是否仍然挂载
let mounted = unsafe {
rust_is_usb_mounted()
};
if !mounted {
log_info("USB not mounted, skipping mouse move");
return;
}
// 生成随机的鼠标移动距离 (-10 到 10 之间)
let random_x = (get_random_u32() % 21) as i8 - 10;
let random_y = (get_random_u32() % 21) as i8 - 10;
// 发送鼠标移动事件
log_info("Sending mouse move event");
log_info("Sending mouse move event\0");
unsafe {
rust_send_mouse_report(REPORT_ID_MOUSE, 0, random_x, random_y, 0, 0);
}