我正在尝试使用具有 7-14 个模拟输入的 MSP430 模拟 USB-HID 游戏手柄/控制器,但我无法为我的自定义 USB-HID 设备获取正确的描述符。
我在网上看到了这个代码:https://github.com/TI-FIRST/MSP430-Gamepad,它让 MSP430 启动并作为一个只有 8 个模拟输入的游戏手柄运行。
main.c 文件包含更改报告结构的说明:
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 位模拟输入。
附言要复制并查看正在运行的游戏手柄,只需将代码上传到开发工具包并在 Windows 上搜索“设置 USB 游戏控制器”,如果一切正常并且报告被接受,它应该将其识别为游戏手柄。
答案 0 :(得分:0)
报告描述符的大小为 sizeof(report_desc_HID0)
。为方便起见,我建议重构代码,以便在编译时计算描述符长度,而不是对其进行硬编码。
您使用宏来构造描述符,并且每个宏添加固定数量的字节。您添加了六个新的 Usage
项,每个项都扩展为两个字节:
#define Usage(ui8Value) 0x09, ((ui8Value) & 0xff)
如果原始描述符是 80 字节,我猜新描述符的大小是 92 字节。