+ /* Public Interface - May be used in end-application: */\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 so that the library can call it to retrieve descriptor data.\r
+ *\r
+ * \param[in] 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[in] wIndex The language ID of the string to return if the \c wValue type indicates\r
+ * \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a\r
+ * class-specific standards.\r
+ * \param[out] DescriptorAddress Pointer to the descriptor in memory. This should be set by the routine to\r
+ * the address of the descriptor.\r
+ * \param[out] MemoryAddressSpace A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory\r
+ * space in which the descriptor is stored. This parameter does not exist when one\r
+ * of the \c USE_*_DESCRIPTORS compile time options is used.\r
+ *\r
+ * \note By default, the library expects all descriptors to be located in flash memory via the \c 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 \c USE_RAM_DESCRIPTORS or the\r
+ * \c 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 \ref NO_DESCRIPTOR otherwise.\r
+ */\r
+ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
+ const uint8_t wIndex,\r
+ const void** const DescriptorAddress\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ , uint8_t* MemoryAddressSpace\r
+ #endif\r
+ ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
+\r