Add extra tests to the MassStorage device demo and class driver for validating comman...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Host.c
index 02a1c21..efe4bae 100644 (file)
@@ -66,6 +66,7 @@ void USB_Host_ProcessNextHostState(void)
                        USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;\r
                        break;\r
                case HOST_STATE_Attached_WaitForDeviceSettle:\r
+                       #if HOST_DEVICE_SETTLE_DELAY_MS > 0\r
                        _delay_ms(1);\r
 \r
                        if (!(WaitMSRemaining--))\r
@@ -78,6 +79,9 @@ void USB_Host_ProcessNextHostState(void)
                                \r
                                USB_HostState = HOST_STATE_Attached_WaitForConnect;\r
                        }\r
+                       #else\r
+                       USB_HostState = HOST_STATE_Attached_WaitForConnect;                     \r
+                       #endif\r
                        \r
                        break;\r
                case HOST_STATE_Attached_WaitForConnect:                \r
@@ -162,8 +166,6 @@ void USB_Host_ProcessNextHostState(void)
                                break;\r
                        }\r
 \r
-                       Pipe_SetInfiniteINRequests();\r
-                       \r
                        USB_ControlRequest = (USB_Request_Header_t)\r
                                {\r
                                        .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
@@ -214,9 +216,9 @@ uint8_t USB_Host_WaitMS(uint8_t MS)
 \r
        while (MS)\r
        {\r
-               if (FrameElapsed)\r
+               if (USB_INT_HasOccurred(USB_INT_HSOFI))\r
                {\r
-                       FrameElapsed = false;\r
+                       USB_INT_Clear(USB_INT_HSOFI);\r
                        MS--;\r
                }\r
                                        \r
@@ -259,9 +261,9 @@ static void USB_Host_ResetDevice(void)
        USB_Host_ResetBus();\r
        while (!(USB_Host_IsBusResetComplete()));\r
 \r
-       USB_Host_ResumeBus();   \r
-       \r
-       FrameElapsed = false;\r
+       USB_Host_ResumeBus();\r
+\r
+       USB_INT_Clear(USB_INT_HSOFI);\r
 \r
        for (uint8_t MSRem = 10; MSRem != 0; MSRem--)\r
        {\r
@@ -270,10 +272,9 @@ static void USB_Host_ResetDevice(void)
                   looked for - if it is found within 10ms, the device is still\r
                   present.                                                        */\r
 \r
-               if (FrameElapsed)\r
+               if (USB_INT_HasOccurred(USB_INT_HSOFI))\r
                {\r
-                       FrameElapsed = false;\r
-                       \r
+                       USB_INT_Clear(USB_INT_HSOFI);\r
                        USB_INT_Clear(USB_INT_DDISCI);\r
                        break;\r
                }\r
@@ -286,4 +287,56 @@ static void USB_Host_ResetDevice(void)
 \r
        USB_INT_Enable(USB_INT_DDISCI);\r
 }\r
+\r
+uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber)\r
+{\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),\r
+                       .bRequest      = REQ_SetConfiguration,\r
+                       .wValue        = ConfigNumber,\r
+                       .wIndex        = 0,\r
+                       .wLength       = 0,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(NULL);\r
+}\r
+\r
+uint8_t USB_Host_GetDeviceDescriptor(void* const DeviceDescriptorPtr)\r
+{\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
+                       bRequest:      REQ_GetDescriptor,\r
+                       wValue:        (DTYPE_Device << 8),\r
+                       wIndex:        0,\r
+                       wLength:       sizeof(USB_Descriptor_Device_t),\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(DeviceDescriptorPtr);\r
+}\r
+\r
+uint8_t USB_Host_ClearPipeStall(uint8_t EndpointNum)\r
+{\r
+       if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)\r
+         EndpointNum |= (1 << 7);\r
+\r
+       USB_ControlRequest = (USB_Request_Header_t)\r
+               {\r
+                       .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),\r
+                       .bRequest      = REQ_ClearFeature,\r
+                       .wValue        = FEATURE_ENDPOINT_HALT,\r
+                       .wIndex        = EndpointNum,\r
+                       .wLength       = 0,\r
+               };\r
+\r
+       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
+       \r
+       return USB_Host_SendControlRequest(NULL);\r
+}\r
+\r
 #endif\r