this software.\r
*/\r
\r
-/** \file\r
+/** \ingroup Group_USB\r
+ * @defgroup Group_Descriptors USB Descriptors\r
*\r
* Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains\r
* structures and macros for the easy creation of standard USB descriptors in USB device projects.\r
* descriptors will contain elements named identically to the official USB specification. The alternately\r
* named descriptor elements are placed in the same order inside the descriptor structures as their officially\r
* named counterparts, thus they can be correlated easily with the official USB specification.\r
+ *\r
+ * @{\r
*/\r
-\r
+ \r
#ifndef __USBDESCRIPTORS_H__\r
#define __USBDESCRIPTORS_H__\r
\r
* descriptor does not exist.\r
*/\r
#define NO_DESCRIPTOR 0\r
+\r
+ #if (!defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) || defined(__DOXYGEN__)\r
+ /** String descriptor index for the device's unique serial number string descriptor within the device.\r
+ * This unique serial number is used by the host to associate resources to the device (such as drivers or COM port\r
+ * number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain\r
+ * a unique serial number internally, and setting the device descriptors serial number string index to this value\r
+ * will cause it to use the internal serial number.\r
+ *\r
+ * On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseduo-serial\r
+ * number for the device.\r
+ */\r
+ #define USE_INTERNAL_SERIAL 0xDC\r
+ #else\r
+ #define USE_INTERNAL_SERIAL NO_DESCRIPTOR\r
+ #endif\r
\r
/** Macro to calculate the power value for the device descriptor, from a given number of milliamps. */\r
- #define USB_CONFIG_POWER_MA(x) (x >> 1)\r
+ #define USB_CONFIG_POWER_MA(mA) (mA >> 1)\r
\r
/** Macro to calculate the Unicode length of a string with a given number of Unicode characters.\r
* Should be used in string descriptor's headers for giving the string descriptor's byte length.\r
*/\r
- #define USB_STRING_LEN(x) (sizeof(USB_Descriptor_Header_t) + (x << 1))\r
+ #define USB_STRING_LEN(str) (sizeof(USB_Descriptor_Header_t) + (str << 1))\r
\r
/** Macro to encode a given four digit floating point version number (e.g. 01.23) into Binary Coded\r
* Decimal format for descriptor fields requiring BCD encoding, such as the USB version number in the\r
#define VERSION_BCD(x) ((((VERSION_TENS(x) << 4) | VERSION_ONES(x)) << 8) | \\r
((VERSION_TENTHS(x) << 4) | VERSION_HUNDREDTHS(x)))\r
\r
- /** String language ID for the English language. Should be used in USB_Descriptor_Language_t descriptors\r
+ /** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors\r
* to indicate that the English language is supported by the device in its string descriptors.\r
*/\r
#define LANGUAGE_ID_ENG 0x0409\r
\r
- /** Can be masked with an endpoint address for a USB_Descriptor_Endpoint_t endpoint descriptor's\r
+ /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's\r
* EndpointAddress value to indicate to the host that the endpoint is of the IN direction (i.e, from\r
* device to host).\r
*/\r
#define ENDPOINT_DESCRIPTOR_DIR_IN 0x80\r
\r
- /** Can be masked with an endpoint address for a USB_Descriptor_Endpoint_t endpoint descriptor's\r
+ /** Can be masked with an endpoint address for a \ref USB_Descriptor_Endpoint_t endpoint descriptor's\r
* EndpointAddress value to indicate to the host that the endpoint is of the OUT direction (i.e, from\r
* host to device).\r
*/\r
#define ENDPOINT_DESCRIPTOR_DIR_OUT 0x00 \r
\r
- /** Can be masked with other configuration descriptor attributes for a USB_Descriptor_Configuration_Header_t\r
+ /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t\r
* descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power\r
* from the host's VBUS line.\r
*/\r
#define USB_CONFIG_ATTR_BUSPOWERED 0x80\r
\r
- /** Can be masked with other configuration descriptor attributes for a USB_Descriptor_Configuration_Header_t\r
+ /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t\r
* descriptor's ConfigAttributes value to indicate that the specified configuration can draw its power\r
* from the device's own power source.\r
*/\r
#define USB_CONFIG_ATTR_SELFPOWERED 0xC0\r
\r
- /** Can be masked with other configuration descriptor attributes for a USB_Descriptor_Configuration_Header_t\r
+ /** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t\r
* descriptor's ConfigAttributes value to indicate that the specified configuration supports the\r
* remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon\r
* request.\r
*/\r
#define USB_CONFIG_ATTR_REMOTEWAKEUP 0xA0\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is not synchronized.\r
*\r
* \see The USB specification for more details on the possible Endpoint attributes.\r
*/\r
#define ENDPOINT_ATTR_NO_SYNC (0 << 2)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is asynchronous.\r
*\r
* \see The USB specification for more details on the possible Endpoint attributes.\r
*/\r
#define ENDPOINT_ATTR_ASYNC (1 << 2)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is adaptive.\r
*\r
* \see The USB specification for more details on the possible Endpoint attributes.\r
*/\r
#define ENDPOINT_ATTR_ADAPTIVE (2 << 2)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is synchronized.\r
*\r
* \see The USB specification for more details on the possible Endpoint attributes.\r
*/\r
#define ENDPOINT_ATTR_SYNC (3 << 2)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is used for data transfers.\r
*\r
* \see The USB specification for more details on the possible Endpoint usage attributes.\r
*/\r
#define ENDPOINT_USAGE_DATA (0 << 4)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is used for feedback.\r
*\r
* \see The USB specification for more details on the possible Endpoint usage attributes.\r
*/\r
#define ENDPOINT_USAGE_FEEDBACK (1 << 4)\r
\r
- /** Can be masked with other endpoint descriptor attributes for a USB_Descriptor_Endpoint_t descriptor's\r
+ /** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's\r
* Attributes value to indicate that the specified endpoint is used for implicit feedback.\r
*\r
* \see The USB specification for more details on the possible Endpoint usage attributes.\r
*/\r
#define ENDPOINT_USAGE_IMPLICIT_FEEDBACK (2 << 4)\r
\r
- /** Gives a void pointer to the specified descriptor (of any type). */\r
- #define DESCRIPTOR_ADDRESS(Descriptor) ((void*)&Descriptor)\r
-\r
- /* Events: */\r
- #if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)\r
- /** This module raises the Device Error event while in device mode, if the USB_GetDescriptor()\r
- * routine is not hooked in the user application to properly return descriptors to the library.\r
- *\r
- * \see Events.h for more information on this event.\r
- */\r
- RAISES_EVENT(USB_DeviceError);\r
- #endif\r
- \r
/* Enums: */\r
/** Enum for the possible standard descriptor types, as given in each descriptor's header. */\r
enum USB_DescriptorTypes_t\r
/* Type Defines: */\r
/** Type define for all descriptor's header, indicating the descriptor's length and type.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
#if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) || defined(__DOXYGEN__)\r
uint8_t Size; /**< Size of the descriptor, in bytes. */\r
- uint8_t Type; /**< Type of the descriptor, either a value in DescriptorTypes_t or a value\r
+ uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value\r
* given by the specific class.\r
*/\r
#else\r
\r
/** Type define for a standard device descriptor.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
* host will request this string via a separate\r
* control request for the string descriptor.\r
*\r
- * \note If no string supplied, use NO_DESCRIPTOR.\r
+ * \note If no string supplied, use \ref NO_DESCRIPTOR.\r
*/\r
uint8_t ProductStrIndex; /**< String index for the product name/details.\r
*\r
uint8_t SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal\r
* serial number, in uppercase Unicode ASCII.\r
*\r
+ * \note On some AVR models, there is an embedded serial number\r
+ * in the chip which can be used for the device serial number.\r
+ * To use this serial number, set this to USE_INTERNAL_SERIAL.\r
+ * On unsupported devices, this will evaluate to 0 and will cause\r
+ * the host to generate a pseudo-unique value for the device upon\r
+ * insertion.\r
+ *\r
* \see ManufacturerStrIndex structure entry.\r
*/\r
\r
\r
/** Type define for a standard configuration descriptor.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
*/\r
\r
uint8_t MaxPowerConsumption; /**< Maximum power consumption of the device while in the\r
- * current configuration, calculated by the USB_CONFIG_POWER_MA()\r
+ * current configuration, calculated by the \ref USB_CONFIG_POWER_MA()\r
* macro.\r
*/\r
#else\r
\r
/** Type define for a standard interface descriptor.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
#endif\r
} USB_Descriptor_Interface_t;\r
\r
- /** Type define for a standard interface association descriptor.\r
+ /** Type define for a standard Interface Association descriptor.\r
*\r
* This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at\r
* <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows compound\r
* together at the point of enumeration, loading one generic driver for all the interfaces in the single\r
* function. Read the ECN for more information.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
\r
/** Type define for a standard endpoint descriptor.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
} USB_Descriptor_Endpoint_t;\r
\r
/** Type define for a standard string descriptor. Unlike other standard descriptors, the length\r
- * of the descriptor for placement in the descriptor header must be determined by the USB_STRING_LEN()\r
+ * of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()\r
* macro rather than by the size of the descriptor structure, as the length is not fixed.\r
*\r
* This structure should also be used for string index 0, which contains the supported language IDs for\r
* the device as an array.\r
*\r
- * \note The non-standard structure element names are documented here - see the StdDescriptors.h file\r
- * documentation for more information on the two descriptor naming schemes. If the\r
- * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements with names\r
- * identical to those listed in the USB standard.\r
+ * \note The non-standard structure element names are documented here. If the\r
+ * USE_NONSTANDARD_DESCRIPTOR_NAMES token is not set, this structure contains elements \r
+ * with names identical to those listed in the USB standard.\r
*/\r
typedef struct\r
{\r
int16_t bString[];\r
#endif\r
} USB_Descriptor_String_t;\r
- \r
- typedef struct\r
- {\r
- uint16_t Size;\r
- void* Address;\r
- } USB_Descriptor_Details_t;\r
-\r
- /* Function Prototypes: */\r
- /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,\r
- * index and language ID. This function MUST be overridden in the user application (added with full, identical \r
- * prototype and name except for the ATTR_WEAK attribute) so that the library can call it to retrieve descriptor \r
- * data.\r
- *\r
- * \param wValue The type of the descriptor to retrieve in the upper byte, and the index in the \r
- * lower byte (when more than one descriptor of the given type exists, such as the\r
- * case of string descriptors). The type may be one of the standard types defined\r
- * in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.\r
- * \param wIndex The language ID of the string to return if the wValue type indicates DTYPE_String,\r
- * otherwise zero for standard descriptors, or as defined in a class-specific\r
- * standards.\r
- * \param DescriptorAddress Pointer to the descriptor in memory. This should be set by the routine to\r
- * the location of the descriptor, found by the DESCRIPTOR_ADDRESS macro.\r
- *\r
- * \note By default, the library expects all descriptors to be located in flash memory via the PROGMEM attribute.\r
- * If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to\r
- * allow the descriptors to be changed dynamically at runtime) either the USE_RAM_DESCRIPTORS or the \r
- * USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D\r
- * switch.\r
- *\r
- * \return Size in bytes of the descriptor if it exists, zero or NO_DESCRIPTOR otherwise\r
- */\r
- uint16_t USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress)\r
- ATTR_WARN_UNUSED_RESULT ATTR_WEAK ATTR_NON_NULL_PTR_ARG(3);\r
\r
/* Private Interface - For use in library only: */\r
#if !defined(__DOXYGEN__)\r
#if defined(__cplusplus)\r
}\r
#endif\r
- \r
+ \r
#endif\r
+\r
+/** @} */\r