Add svn:eol-style property to source files, so that the line endings are correctly...
[pub/USBasp.git] / LUFA / Drivers / USB / HighLevel / ConfigDescriptor.h
index 232a9d1..0995533 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2010.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\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
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-/** \file\r
- *  \brief Configuration descriptor parser API.\r
- *\r
- *  This section of the library gives a friendly API which can be used in host applications to easily\r
- *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor\r
- *  data can be extracted and used as needed.\r
- *\r
- *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
- *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
- */\r
-\r
-/** \ingroup Group_Descriptors\r
- *  @defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser\r
- *\r
- *  Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors.\r
- *\r
- *  @{\r
- */\r
-\r
-#ifndef __CONFIGDESCRIPTOR_H__\r
-#define __CONFIGDESCRIPTOR_H__\r
-\r
-       /* Includes: */\r
-               #include <avr/io.h>\r
-               \r
-               #include "../../../Common/Common.h"\r
-               #include "../HighLevel/USBMode.h"\r
-               #include "../LowLevel/HostChapter9.h"\r
-               #include "../HighLevel/StdDescriptors.h"\r
-               \r
-       /* Enable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       extern "C" {\r
-               #endif\r
-\r
-       /* Preprocessor Checks: */\r
-               #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
-                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
-               #endif\r
-               \r
-       /* Public Interface - May be used in end-application: */        \r
-               /* Macros: */\r
-                       /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared\r
-                        *  with the EP_TYPE_* masks to determine the exact type of the endpoint.\r
-                        */\r
-                       #define EP_TYPE_MASK                       0x03\r
-\r
-                       /** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given\r
-                        *  descriptor type.\r
-                        *\r
-                        *  Usage Example:\r
-                        *  \code\r
-                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header\r
-                        *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,\r
-                        *                                                           USB_Descriptor_Configuration_Header_t);\r
-                        *\r
-                        *  // Can now access elements of the configuration header struct using the -> indirection operator\r
-                        *  \endcode\r
-                        */\r
-                       #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))\r
-\r
-                       /** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor\r
-                        *  type (as an actual struct instance rather than a pointer to a struct).\r
-                        *\r
-                        *  Usage Example:\r
-                        *  \code\r
-                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header\r
-                        *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,\r
-                        *                                                       USB_Descriptor_Configuration_Header_t);\r
-                        *\r
-                        *  // Can now access elements of the configuration header struct using the . operator\r
-                        *  \endcode\r
-                        */\r
-                       #define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type))\r
-\r
-                       /** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor.\r
-                        *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type\r
-                        *  values can be accessed in the \ref USB_DescriptorTypes_t enum.\r
-                        */\r
-                       #define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Type\r
-                       \r
-                       /** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */\r
-                       #define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Size\r
-\r
-               /* Type Defines: */\r
-                       /** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array\r
-                        *  of type void, returning a uint8_t value).\r
-                        *\r
-                        *  \see \ref USB_GetNextDescriptorComp function for more details\r
-                        */\r
-                       typedef uint8_t (* const ConfigComparatorPtr_t)(void*);\r
-\r
-               /* Function Prototypes: */\r
-                       /** Searches for the next descriptor in the given configuration descriptor using a premade comparator\r
-                        *  function. The routine updates the position and remaining configuration descriptor bytes values\r
-                        *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back\r
-                        *  so that the next descriptor search invocation will start from the descriptor which first caused the\r
-                        *  original search to fail. This behaviour allows for one comparator to be used immediately after another\r
-                        *  has failed, starting the second search from the descriptor which failed the first.\r
-                        *\r
-                        *  Comparator functions should be standard functions which accept a pointer to the header of the current\r
-                        *  descriptor inside the configuration descriptor which is being compared, and should return a value from\r
-                        *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value.\r
-                        *\r
-                        *  \note This function is available in USB Host mode only.\r
-                        *\r
-                        *  \param[in,out] BytesRem  Pointer to an int storing the remaining bytes in the configuration descriptor\r
-                        *  \param[in,out] CurrConfigLoc  Pointer to the current position in the configuration descriptor\r
-                        *  \param[in] ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor\r
-                        *\r
-                        *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum\r
-                        *\r
-                        *  Usage Example:\r
-                        *  \code\r
-                        *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype\r
-                        *\r
-                        *  uint8_t EndpointSearcher(void* CurrentDescriptor)\r
-                        *  {\r
-                        *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)\r
-                        *         return DESCRIPTOR_SEARCH_Found;\r
-                        *     else\r
-                        *         return DESCRIPTOR_SEARCH_NotFound;\r
-                        *  }\r
-                        *\r
-                        *  //...\r
-                        *  // After retrieving configuration descriptor:\r
-                        *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==\r
-                        *      Descriptor_Search_Comp_Found)\r
-                        *  {\r
-                        *      // Do something with the endpoint descriptor\r
-                        *  }\r
-                        *  \endcode\r
-                        */\r
-                       uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, void** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine);\r
-                       \r
-               /* Enums: */\r
-                       /** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */\r
-                       enum USB_Host_GetConfigDescriptor_ErrorCodes_t\r
-                       {\r
-                               HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor */\r
-                               HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration\r
-                                                                       * descriptor\r
-                                                                       */\r
-                               HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request */\r
-                               HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration\r
-                                                                       * descriptor\r
-                                                                       */\r
-                               HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out */\r
-                               HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated\r
-                                                                       * buffer\r
-                                                                       */\r
-                               HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data */\r
-                       };\r
-               \r
-                       /** Enum for return values of a descriptor comparator function. */\r
-                       enum DSearch_Return_ErrorCodes_t\r
-                       {\r
-                               DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */\r
-                               DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */\r
-                               DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */\r
-                       };\r
-\r
-                       /** Enum for return values of \ref USB_GetNextDescriptorComp(). */\r
-                       enum DSearch_Comp_Return_ErrorCodes_t\r
-                       {\r
-                               DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches\r
-                                                                            *   search criteria of the given comparator function. */\r
-                               DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned Descriptor_Search_Fail. */\r
-                               DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */\r
-                       };\r
-       \r
-               /* Function Prototypes: */\r
-                       /** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer,\r
-                        *  including validity and size checking to prevent a buffer overflow.\r
-                        *\r
-                        *  \param[in] ConfigNumber  Device configuration descriptor number to fetch from the device (usually set to 1 for\r
-                        *                           single configuration devices)\r
-                        *  \param[in,out] ConfigSizePtr  Pointer to a uint16_t for storing the retrieved configuration descriptor size\r
-                        *  \param[out] BufferPtr  Pointer to the buffer for storing the configuration descriptor data.\r
-                        *  \param[out] BufferSize  Size of the allocated buffer where the configuration descriptor is to be stored\r
-                        *\r
-                        *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum\r
-                        */\r
-                       uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr,\r
-                                                                  uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);\r
-\r
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.\r
-                        *  The bytes remaining value is automatically decremented.\r
-                        *\r
-                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor\r
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor\r
-                        * \param[in] Type  Descriptor type value to search for\r
-                        */\r
-                       void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,\r
-                                                        void** const CurrConfigLoc,\r
-                                                        const uint8_t Type)\r
-                                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);\r
-\r
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,\r
-                        *  which must come before a descriptor of the second given type value. If the BeforeType type\r
-                        *  descriptor is reached first, the number of bytes remaining to process is set to zero and the\r
-                        *  function exits. The bytes remaining value is automatically decremented.\r
-                        *\r
-                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor\r
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor\r
-                        * \param[in] Type  Descriptor type value to search for\r
-                        * \param[in] BeforeType  Descriptor type value which must not be reached before the given Type descriptor\r
-                        */\r
-                       void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,\r
-                                                              void** const CurrConfigLoc,\r
-                                                              const uint8_t Type,\r
-                                                              const uint8_t BeforeType)\r
-                                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);\r
-\r
-                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,\r
-                        *  which must come after a descriptor of the second given type value. The bytes remaining value is\r
-                        *  automatically decremented.\r
-                        *\r
-                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor\r
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor\r
-                        * \param[in] Type  Descriptor type value to search for\r
-                        * \param[in] AfterType  Descriptor type value which must be reached before the given Type descriptor\r
-                        */\r
-                       void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,\r
-                                                             void** const CurrConfigLoc,\r
-                                                             const uint8_t Type,\r
-                                                             const uint8_t AfterType)\r
-                                                             ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);\r
-\r
-               /* Inline Functions: */\r
-                       /** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then\r
-                           points to the next sub-descriptor. The bytes remaining value is automatically decremented.\r
-                        *\r
-                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor\r
-                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor\r
-                        */\r
-                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,\r
-                                                                void** const CurrConfigLoc) \r
-                                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);                                                                       \r
-                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,\r
-                                                                void** const CurrConfigLoc)\r
-                       {\r
-                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;\r
-\r
-                               *CurrConfigLoc += CurrDescriptorSize;\r
-                               *BytesRem      -= CurrDescriptorSize;\r
-                       }\r
-                       \r
-       /* Disable C linkage for C++ Compilers: */\r
-               #if defined(__cplusplus)\r
-                       }\r
-               #endif\r
-\r
-#endif\r
-\r
-/** @} */\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2010.
+              
+  dean [at] fourwalledcubicle [dot] com
+      www.fourwalledcubicle.com
+*/
+
+/*
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this 
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in 
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting 
+  documentation, and that the name of the author not be used in 
+  advertising or publicity pertaining to distribution of the 
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Configuration descriptor parser API.
+ *
+ *  This section of the library gives a friendly API which can be used in host applications to easily
+ *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor
+ *  data can be extracted and used as needed.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Descriptors
+ *  @defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser
+ *
+ *  Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors.
+ *
+ *  @{
+ */
+
+#ifndef __CONFIGDESCRIPTOR_H__
+#define __CONFIGDESCRIPTOR_H__
+
+       /* Includes: */
+               #include <avr/io.h>
+               
+               #include "../../../Common/Common.h"
+               #include "../HighLevel/USBMode.h"
+               #include "../LowLevel/HostChapter9.h"
+               #include "../HighLevel/StdDescriptors.h"
+               
+       /* Enable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       extern "C" {
+               #endif
+
+       /* Preprocessor Checks: */
+               #if !defined(__INCLUDE_FROM_USB_DRIVER)
+                       #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+               #endif
+               
+       /* Public Interface - May be used in end-application: */        
+               /* Macros: */
+                       /** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared
+                        *  with the EP_TYPE_* masks to determine the exact type of the endpoint.
+                        */
+                       #define EP_TYPE_MASK                       0x03
+
+                       /** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given
+                        *  descriptor type.
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+                        *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,
+                        *                                                           USB_Descriptor_Configuration_Header_t);
+                        *
+                        *  // Can now access elements of the configuration header struct using the -> indirection operator
+                        *  \endcode
+                        */
+                       #define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))
+
+                       /** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor
+                        *  type (as an actual struct instance rather than a pointer to a struct).
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+                        *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,
+                        *                                                       USB_Descriptor_Configuration_Header_t);
+                        *
+                        *  // Can now access elements of the configuration header struct using the . operator
+                        *  \endcode
+                        */
+                       #define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type))
+
+                       /** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor.
+                        *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type
+                        *  values can be accessed in the \ref USB_DescriptorTypes_t enum.
+                        */
+                       #define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Type
+                       
+                       /** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */
+                       #define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Size
+
+               /* Type Defines: */
+                       /** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array
+                        *  of type void, returning a uint8_t value).
+                        *
+                        *  \see \ref USB_GetNextDescriptorComp function for more details
+                        */
+                       typedef uint8_t (* const ConfigComparatorPtr_t)(void*);
+
+               /* Function Prototypes: */
+                       /** Searches for the next descriptor in the given configuration descriptor using a premade comparator
+                        *  function. The routine updates the position and remaining configuration descriptor bytes values
+                        *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back
+                        *  so that the next descriptor search invocation will start from the descriptor which first caused the
+                        *  original search to fail. This behaviour allows for one comparator to be used immediately after another
+                        *  has failed, starting the second search from the descriptor which failed the first.
+                        *
+                        *  Comparator functions should be standard functions which accept a pointer to the header of the current
+                        *  descriptor inside the configuration descriptor which is being compared, and should return a value from
+                        *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value.
+                        *
+                        *  \note This function is available in USB Host mode only.
+                        *
+                        *  \param[in,out] BytesRem  Pointer to an int storing the remaining bytes in the configuration descriptor
+                        *  \param[in,out] CurrConfigLoc  Pointer to the current position in the configuration descriptor
+                        *  \param[in] ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor
+                        *
+                        *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum
+                        *
+                        *  Usage Example:
+                        *  \code
+                        *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype
+                        *
+                        *  uint8_t EndpointSearcher(void* CurrentDescriptor)
+                        *  {
+                        *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
+                        *         return DESCRIPTOR_SEARCH_Found;
+                        *     else
+                        *         return DESCRIPTOR_SEARCH_NotFound;
+                        *  }
+                        *
+                        *  //...
+                        *  // After retrieving configuration descriptor:
+                        *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==
+                        *      Descriptor_Search_Comp_Found)
+                        *  {
+                        *      // Do something with the endpoint descriptor
+                        *  }
+                        *  \endcode
+                        */
+                       uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, void** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine);
+                       
+               /* Enums: */
+                       /** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
+                       enum USB_Host_GetConfigDescriptor_ErrorCodes_t
+                       {
+                               HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor */
+                               HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration
+                                                                       * descriptor
+                                                                       */
+                               HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request */
+                               HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration
+                                                                       * descriptor
+                                                                       */
+                               HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out */
+                               HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated
+                                                                       * buffer
+                                                                       */
+                               HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data */
+                       };
+               
+                       /** Enum for return values of a descriptor comparator function. */
+                       enum DSearch_Return_ErrorCodes_t
+                       {
+                               DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */
+                               DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */
+                               DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */
+                       };
+
+                       /** Enum for return values of \ref USB_GetNextDescriptorComp(). */
+                       enum DSearch_Comp_Return_ErrorCodes_t
+                       {
+                               DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches
+                                                                            *   search criteria of the given comparator function. */
+                               DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned Descriptor_Search_Fail. */
+                               DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */
+                       };
+       
+               /* Function Prototypes: */
+                       /** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer,
+                        *  including validity and size checking to prevent a buffer overflow.
+                        *
+                        *  \param[in] ConfigNumber  Device configuration descriptor number to fetch from the device (usually set to 1 for
+                        *                           single configuration devices)
+                        *  \param[in,out] ConfigSizePtr  Pointer to a uint16_t for storing the retrieved configuration descriptor size
+                        *  \param[out] BufferPtr  Pointer to the buffer for storing the configuration descriptor data.
+                        *  \param[out] BufferSize  Size of the allocated buffer where the configuration descriptor is to be stored
+                        *
+                        *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum
+                        */
+                       uint8_t USB_Host_GetDeviceConfigDescriptor(uint8_t ConfigNumber, uint16_t* const ConfigSizePtr, void* BufferPtr,
+                                                                  uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.
+                        *  The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+                        * \param[in] Type  Descriptor type value to search for
+                        */
+                       void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
+                                                        void** const CurrConfigLoc,
+                                                        const uint8_t Type)
+                                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+                        *  which must come before a descriptor of the second given type value. If the BeforeType type
+                        *  descriptor is reached first, the number of bytes remaining to process is set to zero and the
+                        *  function exits. The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+                        * \param[in] Type  Descriptor type value to search for
+                        * \param[in] BeforeType  Descriptor type value which must not be reached before the given Type descriptor
+                        */
+                       void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
+                                                              void** const CurrConfigLoc,
+                                                              const uint8_t Type,
+                                                              const uint8_t BeforeType)
+                                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+                       /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+                        *  which must come after a descriptor of the second given type value. The bytes remaining value is
+                        *  automatically decremented.
+                        *
+                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+                        * \param[in] Type  Descriptor type value to search for
+                        * \param[in] AfterType  Descriptor type value which must be reached before the given Type descriptor
+                        */
+                       void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
+                                                             void** const CurrConfigLoc,
+                                                             const uint8_t Type,
+                                                             const uint8_t AfterType)
+                                                             ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+               /* Inline Functions: */
+                       /** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
+                           points to the next sub-descriptor. The bytes remaining value is automatically decremented.
+                        *
+                        * \param[in,out] BytesRem  Pointer to the number of bytes remaining of the configuration descriptor
+                        * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor
+                        */
+                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+                                                                void** const CurrConfigLoc) 
+                                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);                                                                       
+                       static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+                                                                void** const CurrConfigLoc)
+                       {
+                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
+
+                               *CurrConfigLoc += CurrDescriptorSize;
+                               *BytesRem      -= CurrDescriptorSize;
+                       }
+                       
+       /* Disable C linkage for C++ Compilers: */
+               #if defined(__cplusplus)
+                       }
+               #endif
+
+#endif
+
+/** @} */