0

我正在尝试使用具有 7-14 个模拟输入的 MSP430 模拟 USB-HID 游戏手柄/控制器,但我无法为我的自定义 USB-HID 设备获取正确的描述符。

我在网上看到了这段代码:https ://github.com/TI-FIRST/MSP430-Gamepad ,它非常适合让 MSP430 启动并作为只有 8 个模拟输入的游戏手柄运行。

main.c 文件包含更改报告结构的说明:

  • 此示例用作主机上的游戏手柄。游戏手柄具有 HID 报告,如中所述
  • descriptors.c 中的 report_desc_HID0 变量。请注意,如果此报告结构是
  • 更改然后需要更新以下长度 -
    1. #define report_desc_size_HID0 in descriptors.h 需要更新为描述符大小
    1. report_desc_size 和 report_len_input 不需要在 descriptors.c 中更新
  • 因为这个演示将枚举 18 字节的输入报告和 2 字节的输出报告
  • USB_gamepad.h 中描述的游戏手柄的输入和输出报告结构
  • 输入报告用于报告 ADC 值和按钮 (GPIO) 的状态
  • 输出报告用于设置/重置指标(GPIO)

descriptors.c 文件中当前的描述符是:

UsagePage(USB_HID_GENERIC_DESKTOP),
Usage(USB_HID_JOYSTICK),
Collection(USB_HID_APPLICATION),
//
// The axis for the controller.
//
UsagePage(USB_HID_GENERIC_DESKTOP),
Usage (USB_HID_POINTER),
Collection (USB_HID_PHYSICAL),

    //
    // The X, Y and Z values which are specified as 8-bit absolute
    // position values.
    //
    Usage (USB_HID_X),
    Usage (USB_HID_Y),
    Usage (USB_HID_Z),
    Usage (USB_HID_RX),
    Usage (USB_HID_RY),
    Usage (USB_HID_RZ),
    Usage (USB_HID_SLIDER),
    Usage (USB_HID_DIAL),
    //
    // 8 16-bit absolute values.
    //
    ReportSize(16),
    ReportCount(8),
    Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
          USB_HID_INPUT_ABS),

    //
    // Max 32 buttons.
    //
    UsagePage(USB_HID_BUTTONS),
    UsageMinimum(1),
    UsageMaximum(NUM_BUTTONS),
    LogicalMinimum(0),
    LogicalMaximum(1),
    PhysicalMinimum(0),
    PhysicalMaximum(1),

    //
    // 8 - 1 bit values for the buttons.
    //
    ReportSize(1),
    ReportCount(32),
    Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
          USB_HID_INPUT_ABS),

     //
     // Max 16 indicator bits
     //
     UsagePage(USB_HID_BUTTONS),
     UsageMinimum(1),
     UsageMaximum(NUM_INDICATORS),
     LogicalMinimum(0),
     LogicalMaximum(1),
     PhysicalMinimum(0),
     PhysicalMaximum(1),

     //
     // 8 - 1 bit values for the leds.
     //
     ReportSize(1),
     ReportCount(16),
     Output(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
           USB_HID_INPUT_ABS),

EndCollection,
EndCollection

我想将其更改为 14 个 16 位模拟输入,如下所示:

UsagePage(USB_HID_GENERIC_DESKTOP),
Usage(USB_HID_JOYSTICK),
Collection(USB_HID_APPLICATION),
//
// The axis for the controller.
//
UsagePage(USB_HID_GENERIC_DESKTOP),
Usage (USB_HID_POINTER),
Collection (USB_HID_PHYSICAL),

    //
    // The X, Y and Z values which are specified as 8-bit absolute
    // position values.
    //
    Usage (USB_HID_X),
    Usage (USB_HID_Y),
    Usage (USB_HID_Z),
    Usage (USB_HID_RX),
    Usage (USB_HID_RY),
    Usage (USB_HID_RZ),
    Usage (USB_HID_SLIDER),
    Usage (USB_HID_DIAL),
    Usage (USB_HID_VX),
    Usage (USB_HID_VY),
    Usage (USB_HID_VZ),
    Usage (USB_HID_VRX),
    Usage (USB_HID_VRY),
    Usage (USB_HID_VRZ),
    //
    // 8 16-bit absolute values.
    //
    ReportSize(16),
    ReportCount(14),
    Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
          USB_HID_INPUT_ABS),

    //
    // Max 32 buttons.
    //
    UsagePage(USB_HID_BUTTONS),
    UsageMinimum(1),
    UsageMaximum(6),
    LogicalMinimum(0),
    LogicalMaximum(1),
    PhysicalMinimum(0),
    PhysicalMaximum(1),

    //
    // 8 - 1 bit values for the buttons.
    //
    ReportSize(1),
    ReportCount(32),
    Input(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
          USB_HID_INPUT_ABS),

     //
     // Max 16 indicator bits
     //
     UsagePage(USB_HID_BUTTONS),
     UsageMinimum(1),
     UsageMaximum(6),
     LogicalMinimum(0),
     LogicalMaximum(1),
     PhysicalMinimum(0),
     PhysicalMaximum(1),

     //
     // 8 - 1 bit values for the leds.
     //
     ReportSize(1),
     ReportCount(16),
     Output(USB_HID_INPUT_DATA | USB_HID_INPUT_VARIABLE |
           USB_HID_INPUT_ABS),

EndCollection,
EndCollection

但是,我无法弄清楚如何计算描述符的长度/大小/字节。我尝试通过 USB-HID 规范(HID 1.11 的设备类定义 | USB-IF),其中指出项目具有字节前缀,但我无法真正弄清楚要计算哪些项目以及它们如何相加。抱歉,我对 USB 非常缺乏经验。

是否有人能够查看代码,并让我知道我需要在描述符文件中的 report_desc_size、report_len_input 中需要哪些值,以及我需要更改的任何其他内容,以扩展此代码的 14 个 16 位模拟输入的功能。

PS 要复制并查看正常工作的游戏手柄,只需将代码上传到开发工具包并在 Windows 上搜索“设置 USB 游戏控制器”,如果一切正常并且报告被接受,它应该将其识别为游戏手柄。

4

1 回答 1

0

报告描述符的大小是sizeof(report_desc_HID0)。为方便起见,我建议重构代码,以便在编译时计算描述符长度,而不是对其进行硬编码。

您正在使用宏来构造描述符,并且每个宏都会添加固定数量的字节。您添加了六个新Usage项目,每个项目扩展为两个字节:

#define Usage(ui8Value)          0x09, ((ui8Value) & 0xff)

如果原始描述符是 80 字节,我猜新描述符大小是 92 字节。

于 2021-08-02T19:56:49.080 回答