Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Usb LUFA XInput控制器终结点输入/输出不工作 简介:_Usb_Microcontroller_Avr_Atmega_Xinput - Fatal编程技术网

Usb LUFA XInput控制器终结点输入/输出不工作 简介:

Usb LUFA XInput控制器终结点输入/输出不工作 简介:,usb,microcontroller,avr,atmega,xinput,Usb,Microcontroller,Avr,Atmega,Xinput,我一直在尝试(到目前为止整整四天都没有成功)让我的Atmega32u4设备(ArduinoPro Micro)模拟Xbox控制器 它不需要假装它是Xbox控制器,但我需要与XInput驱动程序进行通信,因此模拟官方控制器似乎是最好的开始方式 问题是: 当使用代码示例时,它正好让我半途而废。我的设备可以读取或写入设备驱动程序。但不是两者都有。让两者都发挥作用对我的项目至关重要 守则: 可以在XInputPadMicro(I)中找到设备/配置描述符 没有改变这些) 配置更改事件: 启用“OU

我一直在尝试(到目前为止整整四天都没有成功)让我的Atmega32u4设备(ArduinoPro Micro)模拟Xbox控制器

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

  • 问题是:
当使用代码示例时,它正好让我半途而废。我的设备可以读取或写入设备驱动程序。但不是两者都有。让两者都发挥作用对我的项目至关重要

  • 守则:
可以在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任务(每个周期调用):

我错过了什么重要的东西吗?也许是关于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();
    }
}