Added new USE_FLASH_DESCRIPTORS compile time option. By default, descriptors can now lie in mixed memory spaces (specified by a new parameter to the CALLBACK_USB_GetDescriptor() function) unless one of the USE_*_DESCRIPTORS compile time option is specified.
LUFA_OPTS = -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
-LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
LUFA_OPTS += -D USE_RAM_DESCRIPTORS\r
+LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
LUFA_OPTS += -D NO_INTERNAL_SERIAL\r
\r
\r
LUFA_OPTS += -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D CONTROL_ONLY_DEVICE\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
-LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
LUFA_OPTS += -D USE_RAM_DESCRIPTORS\r
+LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
LUFA_OPTS += -D NO_INTERNAL_SERIAL\r
\r
\r
LUFA_OPTS += -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D CONTROL_ONLY_DEVICE\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
-LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
LUFA_OPTS += -D USE_RAM_DESCRIPTORS\r
+LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
LUFA_OPTS += -D NO_INTERNAL_SERIAL\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
LUFA_OPTS += -D USB_DEVICE_ONLY \r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT\r
\r
{\r
.Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},\r
\r
- .USBSpecification = VERSION_BCD(01.10),\r
+ .USBSpecification = VERSION_BCD(02.00),\r
.Class = 0x00,\r
.SubClass = 0x00,\r
.Protocol = 0x00,\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
LUFA_OPTS += -D NO_STREAM_CALLBACKS\r
LUFA_OPTS += -D USB_DEVICE_ONLY\r
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION\r
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
\r
\r
#define DTYPE_Report 0x22\r
\r
/* Enums: */\r
+ /** Enum for the possible return codes of the ProcessConfigurationDescriptor() function. */\r
enum KeyboardHostWithParser_GetConfigDescriptorDataCodes_t\r
{\r
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */\r
\r
# LUFA library compile-time options\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES\r
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
\r
\r
# List C source files here. (C dependencies are automatically generated.)\r
return;\r
\r
if ((USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) &&\r
- (USB_ControlRequest.bRequest != SetIdle))\r
+ (USB_ControlRequest.bRequest != REQ_SetIdle))\r
{\r
return;\r
}\r
} USB_ClassInfo_CDC_Host_t;\r
\r
/* Enums: */\r
- typedef enum\r
+ enum\r
{\r
CDC_ENUMERROR_NoError = 0, /**< Configuration Descriptor was processed successfully */\r
CDC_ENUMERROR_ControlError = 1, /**< A control request to the device failed to complete successfully */\r
{\r
bool AlreadyConfigured = (USB_ConfigurationNumber != 0);\r
\r
-#if defined(USE_SINGLE_DEVICE_CONFIGURATION)\r
- if ((uint8_t)USB_ControlRequest.wValue > 1)\r
+#if defined(TOTAL_NUM_CONFIGURATIONS)\r
+ if ((uint8_t)USB_ControlRequest.wValue > TOTAL_NUM_CONFIGURATIONS)\r
+ return;\r
#else\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ uint8_t MemoryAddressSpace;\r
+ #endif\r
+ \r
USB_Descriptor_Device_t* DevDescriptorPtr;\r
\r
- if ((CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr) == NO_DESCRIPTOR) ||\r
+ if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ , &MemoryAddressSpace) == NO_DESCRIPTOR)\r
+ #endif\r
+ {\r
+ return;\r
+ }\r
+ \r
#if defined(USE_RAM_DESCRIPTORS)\r
- ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations))\r
+ if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)\r
+ return;\r
#elif defined (USE_EEPROM_DESCRIPTORS)\r
- ((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
+ if ((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations))\r
+ return;\r
+ #elif defined (USE_FLASH_DESCRIPTORS)\r
+ if ((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations))\r
+ return;\r
#else\r
- ((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
- #endif\r
-#endif\r
+ if (MemoryAddressSpace == MEMSPACE_FLASH)\r
{\r
- return;\r
+ if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
+ return;\r
}\r
+ else if (MemoryAddressSpace == MEMSPACE_EEPROM)\r
+ {\r
+ if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))\r
+ return;\r
+ }\r
+ else\r
+ {\r
+ if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)\r
+ return;\r
+ }\r
+ #endif\r
+#endif\r
\r
Endpoint_ClearSETUP();\r
\r
void* DescriptorPointer;\r
uint16_t DescriptorSize;\r
\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ uint8_t DescriptorAddressSpace;\r
+ #endif\r
+ \r
#if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))\r
if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))\r
{\r
#endif\r
\r
if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,\r
- &DescriptorPointer)) == NO_DESCRIPTOR)\r
+ &DescriptorPointer\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ , &DescriptorAddressSpace\r
+ #endif\r
+ )) == NO_DESCRIPTOR)\r
{\r
return;\r
}\r
Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);\r
#elif defined(USE_EEPROM_DESCRIPTORS)\r
Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);\r
- #else\r
+ #elif defined(USE_FLASH_DESCRIPTORS)\r
Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); \r
+ #else\r
+ if (DescriptorAddressSpace == MEMSPACE_FLASH)\r
+ Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); \r
+ else if (DescriptorAddressSpace == MEMSPACE_EEPROM)\r
+ Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);\r
+ else\r
+ Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); \r
#endif\r
\r
Endpoint_ClearOUT();\r
extern "C" {\r
#endif\r
\r
- /* Public Interface - May be used in end-application: */ \r
+ /* Public Interface - May be used in end-application: */\r
+ /* Macros: */\r
+ #if defined(USE_SINGLE_DEVICE_CONFIGURATION)\r
+ #define TOTAL_NUM_CONFIGURATIONS 1\r
+ #endif\r
+ \r
+ /* Enums: */\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ /** Enum for the possible descriptor memory spaces, for the MemoryAddressSpace of the\r
+ * \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the USE_*_DESCRIPTORS\r
+ * compile time options are used, to indicate in which memory space the descriptor is stored.\r
+ *\r
+ * \ingroup Group_Device\r
+ */\r
+ enum USB_DescriptorMemorySpaces_t\r
+ {\r
+ MEMSPACE_FLASH = 0, /**< Indicates the requested descriptor is located in FLASH memory */\r
+ MEMSPACE_EEPROM = 1, /**< Indicates the requested descriptor is located in EEPROM memory */\r
+ MEMSPACE_RAM = 2, /**< Indicates the requested descriptor is located in RAM memory */\r
+ };\r
+ #endif\r
+ \r
/* Global Variables: */\r
/** Indicates the currently set configuration number of the device. USB devices may have several\r
* different configurations which the host can select between; this indicates the currently selected\r
* value, or 0 if no configuration has been selected.\r
*\r
- * If a device has only one single configuration, the token USE_SINGLE_DEVICE_CONFIGURATION may be\r
- * defined in the project makefile and passed to the compiler using the -D switch. This optimize for\r
- * a single configuration, saving a small amount of space in the resulting compiled binary.\r
- *\r
* \note This variable should be treated as read-only in the user application, and never manually\r
* changed in value.\r
*\r
#if !defined(__DOXYGEN__)\r
#if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)\r
#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.\r
+ #elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS)\r
+ #error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive.\r
+ #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)\r
+ #error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.\r
+ #elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)\r
+ #error Only one of the USE_*_DESCRIPTORS modes should be selected.\r
#endif\r
\r
/* Function Prototypes: */\r
* 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 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 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
*\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, const uint8_t wIndex, void** const DescriptorAddress)\r
+ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, const uint8_t wIndex, void** const DescriptorAddress\r
+ #if !defined(USE_FLASH_DESCRIPTORS) && !defined(USE_EEPROM_DESCRIPTORS) && !defined(USE_RAM_DESCRIPTORS)\r
+ , uint8_t* MemoryAddressSpace\r
+ #endif \r
+ )\r
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
\r
/* Private Interface - For use in library only: */\r
* - Added new FAST_STREAM_TRANSFERS compile time option for faster stream transfers via multiple bytes copied per stream loop\r
* - Added stdio stream demo code to the low-level CDC demo, to show how to create standard streams out of the virtual serial ports\r
* - Added new EEPROM and FLASH buffer versions of the Endpoint and Pipe stream functions\r
+ * - Added new USE_FLASH_DESCRIPTORS and TOTAL_NUM_CONFIGURATIONS compile time options\r
* \r
* <b>Changed:</b>\r
* - Deprecated psuedo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused)\r
* - Dataflash_WaitWhileBusy() now always ensures that the dataflash is ready for the next command immediately after returning,\r
* no need to call Dataflash_ToggleSelectedChipCS() afterwards\r
* - Changed F_CLOCK entries in project makefiles to alias to F_CPU by default, as this is the most common case\r
+ * - The device-mode CALLBACK_USB_GetDescriptor() function now has an extra parameter so that the memory space in which the requested\r
+ * descriptor is located can be specified. This means that descriptors can now be located in multiple memory spaces within a device.\r
*\r
* <b>Fixed:</b>\r
* - Changed bootloaders to use FLASHEND rather than the existence of RAMPZ to determine if far FLASH pointers are needed to fix\r
* This section describes compile tokens which affect USB driver stack as a whole in the LUFA library.\r
*\r
* <b>USE_RAM_DESCRIPTORS</b> - ( \ref Group_Descriptors ) \n\r
- * Define this token to indicate to the USB driver that device descriptors are stored in RAM, rather than the default of\r
- * the AVR's flash. RAM descriptors may be desirable in applications where speed or minimizing flash usage is more important\r
- * than RAM usage, or applications where the descriptors need to be modified at runtime.\r
+ * Define this token to indicate to the USB driver that all device descriptors are stored in RAM, rather than being located in any one\r
+ * of the AVR's memory spaces. RAM descriptors may be desirable in applications where the descriptors need to be modified at runtime.\r
+ *\r
+ * <b>USE_FLASH_DESCRIPTORS</b> - ( \ref Group_Descriptors ) \n\r
+ * Similar to USE_RAM_DESCRIPTORS, but all descriptors are stored in the AVR's FLASH memory rather than RAM.\r
*\r
* <b>USE_EEPROM_DESCRIPTORS</b> - ( \ref Group_Descriptors ) \n\r
- * Similar to USE_RAM_DESCRIPTORS, but descriptors are stored in the AVR's EEPROM memory rather than RAM.\r
+ * Similar to USE_RAM_DESCRIPTORS, but all descriptors are stored in the AVR's EEPROM memory rather than RAM.\r
*\r
* <b>USE_NONSTANDARD_DESCRIPTOR_NAMES</b> - ( \ref Group_Descriptors ) \n\r
* The USB 2.0 standard gives some rather obscure names for the elements in the standard descriptor types (device, configuration,\r
* defined to a non-zero value instead to give the size in bytes of the control endpoint, to reduce the size of the compiled\r
* binary.\r
*\r
- * <b>USE_SINGLE_DEVICE_CONFIGURATION</b> - ( \ref Group_Device ) \n\r
+ * <b>TOTAL_NUM_CONFIGURATIONS</b> - ( \ref Group_Device ) \n\r
* By default, the library determines the number of configurations a USB device supports by reading the device descriptor. This reduces\r
* the amount of configuration required to set up the library, and allows the value to change dynamically (if descriptors are stored in\r
- * EEPROM or RAM rather than flash memory) and reduces code maintenance. However, many USB device projects use only a single configuration.\r
- * Defining this token enables single-configuration mode, reducing the compiled size of the binary at the expense of flexibility.\r
+ * EEPROM or RAM rather than flash memory) and reduces code maintenance. However, this value may be fixed via this token in the project\r
+ * makefile to reduce the compiled size of the binary at the expense of flexibility.\r
*\r
* <b>CONTROL_ONLY_DEVICE</b> \n\r
* In some limited USB device applications, there are no device endpoints other than the control endpoint; i.e. all device communication\r
* parameter, to add support for multi-configuration devices. Existing code should use a configuration index of 1 to indicate the\r
* first configuration descriptor within the device.\r
*\r
+ * <b>Device Mode</b>\r
+ * - The \ref CALLBACK_USB_GetDescriptor() function now takes an extra parameter to specify the descriptor's memory space so that\r
+ * descriptors in mixed memory spaces can be used. The previous functionality can be returned by defining the USE_FLASH_DESCRIPTORS\r
+ * token in the project makefile to fix all descriptors into FLASH space and remove the extra function parameter.\r
+ *\r
+ *\r
* \section Sec_Migration090605 Migrating from 090510 to 090605\r
*\r
* <b>Device Mode</b>\r
LUFA_OPTS = -D USE_NONSTANDARD_DESCRIPTOR_NAMES
LUFA_OPTS += -D USB_DEVICE_ONLY
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
-LUFA_OPTS += -D USE_SINGLE_DEVICE_CONFIGURATION
+LUFA_OPTS += -D TOTAL_NUM_CONFIGURATIONS=1
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"