@ -119,49 +119,6 @@
* \ see \ ref USB_GetNextDescriptorComp function for more details
* \ see \ ref USB_GetNextDescriptorComp function for more details
*/
*/
typedef uint8_t ( * ConfigComparatorPtr_t ) ( void * ) ;
typedef uint8_t ( * 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 const ComparatorRoutine ) ;
/* Enums: */
/* Enums: */
/** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
/** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
@ -257,7 +214,59 @@
const uint8_t AfterType )
const uint8_t AfterType )
ATTR_NON_NULL_PTR_ARG ( 1 ) ATTR_NON_NULL_PTR_ARG ( 2 ) ;
ATTR_NON_NULL_PTR_ARG ( 1 ) ATTR_NON_NULL_PTR_ARG ( 2 ) ;
/** 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 * * const CurrConfigLoc , ConfigComparatorPtr_t const ComparatorRoutine ) ;
/* Inline Functions: */
/* Inline Functions: */
# if !defined(__DOXYGEN__)
static inline void USB_GetNextDescriptorST ( uint16_t * const BytesRem , uint8_t * * CurrConfigLoc )
{
uint16_t CurrDescriptorSize = DESCRIPTOR_CAST ( * CurrConfigLoc , USB_Descriptor_Header_t ) . Size ;
* CurrConfigLoc + = CurrDescriptorSize ;
* BytesRem - = CurrDescriptorSize ;
}
# endif
/** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
/** 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 .
points to the next sub - descriptor . The bytes remaining value is automatically decremented .
*
*
@ -268,12 +277,14 @@
ATTR_NON_NULL_PTR_ARG ( 1 ) ATTR_NON_NULL_PTR_ARG ( 2 ) ;
ATTR_NON_NULL_PTR_ARG ( 1 ) ATTR_NON_NULL_PTR_ARG ( 2 ) ;
static inline void USB_GetNextDescriptor ( uint16_t * const BytesRem , void * * CurrConfigLoc )
static inline void USB_GetNextDescriptor ( uint16_t * const BytesRem , void * * CurrConfigLoc )
{
{
uint16_t CurrDescriptorSize = DESCRIPTOR_CAST ( * CurrConfigLoc , USB_Descriptor_Header_t ) . Size ;
/* Horrible workaround for a bug in GCC - in some circumstances, the code generated for the strongly-typed
* ( uint8_t * * ) cast to avoid void pointer arithmetic ( which is not allowed in C + + ) causes incorrect code to
* CurrConfigLoc + = CurrDescriptorSize ;
* be generated . Performing the cast and using a secondary inline routine show here seems to avoid the
* BytesRem - = CurrDescriptorSize ;
* problem .
*/
USB_GetNextDescriptorST ( BytesRem , ( uint8_t * * ) CurrConfigLoc ) ;
}
}
/* Disable C linkage for C++ Compilers: */
/* Disable C linkage for C++ Compilers: */
# if defined(__cplusplus)
# if defined(__cplusplus)
}
}