Add FatFS library to the Webserver project, extend the HTTP server so that it now...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Template / Template_Endpoint_Control_W.c
index 2796c64..70560cf 100644 (file)
@@ -1,35 +1,45 @@
-uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)\r
+uint8_t TEMPLATE_FUNC_NAME (const void* Buffer, uint16_t Length)\r
 {\r
-       uint8_t* DataStream     = (uint8_t*)(Buffer + TEMPLATE_BUFFER_OFFSET(Length));\r
+       uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));\r
        bool     LastPacketFull = false;\r
        \r
        if (Length > USB_ControlRequest.wLength)\r
          Length = USB_ControlRequest.wLength;\r
-       \r
-       while (Length && !(Endpoint_IsOUTReceived()))\r
+       else if (!(Length))\r
+         Endpoint_ClearIN();\r
+\r
+       while (Length || LastPacketFull)\r
        {\r
-               while (!(Endpoint_IsINReady()));\r
+               if (Endpoint_IsSETUPReceived())\r
+                 return ENDPOINT_RWCSTREAM_HostAborted;\r
+\r
+               if (Endpoint_IsOUTReceived())\r
+                 break;\r
                \r
-               while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))\r
+               if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;\r
+                 \r
+               if (Endpoint_IsINReady())\r
                {\r
-                       TEMPLATE_TRANSFER_BYTE(DataStream);\r
-                       Length--;\r
-               }\r
+                       uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();\r
                \r
-               LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);\r
-               Endpoint_ClearIN();\r
+                       while (Length && (BytesInEndpoint < USB_ControlEndpointSize))\r
+                       {\r
+                               TEMPLATE_TRANSFER_BYTE(DataStream);\r
+                               Length--;\r
+                               BytesInEndpoint++;\r
+                       }\r
+                       \r
+                       LastPacketFull = (BytesInEndpoint == USB_ControlEndpointSize);\r
+                       Endpoint_ClearIN();\r
+               }\r
        }\r
        \r
-       if (Endpoint_IsOUTReceived())\r
-         return ENDPOINT_RWCSTREAM_HostAborted;\r
-       \r
-       if (LastPacketFull)\r
+       while (!(Endpoint_IsOUTReceived()))\r
        {\r
-               while (!(Endpoint_IsINReady()));\r
-               Endpoint_ClearIN();\r
+               if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected; \r
        }\r
-       \r
-       while (!(Endpoint_IsOUTReceived()));\r
 \r
        return ENDPOINT_RWCSTREAM_NoError;\r
 }\r