Added new VTARGET_REF_VOLTS and VTARGET_SCALE_FACTOR compile time defines to the...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Template / Template_Endpoint_Control_W.c
index 6c1445e..91f4e96 100644 (file)
@@ -1,44 +1,53 @@
-uint8_t TEMPLATE_FUNC_NAME (void* Buffer, uint16_t Length)\r
-{\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 || LastPacketFull)\r
-       {\r
-               if (Endpoint_IsSETUPReceived())\r
-                 return ENDPOINT_RWCSTREAM_HostAborted;\r
-\r
-               if (Endpoint_IsOUTReceived())\r
-                 break;\r
-               \r
-               if (USB_DeviceState == DEVICE_STATE_Unattached)\r
-                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;\r
-                 \r
-               if (Endpoint_IsINReady())\r
-               {\r
-                       while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))\r
-                       {\r
-                               TEMPLATE_TRANSFER_BYTE(DataStream);\r
-                               Length--;\r
-                       }\r
-                       \r
-                       LastPacketFull = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);\r
-                       Endpoint_ClearIN();\r
-               }\r
-       }\r
-       \r
-       while (!(Endpoint_IsOUTReceived()))\r
-       {\r
-               if (USB_DeviceState == DEVICE_STATE_Unattached)\r
-                 return ENDPOINT_RWCSTREAM_DeviceDisconnected; \r
-       }\r
-\r
-       return ENDPOINT_RWCSTREAM_NoError;\r
-}\r
-\r
-#undef TEMPLATE_BUFFER_OFFSET\r
-#undef TEMPLATE_FUNC_NAME\r
+uint8_t TEMPLATE_FUNC_NAME (const void* Buffer, uint16_t Length)
+{
+       uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+       bool     LastPacketFull = false;
+       
+       if (Length > USB_ControlRequest.wLength)
+         Length = USB_ControlRequest.wLength;
+       else if (!(Length))
+         Endpoint_ClearIN();
+
+       while (Length || LastPacketFull)
+       {
+               if (Endpoint_IsSETUPReceived())
+                 return ENDPOINT_RWCSTREAM_HostAborted;
+
+               if (Endpoint_IsOUTReceived())
+                 break;
+               
+               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+                 
+               if (Endpoint_IsINReady())
+               {
+                       uint8_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+               
+                       while (Length && (BytesInEndpoint < USB_ControlEndpointSize))
+                       {
+                               TEMPLATE_TRANSFER_BYTE(DataStream);
+                               Length--;
+                               BytesInEndpoint++;
+                       }
+                       
+                       LastPacketFull = (BytesInEndpoint == USB_ControlEndpointSize);
+                       Endpoint_ClearIN();
+               }
+       }
+       
+       while (!(Endpoint_IsOUTReceived()))
+       {
+               if (USB_DeviceState == DEVICE_STATE_Unattached)
+                 return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+               else if (USB_DeviceState == DEVICE_STATE_Suspended)
+                 return ENDPOINT_RWCSTREAM_BusSuspended;
+       }
+
+       return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_FUNC_NAME
 #undef TEMPLATE_TRANSFER_BYTE
\ No newline at end of file