Corrected incorrect signature bytes for the AT90USB82 and added support for the ATMEG...
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / ConfigDescriptor.c
index bbe258b..4c6fbfd 100644 (file)
 #include "ConfigDescriptor.h"\r
 \r
 #if defined(USB_CAN_BE_HOST)\r
-uint8_t USB_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* BufferPtr)\r
+uint8_t USB_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr,\r
+                                      void* BufferPtr, uint16_t BufferSize)\r
 {\r
        uint8_t ErrorCode;\r
+       uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];\r
 \r
        USB_ControlRequest = (USB_Request_Header_t)\r
                {\r
                        .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
                        .bRequest      = REQ_GetDescriptor,\r
-                       .wValue        = (DTYPE_Configuration << 8),\r
+                       .wValue        = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)),\r
                        .wIndex        = 0,\r
                        .wLength       = sizeof(USB_Descriptor_Configuration_Header_t),\r
                };\r
        \r
        Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
 \r
-       if (BufferPtr == NULL)\r
-       {\r
-               uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];\r
+       if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
 \r
-               ErrorCode      = USB_Host_SendControlRequest(ConfigHeader);\r
+       #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)\r
+       *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).TotalConfigurationSize;\r
+       #else\r
+       *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).wTotalLength;             \r
+       #endif\r
 \r
-               #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)\r
-               *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).TotalConfigurationSize;\r
-               #else\r
-               *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).wTotalLength;             \r
-               #endif\r
-       }\r
-       else\r
-       {\r
-               USB_ControlRequest.wLength = *ConfigSizePtr;\r
-               \r
-               ErrorCode      = USB_Host_SendControlRequest(BufferPtr);                                \r
-       }\r
+       if (*ConfigSizePtr > BufferSize)\r
+         return HOST_GETCONFIG_BuffOverflow;\r
+         \r
+       USB_ControlRequest.wLength = *ConfigSizePtr;\r
+       \r
+       if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)\r
+         return ErrorCode;\r
 \r
-       return ErrorCode;\r
+       if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)\r
+         return HOST_GETCONFIG_InvalidData;\r
+       \r
+       return HOST_GETCONFIG_Successful;\r
 }\r
 #endif\r
 \r