USB_HostRequest renamed to USB_ControlRequest, entire control request header is now...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / DevChapter9.c
index 3f2805c..bf2b127 100644 (file)
@@ -41,17 +41,19 @@ bool    USB_CurrentlySelfPowered;
 \r
 void USB_Device_ProcessControlPacket(void)\r
 {\r
-       uint8_t bmRequestType  = Endpoint_Read_Byte();\r
-       uint8_t bRequest       = Endpoint_Read_Byte();\r
-       bool    RequestHandled = false; \r
+       bool     RequestHandled = false;\r
+       uint8_t* RequestHeader  = (uint8_t*)&USB_ControlRequest;\r
        \r
-       switch (bRequest)\r
+       for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)\r
+         *(RequestHeader++) = Endpoint_Read_Byte();\r
+       \r
+       switch (USB_ControlRequest.bRequest)\r
        {\r
                case REQ_GetStatus:\r
-                       if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||\r
-                           (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))\r
+                       if ((USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||\r
+                           (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))\r
                        {\r
-                               USB_Device_GetStatus(bmRequestType);\r
+                               USB_Device_GetStatus();\r
                                RequestHandled = true;\r
                        }\r
 \r
@@ -59,16 +61,16 @@ void USB_Device_ProcessControlPacket(void)
 #if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)\r
                case REQ_ClearFeature:\r
                case REQ_SetFeature:\r
-                       if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT))\r
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT))\r
                        {\r
-                               USB_Device_ClearSetFeature(bRequest, bmRequestType);\r
+                               USB_Device_ClearSetFeature();\r
                                RequestHandled = true;\r
                        }\r
 \r
                        break;\r
 #endif\r
                case REQ_SetAddress:\r
-                       if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))\r
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))\r
                        {\r
                                USB_Device_SetAddress();\r
                                RequestHandled = true;\r
@@ -76,8 +78,8 @@ void USB_Device_ProcessControlPacket(void)
 \r
                        break;\r
                case REQ_GetDescriptor:\r
-                       if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||\r
-                           (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))\r
+                       if ((USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||\r
+                           (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))\r
                        {\r
                                USB_Device_GetDescriptor();\r
                                RequestHandled = true;\r
@@ -85,7 +87,7 @@ void USB_Device_ProcessControlPacket(void)
                        \r
                        break;\r
                case REQ_GetConfiguration:\r
-                       if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))\r
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))\r
                        {\r
                                USB_Device_GetConfiguration();\r
                                RequestHandled = true;\r
@@ -93,7 +95,7 @@ void USB_Device_ProcessControlPacket(void)
 \r
                        break;\r
                case REQ_SetConfiguration:\r
-                       if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))\r
+                       if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))\r
                        {\r
                                USB_Device_SetConfiguration();\r
                                RequestHandled = true;\r
@@ -103,7 +105,7 @@ void USB_Device_ProcessControlPacket(void)
        }\r
 \r
        if (!(RequestHandled))\r
-         RAISE_EVENT(USB_UnhandledControlPacket, bRequest, bmRequestType);\r
+         RAISE_EVENT(USB_UnhandledControlPacket);\r
          \r
        if (Endpoint_IsSETUPReceived())\r
        {\r
@@ -114,8 +116,6 @@ void USB_Device_ProcessControlPacket(void)
 \r
 static void USB_Device_SetAddress(void)\r
 {\r
-       uint8_t wValue_LSB = Endpoint_Read_Byte();\r
-\r
        Endpoint_ClearSETUP();\r
        \r
        while (!(Endpoint_IsINReady()));\r
@@ -124,28 +124,27 @@ static void USB_Device_SetAddress(void)
        \r
        while (!(Endpoint_IsINReady()));\r
 \r
-       UDADDR = ((1 << ADDEN) | (wValue_LSB & 0x7F));\r
+       UDADDR = ((1 << ADDEN) | (USB_ControlRequest.wValue & 0x7F));\r
 \r
        return;\r
 }\r
 \r
 static void USB_Device_SetConfiguration(void)\r
 {\r
-       uint8_t wValue_LSB        = Endpoint_Read_Byte();\r
        bool    AlreadyConfigured = (USB_ConfigurationNumber != 0);\r
 \r
 #if defined(USE_SINGLE_DEVICE_CONFIGURATION)\r
-       if (wValue_LSB > 1)\r
+       if (USB_ControlRequest.wValue > 1)\r
 #else\r
        USB_Descriptor_Device_t* DevDescriptorPtr;\r
 \r
        if ((USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr) == NO_DESCRIPTOR) ||\r
        #if defined(USE_RAM_DESCRIPTORS)\r
-           (wValue_LSB > DevDescriptorPtr->NumberOfConfigurations))\r
+           (USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations))\r
        #elif defined (USE_EEPROM_DESCRIPTORS)\r
