前言:
最近想使用 esp32 系列的芯片实现 HID 设备(如键盘、鼠标)的模拟,但是使用 PlatformIO 平台进行开发的过程中遇到了一些问题,下面对其进行记录和总结。

环境配置

硬件

  • esp32 devkit 开发板,芯片型号 ESP32-D0WD-V3

Platform IO 配置

1
2
3
4
5
6
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps = adafruit/Adafruit TinyUSB Library@^3.7.2

添加 TinyUSB 库后编译 TinyUSB 例程报错

1
2
3
4
5
6
7
8
9
10
11
src/main.cpp:23:5: error: 'TUD_HID_REPORT_DESC_KEYBOARD' was not declared in this scope
TUD_HID_REPORT_DESC_KEYBOARD()};
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.cpp:23:5: note: suggested alternative: 'HID_USAGE_DESKTOP_KEYBOARD'
TUD_HID_REPORT_DESC_KEYBOARD()};
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
HID_USAGE_DESKTOP_KEYBOARD
src/main.cpp:27:1: error: 'Adafruit_USBD_HID' does not name a type; did you mean 'Adafruit_USBH_CDC'?
Adafruit_USBD_HID usb_hid;
^~~~~~~~~~~~~~~~~
Adafruit_USBH_CDC

原因

ESP32 Devkit 开发板板载芯片为 esp32-D0WD 系列芯片,不支持 USB 模拟 HID 设备,只能支持蓝牙模拟 HID 设备,ESP32-S2 和 ESP32-S3 支持 USB 模拟 HID 设备

因此 ESP32 Devkit 开发板不支持直接模拟 USB 的 HID 设备,所以该开发板相关头文件中没有定义CONFIG_USB_OTG_SUPPORTED,导致在 TinyUSB 库的头文件 tusb_config_esp32.h 中只能定义CFG_TUD_ENABLED宏为 0,这就导致在 Adafruit_TinyUSB.h 中无法包含 HID 相关头文件,从而报错


解决办法

修改 esp32dev 开发板为支持直接通过 USB 模拟 HID 设备的ESP32-S2或S3开发板后,相关的宏 CFG_TUD_ENABLE 为 1,编译就没问题了,如下面图片所示(但是这样需要使用与之匹配的开发板才行,否则会存在问题;不然只能额外采用类似 CH9329 之类的串口转 HID 设备的芯片模块实现 USB 模拟 HID 设备,再不然只能采用蓝牙连接模拟实现 HID 设备)