启动时等待usb连接

This commit is contained in:
zqm
2026-04-09 08:55:43 +08:00
parent 708a7c8bf0
commit cd7d033e3e
45 changed files with 7843 additions and 11716 deletions

View File

@@ -1,9 +1,14 @@
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)
# rust_app 组件的 CMake 配置
# 注意rust_app_wrapper.c 已经在 main 组件中编译
# 这里只提供 Rust 静态库的链接
idf_component_register(
SRCS "rust_app_wrapper.c"
INCLUDE_DIRS "."
)
target_link_libraries(${COMPONENT_LIB} INTERFACE "-L${CMAKE_CURRENT_LIST_DIR} -lrust_app")
# 链接 Rust 静态库
set(RUST_LIB_PATH "${COMPONENT_DIR}/target/xtensa-esp32s3-none-elf/release-debug/librust_app.a")
message(STATUS "Rust library path: ${RUST_LIB_PATH}")
add_prebuilt_library(rust_app_lib "${RUST_LIB_PATH}")
target_link_libraries(${COMPONENT_LIB} INTERFACE rust_app_lib)

View File

@@ -2,6 +2,7 @@
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_task_wdt.h"
static const char* TAG = "RustApp";
@@ -9,14 +10,39 @@ extern void rust_app_main();
void rust_app_task(void* pvParameters) {
ESP_LOGI(TAG, "Rust application task started");
// 订阅看门狗,防止任务被复位
ESP_ERROR_CHECK(esp_task_wdt_add(NULL));
rust_app_main();
// 如果 rust_app_main 返回,记录错误并进入无限循环
ESP_LOGE(TAG, "Rust application task unexpectedly returned!");
while (1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
static TaskHandle_t rust_app_task_handle = NULL;
void rust_app_wrapper_init() {
// 使用静态变量确保函数只被调用一次
static bool initialized = false;
if (initialized) {
ESP_LOGI(TAG, "Rust application already initialized");
return;
}
initialized = true;
ESP_LOGI(TAG, "Initializing Rust application...");
// 创建一个新的任务来运行 Rust 应用
xTaskCreate(rust_app_task, "rust_app_task", 4096, NULL, 5, NULL);
// 增加栈大小到 16384 (16KB) 以防止栈溢出
BaseType_t result = xTaskCreate(rust_app_task, "rust_app_task", 16384, NULL, 5, &rust_app_task_handle);
ESP_LOGI(TAG, "Rust application task created");
if (result != pdPASS) {
ESP_LOGE(TAG, "Failed to create Rust application task!");
} else {
ESP_LOGI(TAG, "Rust application task created successfully");
}
}

View File

@@ -27,6 +27,7 @@ extern "C" {
fn rust_send_mouse_report(report_id: u8, buttons: u8, x: i8, y: i8, wheel: i8, pan: i8);
fn rust_vTaskDelay(xTicksToDelay: u32);
fn rust_esp_log_i(tag: *const u8, format: *const u8);
fn esp_task_wdt_reset();
}
/// 日志函数
@@ -45,27 +46,38 @@ fn log_info(message: &'static str) {
#[no_mangle]
extern "C" fn rust_app_main() {
// 初始化代码
// 初始化代码 - 添加延迟确保系统稳定
unsafe {
rust_vTaskDelay(100); // 等待 1 秒让系统稳定
}
log_info("========================");
log_info("Rust app started");
log_info("========================");
// 等待 USB 挂载成功
wait_usb_mounted();
let mut tick_count = 0;
loop {
// 每 5 秒 (500 ticks) 按下一个随机键
// 每 5 秒 (500 ticks @ 10ms/tick) 按下一个随机键
if tick_count % 500 == 0 {
log_info("Sending random key...");
send_random_key();
}
// 每 6 秒 (600 ticks) 随机移动一下鼠标
// 每 6 秒 (600 ticks @ 10ms/tick) 随机移动一下鼠标
if tick_count % 600 == 0 {
log_info("Sending random mouse move...");
send_random_mouse_move();
}
// 等待 10ms (1 tick)
// 喂看门狗
unsafe {
esp_task_wdt_reset();
}
// 等待 1 tick (10ms with default 100Hz config)
unsafe {
rust_vTaskDelay(1);
}
@@ -75,12 +87,10 @@ extern "C" fn rust_app_main() {
/// 等待 USB 挂载成功
fn wait_usb_mounted() {
// 等待 USB 设备挂载,最多等待 3 秒
const USB_MOUNT_TIMEOUT_TICKS: u32 = 300; // 300 ticks = 3 seconds
let mut elapsed_ticks = 0;
log_info("Waiting for USB to mount...");
log_info("Please connect USB OTG cable to host");
let mut retry_count = 0;
loop {
let mounted = unsafe {
rust_is_usb_mounted()
@@ -91,25 +101,23 @@ fn wait_usb_mounted() {
break;
}
// 检查是否超时
if elapsed_ticks >= USB_MOUNT_TIMEOUT_TICKS {
log_info("USB mount timeout!");
// 使用 panic! 而不是 unreachable_unchecked
panic!("USB init failed");
retry_count += 1;
if retry_count % 50 == 0 { // 每 5 秒输出一次
log_info("Still waiting for USB connection...");
}
// 等待 10ms (1 tick)
// 喂看门狗,防止复位
unsafe {
rust_vTaskDelay(1);
esp_task_wdt_reset();
}
// 等待 100ms (10 ticks @ 10ms/tick)
unsafe {
rust_vTaskDelay(10);
}
elapsed_ticks += 1;
}
}
#[export_name = "rust_usb_callback"]
pub unsafe extern "C" fn usb_callback(_event: u32) {
}
/// 发送 A-Z 随机键的按键事件
fn send_random_key() {
// 检查 USB 是否仍然挂载
@@ -133,8 +141,8 @@ fn send_random_key() {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
// 等待 50ms (50ms / 10ms per tick = 5 ticks)
log_info("Waiting for 50ms...");
// 等待 50ms (5 ticks @ 10ms/tick)
log_info("Waiting 50ms...");
unsafe {
rust_vTaskDelay(5);
}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
{"rustc":3242003800445299344,"features":"[]","declared_features":"[\"alloc\", \"defmt\", \"proc-macro-crate\", \"serde\", \"serde2\", \"std\"]","target":1807128325554185628,"profile":15418805393629537074,"path":14337773933917167578,"deps":[[17986376101325384488,"enumset_derive",false,17454149073838492720]],"local":[{"CheckDepInfo":{"dep_info":"release-debug\\.fingerprint\\enumset-16c786c7be4dcf6c\\dep-lib-enumset","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@@ -0,0 +1 @@
{"rustc":3242003800445299344,"features":"[\"build\"]","declared_features":"[\"build\", \"tui\"]","target":13174376735924574426,"profile":2225463790103693989,"path":3946995220284316586,"deps":[[826480799056633171,"document_features",false,7169950998350490057],[9614479274285663593,"serde_yaml",false,18371109490497812336],[13548984313718623784,"serde",false,18268308260177572816],[13886999610336354978,"esp_metadata_generated",false,10879114223408353606],[14342052867857712941,"somni_expr",false,4269927958521062561]],"local":[{"CheckDepInfo":{"dep_info":"release-debug\\.fingerprint\\esp-config-c58319ddc55d0db2\\dep-lib-esp_config","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}

View File

@@ -0,0 +1,14 @@
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\enumset-16c786c7be4dcf6c.d: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\macros.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\derive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\array.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\primitive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\set.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\traits.rs
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\libenumset-16c786c7be4dcf6c.rlib: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\macros.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\derive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\array.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\primitive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\set.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\traits.rs
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\libenumset-16c786c7be4dcf6c.rmeta: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\macros.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\derive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\array.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\primitive.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\set.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\traits.rs
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\lib.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\macros.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\derive.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\mod.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\array.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\repr\primitive.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\set.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\enumset-1.1.10\src\traits.rs:

View File

@@ -0,0 +1,12 @@
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\esp_config-c58319ddc55d0db2.d: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\markdown.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\validator.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\value.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\../README.md
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\libesp_config-c58319ddc55d0db2.rlib: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\markdown.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\validator.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\value.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\../README.md
D:\Projects\trunk\JoyD\ESP32\my_usb_project\rust_app\target\release-debug\deps\libesp_config-c58319ddc55d0db2.rmeta: D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\lib.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\mod.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\markdown.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\validator.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\value.rs D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\../README.md
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\lib.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\mod.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\markdown.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\validator.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\generate\value.rs:
D:\DiskC\ProgramData\Cargo\registry\src\index.crates.io-1949cf8c6b5b557f\esp-config-0.6.1\src\../README.md: