/*\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
+ Copyright 2010 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
+ 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
* // 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
+ #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
* 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
- #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) || defined(__DOXYGEN__)\r
- #define DESCRIPTOR_TYPE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Type\r
- #else\r
- #define DESCRIPTOR_TYPE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).bDescriptorType \r
- #endif\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
- #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) || defined(__DOXYGEN__)\r
- #define DESCRIPTOR_SIZE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).Size\r
- #else\r
- #define DESCRIPTOR_SIZE(DescriptorPtr) DESCRIPTOR_CAST(DescriptorPtr, USB_Descriptor_Header_t).bLength\r
- #endif\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
*\r
* \see \ref USB_GetNextDescriptorComp function for more details\r
*/\r
- typedef uint8_t (* const ConfigComparatorPtr_t)(void* const);\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
*\r
* \note This function is available in USB Host mode only.\r
*\r
- * \param BytesRem Pointer to an int storing the remaining bytes in the configuration descriptor\r
- * \param CurrConfigLoc Pointer to the current position in the configuration descriptor\r
- * \param ComparatorRoutine Name of the comparator search function to use on the configuration descriptor\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
*\r
* //...\r
* // After retrieving configuration descriptor:\r
- * if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &ConfigDescriptorData, EndpointSearcher) ==\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, uint8_t** CurrConfigLoc, ConfigComparatorPtr_t ComparatorRoutine);\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
};\r
\r
/* Function Prototypes: */\r
- /** Retrieves the configuration descriptor data or size from an attached device via a standard request.\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 ConfigSizePtr Pointer to a uint16_t for either storing or retrieving the configuration\r
- * descriptor size\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
- * \param BufferPtr Pointer to the buffer for storing the configuration descriptor data. If this is\r
- * NULL, the size of the configuration descriptor will be retrieved instead and\r
- * placed in the variable pointed to by ConfigSizePtr. If this is non-NULL, the number\r
- * of bytes indicated by ConfigSizePtr of the configuration descriptor will be loaded\r
- * into the buffer\r
+ * \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum\r
*/\r
- uint8_t USB_GetDeviceConfigDescriptor(uint16_t* const ConfigSizePtr, void* BufferPtr)\r
- ATTR_NON_NULL_PTR_ARG(1);\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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor\r
- * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor\r
- * \param Type Descriptor type value to search for\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
- uint8_t** const CurrConfigLoc,\r
+ void** const CurrConfigLoc,\r
const uint8_t Type)\r
- ATTR_NON_NULL_PTR_ARG(1, 2);\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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor\r
- * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor\r
- * \param Type Descriptor type value to search for\r
- * \param BeforeType Descriptor type value which must not be reached before the given Type descriptor\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
- uint8_t** const CurrConfigLoc,\r
+ void** const CurrConfigLoc,\r
const uint8_t Type,\r
const uint8_t BeforeType)\r
- ATTR_NON_NULL_PTR_ARG(1, 2);\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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor\r
- * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor\r
- * \param Type Descriptor type value to search for\r
- * \param AfterType Descriptor type value which must be reached before the given Type descriptor\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
- uint8_t** const CurrConfigLoc,\r
+ void** const CurrConfigLoc,\r
const uint8_t Type,\r
const uint8_t AfterType)\r
- ATTR_NON_NULL_PTR_ARG(1, 2);\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 BytesRem Pointer to the number of bytes remaining of the configuration descriptor\r
- * \param CurrConfigLoc Pointer to the current descriptor inside the configuration descriptor\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
- uint8_t** const CurrConfigLoc) \r
- ATTR_NON_NULL_PTR_ARG(1, 2); \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
- uint8_t** const CurrConfigLoc)\r
+ void** const CurrConfigLoc)\r
{\r
- #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)\r
uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;\r
- #else\r
- uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).bLength; \r
- #endif\r
\r
*CurrConfigLoc += CurrDescriptorSize;\r
*BytesRem -= CurrDescriptorSize;\r