Files
JoyD/ESP32/my_usb_project/rust_app/src/lib.rs

75 lines
1.7 KiB
Rust
Raw Normal View History

//! Rust application for ESP32-S3
//!
//! This module provides the main Rust application logic
//! that interacts with the USB HID interface implemented in C/TinyUSB.
#![no_std]
use esp_backtrace as _;
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {
2026-04-01 11:39:33 +08:00
core::hint::spin_loop();
}
}
// HID 键码常量
const HID_KEY_A: u8 = 0x04;
const REPORT_ID_KEYBOARD: u8 = 1;
const PD_MS_TO_TICKS: u32 = 1;
// FFI 函数声明
extern "C" {
fn rust_is_usb_mounted() -> bool;
fn rust_send_keyboard_report(report_id: u8, modifier: u8, keycode: *const u8);
fn rust_vTaskDelay(xTicksToDelay: u32);
}
#[no_mangle]
extern "C" fn rust_app_main() {
2026-04-01 13:57:22 +08:00
// 初始化代码
send_a_key();
2026-04-01 13:57:22 +08:00
return;
}
#[export_name = "rust_usb_callback"]
2026-04-01 11:39:33 +08:00
pub unsafe extern "C" fn usb_callback(_event: u32) {
}
/// 发送 A 键的按键事件
fn send_a_key() {
// 等待 USB 设备挂载
let mut mounted = false;
for _ in 0..10 {
mounted = unsafe {
rust_is_usb_mounted()
};
if mounted {
break;
}
// 等待 100ms
unsafe {
rust_vTaskDelay(100 * PD_MS_TO_TICKS);
}
}
if mounted {
// 发送 A 键按下事件
let keycode = [HID_KEY_A, 0, 0, 0, 0, 0];
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
// 等待 50ms
unsafe {
rust_vTaskDelay(50 * PD_MS_TO_TICKS);
}
// 发送 A 键释放事件
let keycode = [0, 0, 0, 0, 0, 0];
unsafe {
rust_send_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode.as_ptr());
}
}
2026-04-01 11:39:33 +08:00
}