Remove incorrect Abstract Call Management class specific descriptor from the CDC...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / LowLevel.h
index 3c98c6d..efa605b 100644 (file)
   this software.\r
 */\r
 \r
+/** \file\r
+ *  \brief USB low level USB controller definitions.\r
+ *\r
+ *  This file contains structures, function prototypes and macros related to the low level configutation of the\r
+ *  USB controller, to start, stop and reset the USB library core.\r
+ *\r
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
+ */\r
\r
 /** \ingroup Group_USB\r
  *  @defgroup Group_USBManagement USB Interface Management\r
  *\r
 #ifndef __USBLOWLEVEL_H__\r
 #define __USBLOWLEVEL_H__\r
 \r
-       /* External Variables: */\r
-               #if defined(__AVR32__)\r
-                       #if !defined(CONTROL_ONLY_DEVICE)\r
-                               extern uint8_t USB_SelectedEPNumber;\r
-                       #else\r
-                               #define USB_SelectedEPNumber  0\r
-                       #endif\r
-               #endif\r
-       \r
        /* Includes: */\r
-               #if defined(__AVR32__)\r
-                       #include <avr32/io.h>\r
-                       #include <stdint.h>\r
-                       #include <stdbool.h>\r
-               #elif defined(__AVR__)\r
-                       #include <avr/io.h>\r
-                       #include <avr/interrupt.h>\r
-                       #include <stdbool.h>\r
-               #endif\r
-                               \r
+               #include <avr/io.h>\r
+               #include <avr/interrupt.h>\r
+               #include <stdbool.h>\r
+               \r
                #include "../HighLevel/USBMode.h"\r
 \r
                #include "../../../Common/Common.h"\r
                #include "../HighLevel/USBMode.h"\r
                #include "../HighLevel/Events.h"\r
                #include "../HighLevel/USBTask.h"\r
-               #include "../HighLevel/USBInterrupt.h"\r
+               #include "USBInterrupt.h"\r
                \r
                #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)\r
                        #include "Host.h"\r
                #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
                        #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
                #endif\r
-               \r
-               #if defined(__AVR32__)\r
-                       #define USB_PLL_PSC 0\r
-               #elif defined(__AVR__)\r
-                       #if !defined(F_CLOCK)\r
-                               #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.\r
-                       #endif\r
-               \r
-                       #if (F_CLOCK == 8000000)\r
-                               #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
-                                        defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
-                                        defined(__AVR_ATmega32U2__))\r
-                                       #define USB_PLL_PSC                0\r
-                               #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
-                                       #define USB_PLL_PSC                0\r
-                               #elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))\r
-                                       #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))\r
-                               #elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__))\r
-                                       #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))\r
-                               #endif\r
-                       #elif (F_CLOCK == 16000000)\r
-                               #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
-                                        defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
-                                        defined(__AVR_ATmega32U2__))\r
-                                       #define USB_PLL_PSC                (1 << PLLP0)\r
-                               #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
-                                       #define USB_PLL_PSC                (1 << PINDIV)\r
-                               #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))\r
-                                       #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))\r
-                               #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))\r
-                                       #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0))\r
-                               #endif\r
+\r
+               #if !defined(F_CLOCK)\r
+                       #error F_CLOCK is not defined. You must define F_CLOCK to the frequency of the unprescaled input clock in your project makefile.\r
+               #endif\r
+       \r
+               #if (F_CLOCK == 8000000)\r
+                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
+                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
+                                defined(__AVR_ATmega32U2__))\r
+                               #define USB_PLL_PSC                0\r
+                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
+                               #define USB_PLL_PSC                0\r
+                       #elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__) || defined(__AVR_ATmega32U6__))\r
+                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))\r
+                       #elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__))\r
+                               #define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))\r
                        #endif\r
-                       \r
-                       #if !defined(USB_PLL_PSC)\r
-                               #error No PLL prescale value available for chosen F_CLOCK value and AVR model.\r
+               #elif (F_CLOCK == 16000000)\r
+                       #if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \\r
+                            defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \\r
+                                defined(__AVR_ATmega32U2__))\r
+                               #define USB_PLL_PSC                (1 << PLLP0)\r
+                       #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))\r
+                               #define USB_PLL_PSC                (1 << PINDIV)\r
+                       #elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__) || defined(__AVR_ATmega32U6__))\r
+                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))\r
+                       #elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))\r
+                               #define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0))\r
                        #endif\r
                #endif\r
                \r
