X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/6a10d6b465be27db090d760dc0fbe722c94e4344..4a8ac5e474741f14492597880e751b3f806cb965:/LUFA/Drivers/USB/Class/ConfigDescriptor.h diff --git a/LUFA/Drivers/USB/Class/ConfigDescriptor.h b/LUFA/Drivers/USB/Class/ConfigDescriptor.h index d1f8927f8..5c2b6e2de 100644 --- a/LUFA/Drivers/USB/Class/ConfigDescriptor.h +++ b/LUFA/Drivers/USB/Class/ConfigDescriptor.h @@ -35,6 +35,14 @@ * and other descriptor data can be extracted and used as needed. */ +/** \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__ @@ -42,6 +50,7 @@ #include #include "../../../Common/Common.h" + #include "../HighLevel/USBMode.h" #include "../LowLevel/HostChapter9.h" #include "../HighLevel/StdDescriptors.h" @@ -50,8 +59,13 @@ extern "C" { #endif - /* Public Interface - May be used in end-application: */ + /* 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. * @@ -82,7 +96,7 @@ /** 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 DescriptorTypes_t enum located in USB/HighLevel/StdDescriptors.h. + * values can be accessed in the \ref USB_DescriptorTypes_t enum. */ #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) || defined(__DOXYGEN__) #define DESCRIPTOR_TYPE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Type @@ -96,18 +110,16 @@ #else #define DESCRIPTOR_SIZE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).bLength #endif - - /** Creates a prototype for or begins a descriptor comparitor routine. Descriptor comparitor routines are - * small search routines which are passed a pointer to the current sub descriptor in the configuration - * descriptor, and which analyse the sub descriptor to determine whether or not it matches the routine's - * search parameters. Comparitor routines provide a powerful way to scan through the config descriptor - * for certain descriptors matching unique criteria. + + /* 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). * - * Comparitor routines are passed in a single pointer named CurrentDescriptor, and should return a value - * of a member of the DSEARCH_Return_ErrorCodes_t enum. + * \see \ref USB_GetNextDescriptorComp function for more details */ - #define DESCRIPTOR_COMPARATOR(name) uint8_t DCOMP_##name (void* const CurrentDescriptor) + typedef uint8_t (* const ConfigComparatorPtr_t)(void* const); + /* 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 @@ -115,22 +127,28 @@ * 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. * - * \param DSize Pointer to an int storing the remaining bytes in the configuration descriptor - * \param DPos Pointer to the current position in the configuration descriptor - * \param DSearch Name of the comparitor search function to use on the configuration descriptor + * 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. * - * \return Value of one of the members of the DSEARCH_Comp_Return_ErrorCodes_t enum + * \param BytesRem Pointer to an int storing the remaining bytes in the configuration descriptor + * \param CurrConfigLoc Pointer to the current position in the configuration descriptor + * \param 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 - * DESCRIPTOR_COMPARATOR(EndpointSearcher); // Comparator Prototype + * uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype * - * DESCRIPTOR_COMPARATOR(EndpointSearcher) + * uint8_t EndpointSearcher(void* CurrentDescriptor) * { * if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) - * return Descriptor_Search_Found; + * return DESCRIPTOR_SEARCH_Found; * else - * return Descriptor_Search_NotFound; + * return DESCRIPTOR_SEARCH_NotFound; * } * * //... @@ -142,24 +160,24 @@ * } * \endcode */ - #define USB_Host_GetNextDescriptorComp(DSize, DPos, DSearch) \ - USB_Host_GetNextDescriptorComp_P(DSize, DPos, DCOMP_##DSearch) + uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, uint8_t** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine); + /* Enums: */ - /** Enum for return values of a descriptor comparator made with DESCRIPTOR_COMPARATOR. */ - enum DSEARCH_Return_ErrorCodes_t + /** 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. */ + 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 USB_Host_GetNextDescriptorComp() */ - enum DSEARCH_Comp_Return_ErrorCodes_t + /** Enum for return values of \ref USB_GetNextDescriptorComp(). */ + enum DSearch_Comp_Return_ErrorCodes_t { - Descriptor_Search_Comp_Found = 0, /**< Configuration descriptor now points to decriptor which matches + 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. */ + 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: */ @@ -174,31 +192,8 @@ * of bytes indicated by ConfigSizePtr of the configuration descriptor will be loaded * into the buffer */ - uint8_t USB_Host_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* BufferPtr) - ATTR_NON_NULL_PTR_ARG(1); - - /* 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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor - * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor - */ - static inline void USB_Host_GetNextDescriptor(uint16_t* const BytesRem, - uint8_t** const CurrConfigLoc) - ATTR_NON_NULL_PTR_ARG(1, 2); - static inline void USB_Host_GetNextDescriptor(uint16_t* const BytesRem, - uint8_t** const CurrConfigLoc) - { - #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) - uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size; - #else - uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).bLength; - #endif - - *CurrConfigLoc += CurrDescriptorSize; - *BytesRem -= CurrDescriptorSize; - } + uint8_t USB_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* BufferPtr) + ATTR_NON_NULL_PTR_ARG(1); /** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value. * The bytes remaining value is automatically decremented. @@ -207,10 +202,10 @@ * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor * \param Type Descriptor type value to search for */ - void USB_Host_GetNextDescriptorOfType(uint16_t* const BytesRem, - uint8_t** const CurrConfigLoc, - const uint8_t Type) - ATTR_NON_NULL_PTR_ARG(1, 2); + void USB_GetNextDescriptorOfType(uint16_t* const BytesRem, + uint8_t** const CurrConfigLoc, + const uint8_t Type) + ATTR_NON_NULL_PTR_ARG(1, 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 @@ -222,11 +217,11 @@ * \param Type Descriptor type value to search for * \param BeforeType Descriptor type value which must not be reached before the given Type descriptor */ - void USB_Host_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem, - uint8_t** const CurrConfigLoc, - const uint8_t Type, - const uint8_t BeforeType) - ATTR_NON_NULL_PTR_ARG(1, 2); + void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem, + uint8_t** const CurrConfigLoc, + const uint8_t Type, + const uint8_t BeforeType) + ATTR_NON_NULL_PTR_ARG(1, 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 @@ -237,22 +232,40 @@ * \param Type Descriptor type value to search for * \param AfterType Descriptor type value which must be reached before the given Type descriptor */ - void USB_Host_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem, - uint8_t** const CurrConfigLoc, - const uint8_t Type, - const uint8_t AfterType) - ATTR_NON_NULL_PTR_ARG(1, 2); - - /* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Function Prototypes: */ - uint8_t USB_Host_GetNextDescriptorComp_P(uint16_t* BytesRem, uint8_t** CurrConfigLoc, - uint8_t (* const ComparatorRoutine)(void* const)); - #endif + void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem, + uint8_t** const CurrConfigLoc, + const uint8_t Type, + const uint8_t AfterType) + ATTR_NON_NULL_PTR_ARG(1, 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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor + * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor + */ + static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, + uint8_t** const CurrConfigLoc) + ATTR_NON_NULL_PTR_ARG(1, 2); + static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, + uint8_t** const CurrConfigLoc) + { + #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) + uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size; + #else + uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).bLength; + #endif + + *CurrConfigLoc += CurrDescriptorSize; + *BytesRem -= CurrDescriptorSize; + } /* Disable C linkage for C++ Compilers: */ #if defined(__cplusplus) } #endif - + #endif + +/** @} */