LUFA XInput控制器端点IN / OUT不起作用

时间:2019-02-22 14:38:32

标签: usb microcontroller avr atmega xinput

  • 简介:

我一直在尝试(到目前为止已经连续四天失败)让我的Atmega32u4设备(Arduino Pro Micro)模仿Xbox控制器。

不必假装它是Xbox控制器,但是我需要与XInput驱动程序进行通信,因此模拟正式控制器似乎是开始的最佳方法。

  • 问题:

在使用代码示例XInputPadMicro by Bootsector时,它恰好使我半途而废。我的设备可以从设备驱动程序中读取或写入。但不是两者。两者都起作用对我的项目至关重要。

  • 代码:
  

设备/配置描述符可以在XInputPadMicro(I   并没有改变这些。)

配置更改事件: 启用“ OUT”端点将破坏“ IN”端点。

#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任务(称为每个周期):

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();
    }
}

我缺少一些重要的东西吗?也许关于USB协议的内部运作?我在这里茫然。

0 个答案:

没有答案