2026-03-31 11:04:43 +08:00
|
|
|
|
# USB 虚拟键鼠项目说明
|
|
|
|
|
|
|
2026-04-01 09:22:50 +08:00
|
|
|
|
## 项目概述
|
|
|
|
|
|
|
|
|
|
|
|
ESP32-S3 USB 复合设备项目,采用 C + Rust 混合编程:
|
|
|
|
|
|
- **USB 部分**:C + TinyUSB(稳定可靠)
|
|
|
|
|
|
- **应用逻辑**:Rust(通过 FFI 与 C 交互)
|
|
|
|
|
|
|
2026-03-31 11:04:43 +08:00
|
|
|
|
## 编译成功
|
|
|
|
|
|
|
|
|
|
|
|
项目已成功编译,生成的文件位于:
|
2026-04-01 09:22:50 +08:00
|
|
|
|
- `build/my_usb_project.bin` - 主程序固件
|
|
|
|
|
|
- `build/bootloader/bootloader.bin` - 引导程序
|
|
|
|
|
|
- `build/partition_table/partition-table.bin` - 分区表
|
|
|
|
|
|
|
|
|
|
|
|
### 编译步骤
|
|
|
|
|
|
|
|
|
|
|
|
1. 编译 Rust 库:
|
|
|
|
|
|
```batch
|
2026-04-01 15:10:28 +08:00
|
|
|
|
cargo.bat
|
2026-04-01 09:22:50 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. 编译 ESP-IDF 项目:
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd build
|
|
|
|
|
|
```
|
2026-03-31 11:04:43 +08:00
|
|
|
|
|
|
|
|
|
|
## 烧录到 ESP32-S3
|
|
|
|
|
|
|
|
|
|
|
|
使用以下命令烧录:
|
|
|
|
|
|
|
2026-04-01 09:22:50 +08:00
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd flash
|
2026-03-31 11:04:43 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
或者指定端口:
|
|
|
|
|
|
|
2026-04-01 09:22:50 +08:00
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd -p COM3 flash
|
2026-03-31 11:04:43 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-01 15:10:28 +08:00
|
|
|
|
### 擦除 flash
|
|
|
|
|
|
|
|
|
|
|
|
使用以下命令擦除整个 flash:
|
|
|
|
|
|
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd erase_flash
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
或者指定端口:
|
|
|
|
|
|
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd -p COM3 erase_flash
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-04-01 09:22:50 +08:00
|
|
|
|
## 调试与日志
|
|
|
|
|
|
|
|
|
|
|
|
### 串口监视器
|
|
|
|
|
|
|
|
|
|
|
|
烧录后启动串口监视器查看日志:
|
|
|
|
|
|
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd monitor
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
或者指定端口:
|
|
|
|
|
|
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd -p COM3 monitor
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 烧录并监视
|
|
|
|
|
|
|
|
|
|
|
|
一步完成烧录和监视:
|
|
|
|
|
|
|
|
|
|
|
|
```batch
|
|
|
|
|
|
idf.cmd flash monitor
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 退出监视器
|
|
|
|
|
|
|
|
|
|
|
|
按 `Ctrl+]` 退出串口监视器。
|
|
|
|
|
|
|
|
|
|
|
|
### 日志级别
|
|
|
|
|
|
|
|
|
|
|
|
在代码中使用 ESP_LOG 系列函数输出日志:
|
|
|
|
|
|
|
|
|
|
|
|
```c
|
|
|
|
|
|
ESP_LOGI(TAG, "This is an info message");
|
|
|
|
|
|
ESP_LOGW(TAG, "This is a warning");
|
|
|
|
|
|
ESP_LOGE(TAG, "This is an error");
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
默认日志级别可在 `sdkconfig` 中配置:`CONFIG_LOG_DEFAULT_LEVEL`
|
|
|
|
|
|
|
2026-03-31 11:04:43 +08:00
|
|
|
|
## 功能说明
|
|
|
|
|
|
|
|
|
|
|
|
当前实现的 USB 复合设备包含:
|
|
|
|
|
|
- ✅ USB 键盘 (HID)
|
|
|
|
|
|
- ✅ USB 鼠标 (HID)
|
|
|
|
|
|
- ✅ USB 虚拟 U盘 (MSC)
|
|
|
|
|
|
|
2026-04-01 09:22:50 +08:00
|
|
|
|
## 技术细节
|
|
|
|
|
|
|
|
|
|
|
|
### 链接器脚本修复
|
|
|
|
|
|
|
|
|
|
|
|
由于 Rust 库包含的 rodata 数据与 ESP-IDF 的 app desc 段冲突,需要修改链接器脚本 `build/esp-idf/esp_system/ld/sections.ld`,在 `.flash.appdesc` 段末尾添加 64KB 对齐:
|
|
|
|
|
|
|
|
|
|
|
|
```ld
|
|
|
|
|
|
.flash.appdesc : ALIGN(0x10)
|
|
|
|
|
|
{
|
|
|
|
|
|
_rodata_reserved_start = ABSOLUTE(.);
|
|
|
|
|
|
_rodata_start = ABSOLUTE(.);
|
|
|
|
|
|
*(.rodata_desc .rodata_desc.*)
|
|
|
|
|
|
*(.rodata_custom_desc .rodata_custom_desc.*)
|
|
|
|
|
|
/* Force to next 64KB boundary */
|
|
|
|
|
|
. = ALIGN(0x10000);
|
|
|
|
|
|
} >default_rodata_seg
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-31 11:04:43 +08:00
|
|
|
|
## 下一步开发
|
|
|
|
|
|
|
|
|
|
|
|
要实现具体的键盘/鼠标功能,需要:
|
|
|
|
|
|
|
|
|
|
|
|
1. **添加 HID 键盘报告描述符** - 在 `tusb_config.h` 中配置
|
|
|
|
|
|
2. **实现键盘事件处理** - 添加按键发送代码
|
|
|
|
|
|
3. **实现鼠标事件处理** - 添加鼠标移动/点击代码
|
|
|
|
|
|
4. **添加 USB CDC (串口)** - 用于调试输出
|
|
|
|
|
|
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
- 确保 ESP32-S3 开发板支持 USB OTG
|
|
|
|
|
|
- 连接 USB 线到 ESP32-S3 的 USB 微口
|
2026-04-01 09:22:50 +08:00
|
|
|
|
- 某些开发板可能需要配置 USB D+ 上拉电阻
|