usb - 编写 USB 自定义 HID 报告描述符
问题描述
我需要使用 stm32 制作一个小型 USB 设备。我认为这很容易,但事实并非如此。
我从网上实现了一些示例,包括鼠标(使用两个电位计操纵杆)、键盘(不是只有 LED 的按键)和来自 github 的一些其他片段。但我完全误解了报告描述符是如何形成的。
我需要在 pc 和设备之间进行通信,其中 pc 向设备发送 1 位,设备发回 8 或 32 位数字(来自 ADC 的值)和一位变量。
现在我有这个代码:
/** Usb HID report descriptor. */
/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
/* USER CODE BEGIN 0 */
0x06, 0x00, 0xFF, // Usage Page (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x19, 0x01, // Usage Minimum
0x29, 0x40, // Usage Maximum
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
/* USER CODE END 0 */
0xC0 /* END_COLLECTION */
};
此代码允许我闪烁板上的 LED。但是当我尝试更改 USAGE_MINIMUM、USAGE_MAXIMUM、REPORT_SIZE 或 REPORT_COUNT 中的任何数字时,电脑无法识别设备,它会写入 Code:10。当我尝试删除一个 OUTPUT 部分时也会发生同样的情况。
解决方案
推荐阅读
- oracle - Oracle 接口 - Postgresql
- pandas - 在特定列中删除具有相同(和相邻)条目的 Pandas 数据框中的行
- django-viewflow - 带有自定义视图的 Django Viewflow - 启动不同的流程,具体取决于用户在第一个屏幕中的选择
- powershell - 在 powershell 中确定 Windows 商店应用程序是否具有或需要网络功能
- c# - 如何查看 Asp.Net Core SOAP 请求的内容
- javascript - TypeScript 联合类型不适用于 const 断言('as const')
- monitoring - windows 7上的pmi句柄问题
- time-series - 将多个时间序列放在一个 BigTable 表中是否可以避免热点?
- linux - 脚本:检查 /etc/shadow 的第 8 个字段
- c# - 服务结构参与者的静态类配置