More AVR32 achitecture ports.
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / ConfigDescriptor.c
index bbe258b..270a98a 100644 (file)
@@ -1,21 +1,21 @@
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   this software.\r
 */\r
 \r
+#define  __INCLUDE_FROM_USB_DRIVER\r
 #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_Host_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
+       *ConfigSizePtr = DESCRIPTOR_CAST(ConfigHeader, USB_Descriptor_Configuration_Header_t).TotalConfigurationSize;\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
 void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,\r
-                                 uint8_t** const CurrConfigLoc,\r
+                                 void** const CurrConfigLoc,\r
                                  const uint8_t Type)\r
 {\r
        while (*BytesRem)\r
@@ -83,7 +83,7 @@ void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
 }\r
 \r
 void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,\r
-                                       uint8_t** const CurrConfigLoc,\r
+                                       void** const CurrConfigLoc,\r
                                        const uint8_t Type,\r
                                        const uint8_t BeforeType)\r
 {\r
@@ -104,7 +104,7 @@ void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
 }\r
 \r
 void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,\r
-                                      uint8_t** const CurrConfigLoc,\r
+                                      void** const CurrConfigLoc,\r
                                       const uint8_t Type,\r
                                       const uint8_t AfterType)\r
 {\r
@@ -114,7 +114,7 @@ void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
          USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, Type);\r
 }\r
                        \r
-uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, uint8_t** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine)\r
+uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, void** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine)\r
 {\r
        uint8_t ErrorCode;\r
                \r