-           (wValue_LSB > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
+           (USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
        #else\r
-           (wValue_LSB > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
+           (USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
        #endif\r
 #endif\r
        {\r
@@ -154,7 +153,7 @@ static void USB_Device_SetConfiguration(void)
        \r
        Endpoint_ClearSETUP();\r
 \r
-       USB_ConfigurationNumber = wValue_LSB;\r
+       USB_ConfigurationNumber = USB_ControlRequest.wValue;\r
 \r
        Endpoint_ClearIN();\r
 \r
@@ -178,24 +177,23 @@ void USB_Device_GetConfiguration(void)
 \r
 static void USB_Device_GetDescriptor(void)\r
 {\r
-       uint16_t wValue  = Endpoint_Read_Word_LE();\r
-       uint16_t wIndex  = Endpoint_Read_Word_LE();\r
-       uint16_t wLength = Endpoint_Read_Word_LE();\r
-       \r
        void*    DescriptorPointer;\r
        uint16_t DescriptorSize;\r
        \r
-       bool     SendZLP;\r
-       \r
-       if ((DescriptorSize = USB_GetDescriptor(wValue, wIndex, &DescriptorPointer)) == NO_DESCRIPTOR)\r
+       if ((DescriptorSize = USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, &DescriptorPointer)) == NO_DESCRIPTOR)\r
          return;\r
        \r
-       Endpoint_ClearSETUP();  \r
+       Endpoint_ClearSETUP();\r
+       \r
+       #if defined(USE_RAM_DESCRIPTORS)\r
+       Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);\r
+       #else\r
+       bool     SendZLP;\r
        \r
-       if (wLength > DescriptorSize)\r
-         wLength = DescriptorSize;\r
+       if (USB_ControlRequest.wLength > DescriptorSize)\r
+         USB_ControlRequest.wLength = DescriptorSize;\r
        \r
-       while (wLength)\r
+       while (USB_ControlRequest.wLength)\r
        {\r
                while (!(Endpoint_IsINReady()))\r
                {\r
@@ -206,17 +204,15 @@ static void USB_Device_GetDescriptor(void)
                        }               \r
                }\r
                \r
-               while (wLength && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))\r
+               while (USB_ControlRequest.wLength && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize))\r
                {\r
-                       #if defined(USE_RAM_DESCRIPTORS)\r
-                       Endpoint_Write_Byte(*((uint8_t*)DescriptorPointer++));\r
-                       #elif defined (USE_EEPROM_DESCRIPTORS)\r
+                       #if defined (USE_EEPROM_DESCRIPTORS)\r
                        Endpoint_Write_Byte(eeprom_read_byte(DescriptorPointer++));                     \r
                        #else\r
                        Endpoint_Write_Byte(pgm_read_byte(DescriptorPointer++));\r
                        #endif\r
                        \r
-                       wLength--;\r
+                       USB_ControlRequest.wLength--;\r
                }\r
                \r
                SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize);\r
@@ -230,20 +226,16 @@ static void USB_Device_GetDescriptor(void)
        }\r
 \r
        while (!(Endpoint_IsOUTReceived()));\r
+       #endif\r
+       \r
        Endpoint_ClearOUT();\r
 }\r
 \r
-static void USB_Device_GetStatus(const uint8_t bmRequestType)\r
+static void USB_Device_GetStatus(void)\r
 {\r
        uint8_t CurrentStatus = 0;\r
 \r
-       Endpoint_Discard_Word();\r
-\r
-#if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)\r
-       uint8_t wIndex_LSB = Endpoint_Read_Byte();\r
-#endif\r
-       \r
-       switch (bmRequestType)\r
+       switch (USB_ControlRequest.bmRequestType)\r
        {\r
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):\r
                        if (USB_CurrentlySelfPowered)\r
@@ -255,15 +247,16 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType)
                        break;\r
 #if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)\r
                case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):\r
-                       Endpoint_SelectEndpoint(wIndex_LSB);\r
+                       Endpoint_SelectEndpoint(USB_ControlRequest.wIndex);\r
 \r
                        CurrentStatus = Endpoint_IsStalled();\r
 \r
+                       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);                      \r
+\r
                        break;\r
 #endif\r
        }\r
-       \r
-       Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);                      \r
+\r
        Endpoint_ClearSETUP();\r
 \r
        Endpoint_Write_Word_LE(CurrentStatus);\r
@@ -275,17 +268,14 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType)
 }\r
 \r
 #if !defined(FEATURELESS_CONTROL_ONLY_DEVICE)\r
-static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmRequestType)\r
-{\r
-       uint16_t wValue = Endpoint_Read_Word_LE();\r
-       uint16_t wIndex = Endpoint_Read_Word_LE();\r
-       \r
-       switch (bmRequestType & CONTROL_REQTYPE_RECIPIENT)\r
+static void USB_Device_ClearSetFeature(void)\r
+{      \r
+       switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)\r
        {\r
                case REQREC_ENDPOINT:\r
-                       if (wValue == FEATURE_ENDPOINT_HALT)\r
+                       if (USB_ControlRequest.wValue == FEATURE_ENDPOINT_HALT)\r
                        {\r
-                               uint8_t EndpointIndex = (wIndex & ENDPOINT_EPNUM_MASK);\r
+                               uint8_t EndpointIndex = (USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);\r
                                \r
                                if (EndpointIndex != ENDPOINT_CONTROLEP)\r
                                {\r
@@ -293,7 +283,7 @@ static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmR
 \r
                                        if (Endpoint_IsEnabled())\r
                                        {                               \r
-                                               if (bRequest == REQ_ClearFeature)\r
+                                               if (USB_ControlRequest.bRequest == REQ_ClearFeature)\r
                                                {\r
                                                        Endpoint_ClearStall();\r
                                                        Endpoint_ResetFIFO(EndpointIndex);\r