+               #if !defined(USB_PLL_PSC)\r
+                       #error No PLL prescale value available for chosen F_CPU value and AVR model.\r
+               #endif\r
+               \r
        /* Public Interface - May be used in end-application: */\r
                /* Macros: */\r
                        /** Mode mask for the \ref USB_CurrentMode global. This indicates that the USB interface is currently not\r
                                 *\r
                                 *  \note This token is not available on AVR models which do not support both host and device modes.\r
                                 */\r
-                               #define USB_MODE_UID                   3\r
+                               #define USB_MODE_UID                       3\r
                        #endif\r
                        \r
                        /** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad\r
                                 *\r
                                 *  \note This token is not available on some AVR models which do not support hardware VBUS monitoring.\r
                                 */\r
-                               #define USB_VBUS_GetStatus()        ((USBSTA & (1 << VBUS)) ? true : false)\r
+                               #define USB_VBUS_GetStatus()             ((USBSTA & (1 << VBUS)) ? true : false)\r
                        #endif\r
 \r
                        /** Detaches the device from the USB bus. This has the effect of removing the device from any\r
                         *  allow for device connection to a host when in device mode, or for device enumeration while in\r
                         *  host mode.\r
                         *\r
-                        *  As the USB library relies on USB interrupts for some of its functionality, this routine will\r
-                        *  enable global interrupts.\r
+                        *  As the USB library relies on interrupts for the device and host mode enumeration processes,\r
+                        *  the user must enable global interrupts before or shortly after this function is called. In\r
+                        *  device mode, interrupts must be enabled within 500ms of this function being called to ensure\r
+                        *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be\r
+                        *  enabled at the application's leisure however enumeration will not begin of an attached device\r
+                        *  until after this has occurred.\r
                         *\r
                         *  Calling this function when the USB interface is already initialized will cause a complete USB\r
                         *  interface reset and re-enumeration.\r
                         *                      mode speed.\r
                         *\r
                         *  \note To reduce the FLASH requirements of the library if only device or host mode is required, \r
-                        *        this can be statically set via defining the token USB_DEVICE_ONLY for device mode or \r
-                        *        USB_HOST_ONLY for host mode in the use project makefile, passing the token to the compiler \r
+                        *        the mode can be statically set in the project makefile by defining the token USB_DEVICE_ONLY\r
+                        *        (for device mode) or USB_HOST_ONLY (for host mode), passing the token to the compiler \r
                         *        via the -D switch. If the mode is statically set, this parameter does not exist in the\r
                         *        function prototype.\r
+                        *        \n\n\r
                         *\r
                         *  \note To reduce the FLASH requirements of the library if only fixed settings are are required,\r
                         *        the options may be set statically in the same manner as the mode (see the Mode parameter of \r
                         *        this function). To statically set the USB options, pass in the USE_STATIC_OPTIONS token,\r
                         *        defined to the appropriate options masks. When the options are statically set, this\r
                         *        parameter does not exist in the function prototype.\r
+                        *        \n\n\r
                         *        \r
                         *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB \r
                         *        AVR models which only implement the USB device mode in hardware.\r
                        #define USB_Controller_Disable()   MACROS{ USBCON  &= ~(1 << USBE);                 }MACROE\r
                        #define USB_Controller_Reset()     MACROS{ const uint8_t Temp = USBCON; USBCON = (Temp & ~(1 << USBE)); \\r
                                                                   USBCON = (Temp | (1 << USBE));           }MACROE\r
+       \r
                /* Inline Functions: */\r
                        #if defined(USB_CAN_BE_BOTH)\r
                        static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;\r
                        static inline uint8_t USB_GetUSBModeFromUID(void)\r
                        {\r
-                               #if defined(__AVR32__)\r
-                               if (AVR32_USBB.USBSTA.id)\r
-                                 return USB_MODE_DEVICE;\r
-                               else\r
-                                 return USB_MODE_HOST;                         \r
-                               #elif defined(__AVR__)\r
                                if (USBSTA & (1 << ID))\r
                                  return USB_MODE_DEVICE;\r
                                else\r
                                  return USB_MODE_HOST;\r
-                               #endif\r
                        }\r
                        #endif\r
                        \r