我试图模拟一个USB游戏垫/控制器使用MSP430与7-14模拟输入,但我有困难,为我的自定义USB设备正确的描述符。
我在网上看到了这段代码:https://github.com/TI-FIRST/MSP430-Gamepad,它很好地实现了MSP430的启动并作为一个游戏板运行,只有8个模拟输入。
C文件包含更改报表结构的说明:
更新
中更新
这个演示将枚举18字节的输入报告和2字节的输出报告( USB_gamepad.h
。
描述符.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 1.11 \USB-IF的设备类定义),它声明项目有一个字节前缀,但我无法真正弄清楚哪些项需要计数,以及它们是如何加起来的。对不起,但我在USB方面非常缺乏经验。
有人能看一下代码吗,让我知道我在report_desc_size中需要什么值,描述符文件中的report_len_input值,再加上我需要更改的任何东西,以扩展这段代码用于14个16位模拟输入的功能。
要复制和查看工作的游戏板,只需将代码上传到开发工具包中,并在Windows上搜索“设置USB游戏控制器”,如果一切正常运行且报告被接受,Windows就应该将其识别为游戏垫。
发布于 2021-08-02 19:56:49
报表描述符的大小为sizeof(report_desc_HID0)。为了方便起见,我建议对代码进行重构,以便在编译时计算描述符长度,而不是硬编码。
您正在使用宏来构造描述符,并且每个宏都添加了一个固定的字节数。您添加了六个新的Usage项,每个项扩展为两个字节:
#define Usage(ui8Value) 0x09, ((ui8Value) & 0xff)如果原来的描述符是80字节,我猜新描述符的大小是92字节。
https://stackoverflow.com/questions/68592610
复制相似问题