c++ - HID 游戏 handle 报告描述符问题

标签 c++ usb hid descriptor

我正在开发一个适配器,它采用两个库并将发射器/ Controller 输入转换为 HID 输入(通过 PPM,但我认为这对这篇文章无关紧要)。我正在使用 Arduino,但在这里发帖是因为除非我有误解,否则我的问题出在 HID 报告描述符中,而不是我的 Arduino 代码。

我有一个示例描述符,如果我使用它就可以工作,工作的是这样的:

PROGMEM const char usbHidReportDescriptor[36] = {
0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
0x09, 0x05,                    // USAGE (Game Pad)
0xa1, 0x01,                    // COLLECTION (Application)
0xa1, 0x00,                    //   COLLECTION (Physical)
0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
0x09, 0x30,                    //     USAGE (X)
0x09, 0x31,                    //     USAGE (Y)
0x09, 0x32,                    //     USAGE (Z) rx
0x09, 0x35,                    //     USAGE (Rx) ry
0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)
0x46, 0xff, 0x00,              //     PHYSICAL_MAXIMUM (255)
0x15, 0x00,                    //     LOGICAL_MINIMUM (-127)
0x26, 0xff, 0x00,                    //     LOGICAL_MAXIMUM (127)
0x75, 0x08,                    //     REPORT_SIZE (8)
0x95, 0x04,                    //     REPORT_COUNT (4)
0x81, 0x02,                    //     INPUT (Data,Var,Abs)
0xc0,                          //   END_COLLECTION
0xc0                           // END_COLLECTION
};

第一个示例只有棍子,没有按钮,所以我尝试创建一个有按钮的描述符。我使用 HID 描述符工具生成的配置文件是这样的:

 PROGMEM const char usbHidReportDescriptor[46] = {
  0x05, 0x01,                   //USAGE_PAGE (Generic Desktop)
  0x09, 0x05,                   //USAGE (Game Pad)
  0xa1, 0x01,                   //COLLECTION (APPLICATION)
  0xa1, 0x00,                    //   COLLECTION (Physical)
  0x05, 0x09,                   //USAGE_PAGE (Button)
  0x19, 0x01,                   //USAGE_MINIMUM (Button1)
  0x29, 0x10,                   //USAGE_MAXIMUM (Button 16)
  0x15, 0x00,                   //LOGICAL_MINIMUM (0)
  0x25, 0x01,                   //LOGICAL_MAXIMUM(1)
  0x95, 0x10,                   //REPORT_COUNT (16)
  0x75, 0x01,                   //REPORT_SIZE (1)
  0x81, 0x02,                   //INPUT(Data, Var, Abs)
  0x05, 0x01,                   //USAGE_PAGE (Generic Desktop)
  0x09, 0x30,                   //USAGE (X)
  0x09, 0x31,                   //USAGE (Y)
  0x09, 0x32,                   //USAGE (Z)
  0x09, 0x33,                   //USAGE (Rx)
  0x15, 0x81,                   //LOGICAL_MINIMUM(-127)
  0x25, 0x7f,                   //LOGICAL_MAXIMUM(127)
  0x75, 0x08,                   //REPORT_SIZE(8)
  0x95, 0x04,                   //REPORT_COUNT(4)
  0x81, 0x02,                   //INPUT(Data,Var,Abs)
  0xc0,                     //END_Collection
  0xc0                      //END_Collection


};

当我编译它时,我没有收到错误,但在上传到设备后,我在设备配置文件中收到“此设备无法启动。(代码 10)”消息。这是目前我在测试中更改导致此问题的唯一内容。

如果您仍然觉得在 Arduino 部分问这个更好,我可以在那里发帖,但我认为这更多是我在描述符上做错了。

非常感谢任何人的时间和帮助!如果有更多信息有助于发布,请告诉我。

最佳答案

经过简单的认识后,问题得到了解决。刚刚在文件中查找:usbHidReportDescriptor,发现 usbconfig.h 文件中有一个长度定义需要调整。只是张贴这个以防有人遇到同样的问题!

关于c++ - HID 游戏 handle 报告描述符问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41147796/

相关文章:

android - 从 HID 设备接收 RFCOMM 输入

c++ - Windows Precision Touchpad 单击/点击事件是否通过 WM_INPUT 消息进行通信?如果没有,我如何获得它们?

c++ - 符号 (&) 在 .rc 文件中的含义

c++ - 为什么此代码不返回空矩阵?

c++ - 是什么可以导致SetupDiGetClassDevs不返回任何设备接口(interface)? (Windows,C++)

Android - 与 FTDI 芯片和 d2xx 驱动程序的 USB 通信

hid - 通过 HID OMNIKEY 5427 CK 向卡发送 APDU 命令

c++ - Borland C++ 在没有消息的情况下崩溃

c++ - 渲染 SketchUp 模型 API

android - 无法在 mac 上识别我的 android 设备