Usb LUFA XInput控制器终结点输入/输出不工作 简介:
我一直在尝试(到目前为止整整四天都没有成功)让我的Atmega32u4设备(ArduinoPro Micro)模拟Xbox控制器 它不需要假装它是Xbox控制器,但我需要与XInput驱动程序进行通信,因此模拟官方控制器似乎是最好的开始方式Usb LUFA XInput控制器终结点输入/输出不工作 简介:,usb,microcontroller,avr,atmega,xinput,Usb,Microcontroller,Avr,Atmega,Xinput,我一直在尝试(到目前为止整整四天都没有成功)让我的Atmega32u4设备(ArduinoPro Micro)模拟Xbox控制器 它不需要假装它是Xbox控制器,但我需要与XInput驱动程序进行通信,因此模拟官方控制器似乎是最好的开始方式 问题是: 当使用代码示例时,它正好让我半途而废。我的设备可以读取或写入设备驱动程序。但不是两者都有。让两者都发挥作用对我的项目至关重要 守则: 可以在XInputPadMicro(I)中找到设备/配置描述符 没有改变这些) 配置更改事件: 启用“OU
- 问题是:
- 守则:
#define JOYSTICK_EPADDR_IN (ENDPOINT_DIR_IN | 1)
#define JOYSTICK_EPADDR_OUT (ENDPOINT_DIR_OUT | 1)
void EVENT_USB_Device_ConfigurationChanged(void)
{
bool ConfigSuccess = true;
ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_EPADDR_IN, EP_TYPE_INTERRUPT, 20, 1);
//If I enable this, the "IN" Endpoint will stop sending data.
//ConfigSuccess &= Endpoint_ConfigureEndpoint(JOYSTICK_EPADDR_OUT, EP_TYPE_INTERRUPT, 8, 1);
}
USB控制请求事件:
void EVENT_USB_Device_ControlRequest(void)
{
/* Handle HID Class specific requests */
switch (USB_ControlRequest.bRequest)
{
case HID_REQ_GetReport:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{
Endpoint_ClearSETUP();
Endpoint_Write_Control_Stream_LE(&gamepad_state, 20);
Endpoint_ClearIN();
}
break;
case HID_REQ_SetReport:
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{
Endpoint_ClearSETUP();
Endpoint_Read_Control_Stream_LE(&RXData, 8);
Endpoint_ClearOUT();
}
break;
}
}
HID任务(每个周期调用):
我错过了什么重要的东西吗?也许是关于USB协议的内部工作原理?我在这里不知所措
void HID_Task(void)
{
/* Device must be connected and configured for the task to run */
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
Endpoint_SelectEndpoint(JOYSTICK_EPADDR_OUT);
if (Endpoint_IsOUTReceived())
{
toggle = !toggle;
SetLED(LED3, toggle);
Endpoint_Read_Stream_LE(&RXData, 8, NULL);
SetLED(LED1, RXData[3] > 0 || RXData[4] > 0);
Endpoint_ClearOUT();
}
/* Select the Joystick Report Endpoint */
Endpoint_SelectEndpoint(JOYSTICK_EPADDR_IN);
/* Check to see if the host is ready for another packet */
if (Endpoint_IsINReady())
{
/* Write Joystick Report Data */
Endpoint_Write_Stream_LE(&gamepad_state, 20, NULL);
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearIN();
}
}