/*\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
this software.\r
*/\r
\r
-/** \file\r
- *\r
- * Module for device mode request processing. This module allows for the processing of standard control\r
- * requests to the default control endpoint while in device mode.\r
- *\r
- * \see Chapter 9 of the USB 2.0 specification.\r
- */\r
-\r
#ifndef __DEVCHAPTER9_H__\r
#define __DEVCHAPTER9_H__\r
\r
#include <avr/io.h>\r
#include <avr/pgmspace.h>\r
#include <avr/eeprom.h>\r
+ #include <avr/boot.h>\r
\r
#include "../HighLevel/StdDescriptors.h"\r
#include "../HighLevel/Events.h"\r
+ #include "../HighLevel/StdRequestType.h"\r
+ #include "../HighLevel/USBTask.h"\r
#include "LowLevel.h"\r
- #include "StdRequestType.h"\r
\r
/* Enable C linkage for C++ Compilers: */\r
#if defined(__cplusplus)\r
#endif\r
\r
/* Public Interface - May be used in end-application: */\r
+ /* Macros: */\r
+ #if defined(USE_SINGLE_DEVICE_CONFIGURATION)\r
+ #define FIXED_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
+ * \ingroup Group_Device\r
*/\r
extern uint8_t USB_ConfigurationNumber;\r
\r
- /** Indicates if the host is currently allowing the device to issue remote wakeup events. If this\r
- * flag is cleared, the device should not issue remote wakeup events to the host.\r
- *\r
- * \note This variable should be treated as read-only in the user application, and never manually\r
- * changed in value.\r
- */\r
- extern bool USB_RemoteWakeupEnabled;\r
+ #if !defined(NO_DEVICE_REMOTE_WAKEUP)\r
+ /** Indicates if the host is currently allowing the device to issue remote wakeup events. If this\r
+ * flag is cleared, the device should not issue remote wakeup events to the host.\r
+ *\r
+ * \note This variable should be treated as read-only in the user application, and never manually\r
+ * changed in value.\r
+ *\r
+ * \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported,\r
+ * this global and the underlying management code can be disabled by defining the \r
+ * NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via\r
+ * the -D switch.\r
+ *\r
+ * \ingroup Group_Device\r
+ */\r
+ extern bool USB_RemoteWakeupEnabled;\r
+ #endif\r
\r
- /** Indicates if the device is currently being powered by its own power supply, rather than being\r
- * powered by the host's USB supply. This flag should remain cleared if the device does not\r
- * support self powered mode, as indicated in the device descriptors.\r
- */\r
- extern bool USB_CurrentlySelfPowered;\r
-\r
- /* Throwable Events: */\r
- /** This module raises the USB_UnhandledControlPacket event when a request to the default control\r
- * endpoint has been received, but the library does not implement an internal handler for it.\r
- *\r
- * \see Events.h for more information on this event.\r
- */\r
- RAISES_EVENT(USB_UnhandledControlPacket);\r
-\r
- /** This module raises the USB_ConfigurationChanged event when the host issues a REQ_SetConfiguration\r
- * device request, to change the currently selected configuration number.\r
- *\r
- * \see Events.h for more information on this event.\r
- */\r
- RAISES_EVENT(USB_ConfigurationChanged);\r
-\r
- /** This module raises the USB_DeviceEnumerationComplete event when the host has completed its\r
- * enumeration of the device (i.e. when a REQ_SetConfiguration request changes the current configuration\r
- * number from 0 to a non-zero value).\r
- *\r
- * \see Events.h for more information on this event.\r
- */\r
- RAISES_EVENT(USB_DeviceEnumerationComplete);\r
+ #if !defined(NO_DEVICE_SELF_POWER)\r
+ /** Indicates if the device is currently being powered by its own power supply, rather than being\r
+ * powered by the host's USB supply. This flag should remain cleared if the device does not\r
+ * support self powered mode, as indicated in the device descriptors.\r
+ *\r
+ * \ingroup Group_Device\r
+ */\r
+ extern bool USB_CurrentlySelfPowered;\r
+ #endif\r
\r
/* Private Interface - For use in library only: */\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
- void USB_Device_ProcessControlPacket(void);\r
+ void USB_Device_ProcessControlRequest(void);\r
\r
#if defined(INCLUDE_FROM_DEVCHAPTER9_C)\r
static void USB_Device_SetAddress(void);\r
static void USB_Device_SetConfiguration(void);\r
static void USB_Device_GetConfiguration(void);\r
static void USB_Device_GetDescriptor(void);\r
- static void USB_Device_GetStatus(const uint8_t bmRequestType);\r
- #if !defined(NO_CLEARSET_FEATURE_REQUEST)\r
- static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmRequestType);\r
- #endif\r
+ static void USB_Device_GetStatus(void);\r
+ static void USB_Device_ClearSetFeature(void);\r
+ \r
+ #if !defined(NO_INTERNAL_SERIAL) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))\r
+ static char USB_Device_NibbleToASCII(uint8_t Nibble) ATTR_ALWAYS_INLINE;\r
+ static void USB_Device_GetInternalSerialDescriptor(void);\r
+ #endif \r
#endif\r
#endif\r
\r