Add extra tests to the MassStorage device demo and class driver for validating comman...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Host.c
index b3b56b8..efe4bae 100644 (file)
@@ -55,7 +55,7 @@ void USB_Host_ProcessNextHostState(void)
                                        break;\r
                                }\r
                                \r
-                               if (!(WaitMSRemaining--))\r
+                               if (!(--WaitMSRemaining))\r
                                  USB_HostState = PostWaitState;\r
                        }\r
                \r
@@ -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
@@ -210,7 +212,6 @@ uint8_t USB_Host_WaitMS(uint8_t MS)
        bool    BusSuspended = USB_Host_IsBusSuspended();\r
        uint8_t ErrorCode    = HOST_WAITERROR_Successful;\r
        \r
-       USB_INT_Clear(USB_INT_HSOFI);\r
        USB_Host_ResumeBus();\r
 \r
        while (MS)\r
@@ -260,9 +261,10 @@ static void USB_Host_ResetDevice(void)
        USB_Host_ResetBus();\r
        while (!(USB_Host_IsBusResetComplete()));\r
 \r
+       USB_Host_ResumeBus();\r
+\r
        USB_INT_Clear(USB_INT_HSOFI);\r
-       USB_Host_ResumeBus();   \r
-       \r
+\r
        for (uint8_t MSRem = 10; MSRem != 0; MSRem--)\r
        {\r
                /* Workaround for powerless-pull-up devices. After a USB bus reset,\r
@@ -272,6 +274,7 @@ static void USB_Host_ResetDevice(void)
 \r
                if (USB_INT_HasOccurred(USB_INT_HSOFI))\r
                {\r
+                       USB_INT_Clear(USB_INT_HSOFI);\r
                        USB_INT_Clear(USB_INT_DDISCI);\r
                        break;\r
                }\r
@@ -284,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