Fixed bug in RNDISEthernet and DualCDC demos not using the correct USB_ControlRequest...
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.h
index 172ab33..aa5005a 100644 (file)
                         */                             \r
                        #define ENDPOINT_DOUBLEBANK_SUPPORTED(n)      _ENDPOINT_GET_DOUBLEBANK(n)\r
 \r
-                       #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__)\r
-                               /** Total number of endpoints (including the default control endpoint at address 0) which may\r
-                                *  be used in the device. Different USB AVR models support different amounts of endpoints,\r
-                                *  this value reflects the maximum number of endpoints for the currently selected AVR model.\r
-                                */\r
-                               #define ENDPOINT_TOTAL_ENDPOINTS          7\r
+                       #if !defined(CONTROL_ONLY_DEVICE)\r
+                               #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__)\r
+                                       /** Total number of endpoints (including the default control endpoint at address 0) which may\r
+                                        *  be used in the device. Different USB AVR models support different amounts of endpoints,\r
+                                        *  this value reflects the maximum number of endpoints for the currently selected AVR model.\r
+                                        */\r
+                                       #define ENDPOINT_TOTAL_ENDPOINTS          7\r
+                               #else\r
+                                       #define ENDPOINT_TOTAL_ENDPOINTS          5                     \r
+                               #endif\r
                        #else\r
-                               #define ENDPOINT_TOTAL_ENDPOINTS          5                     \r
+                               #define ENDPOINT_TOTAL_ENDPOINTS              1\r
                        #endif\r
 \r
                        /** Interrupt definition for the endpoint SETUP interrupt (for CONTROL type endpoints). Should be\r
                                        #define Endpoint_BytesInEndpoint()        UEBCLX\r
                                #endif\r
                                \r
-                               #define Endpoint_GetCurrentEndpoint()         (UENUM & ENDPOINT_EPNUM_MASK)\r
+                               #if !defined(CONTROL_ONLY_DEVICE)\r
+                                       #define Endpoint_GetCurrentEndpoint()     (UENUM & ENDPOINT_EPNUM_MASK)\r
+                               #else\r
+                                       #define Endpoint_GetCurrentEndpoint()     ENDPOINT_CONTROLEP\r
+                               #endif\r
                                \r
-                               #define Endpoint_SelectEndpoint(epnum)        MACROS{ UENUM = epnum; }MACROE\r
+                               #if !defined(CONTROL_ONLY_DEVICE)\r
+                                       #define Endpoint_SelectEndpoint(epnum)    MACROS{ UENUM = epnum; }MACROE\r
+                               #else\r
+                                       #define Endpoint_SelectEndpoint(epnum)    (void)epnum\r
+                               #endif\r
 \r
                                #define Endpoint_ResetFIFO(epnum)             MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE\r
 \r
 \r
                                #define Endpoint_IsEnabled()                  ((UECONX & (1 << EPEN)) ? true : false)\r
 \r
-                               #define Endpoint_IsReadWriteAllowed()         ((UEINTX & (1 << RWAL)) ? true : false)\r
-\r
+                               #if !defined(CONTROL_ONLY_DEVICE)\r
+                                       #define Endpoint_IsReadWriteAllowed()     ((UEINTX & (1 << RWAL)) ? true : false)\r
+                               #endif\r
+                               \r
                                #define Endpoint_IsConfigured()               ((UESTA0X & (1 << CFGOK)) ? true : false)\r
 \r
                                #define Endpoint_GetEndpointInterrupts()      UEINT\r
 \r
                                #define Endpoint_ClearSETUP()                 MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE\r
 \r
-                               #define Endpoint_ClearIN()                    MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << TXINI)); \\r
-                                                                                     UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE\r
+                               #if !defined(CONTROL_ONLY_DEVICE)\r
+                                       #define Endpoint_ClearIN()                MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << TXINI)); \\r
+                                                                                         UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE\r
+                               #else\r
+                                       #define Endpoint_ClearIN()                MACROS{ UEINTX &= ~(1 << TXINI); }MACROE\r
+                               #endif\r
 \r
-                               #define Endpoint_ClearOUT()                   MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << RXOUTI)); \\r
-                                                                                     UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE\r
+                               #if !defined(CONTROL_ONLY_DEVICE)\r
+                                       #define Endpoint_ClearOUT()               MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << RXOUTI)); \\r
+                                                                                         UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE\r
+                               #else\r
+                                       #define Endpoint_ClearOUT()               MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE                     \r
+                               #endif\r
 \r
                                #define Endpoint_StallTransaction()           MACROS{ UECONX |= (1 << STALLRQ); }MACROE\r
 \r
                         */\r
                        enum Endpoint_Stream_RW_ErrorCodes_t\r
                        {\r
-                               ENDPOINT_RWSTREAM_ERROR_NoError            = 0, /**< Command completed successfully, no error. */\r
-                               ENDPOINT_RWSTREAM_ERROR_EndpointStalled    = 1, /**< The endpoint was stalled during the stream\r
-                                                                                *   transfer by the host or device.\r
-                                                                                */\r
-                               ENDPOINT_RWSTREAM_ERROR_DeviceDisconnected = 1, /**< Device was disconnected from the host during\r
-                                                                                *   the transfer.\r
-                                                                                */\r
-                               ENDPOINT_RWSTREAM_ERROR_Timeout            = 2, /**< The host failed to accept or send the next packet\r
-                                                                                *   within the software timeout period set by the\r
-                                                                                *   \ref USB_STREAM_TIMEOUT_MS macro.\r
-                                                                                */\r
-                               ENDPOINT_RWSTREAM_ERROR_CallbackAborted    = 3, /**< Indicates that the stream's callback function\r
-                                                                            *   aborted the transfer early.\r
-                                                                                */\r
+                               ENDPOINT_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
+                               ENDPOINT_RWSTREAM_EndpointStalled    = 1, /**< The endpoint was stalled during the stream\r
+                                                                          *   transfer by the host or device.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_DeviceDisconnected = 1, /**< Device was disconnected from the host during\r
+                                                                          *   the transfer.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_Timeout            = 2, /**< The host failed to accept or send the next packet\r
+                                                                          *   within the software timeout period set by the\r
+                                                                          *   \ref USB_STREAM_TIMEOUT_MS macro.\r
+                                                                          */\r
+                               ENDPOINT_RWSTREAM_CallbackAborted    = 3, /**< Indicates that the stream's callback function\r
+                                                                      *   aborted the transfer early.\r
+                                                                          */\r
                        };\r
                        \r
                        /** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions..\r
                         */\r
                        enum Endpoint_ControlStream_RW_ErrorCodes_t\r
                        {\r
-                               ENDPOINT_RWCSTREAM_ERROR_NoError            = 0, /**< Command completed successfully, no error. */\r
-                               ENDPOINT_RWCSTREAM_ERROR_HostAborted        = 1, /**< The aborted the transfer prematurely. */\r
+                               ENDPOINT_RWCSTREAM_NoError            = 0, /**< Command completed successfully, no error. */\r
+                               ENDPOINT_RWCSTREAM_HostAborted        = 1, /**< The aborted the transfer prematurely. */\r
                        };\r
 \r
                /* Inline Functions: */\r
                         *\r
                         *  The success of this routine can be determined via the \ref Endpoint_IsConfigured() macro.\r
                         *\r
-                        *  By default, the routine is entirely dynamic, and will accept both constant and variable inputs.\r
-                        *  If dynamic configuration is unused, a small space savings can be made by defining the\r
-                        *  STATIC_ENDPOINT_CONFIGURATION macro via the -D switch to the compiler, to optimize for constant\r
-                        *  input values.\r
-                        *\r
                         *  \note This routine will select the specified endpoint, and the endpoint will remain selected\r
                         *        once the routine completes regardless of if the endpoint configuration succeeds.\r
                         *\r
                        bool Endpoint_ConfigureEndpoint(const uint8_t  Number, const uint8_t Type, const uint8_t Direction,\r
                                                        const uint16_t Size, const uint8_t Banks);\r
 \r
+                       #if !defined(CONTROL_ONLY_DEVICE)\r
+\r
                        /** Spinloops until the currently selected non-control endpoint is ready for the next packet of data\r
                         *  to be read or written to it.\r
                         *\r
                        #endif\r
                                                        ) ATTR_NON_NULL_PTR_ARG(1);\r
 \r
+                       #endif\r
+\r
                        /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,\r
                         *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared\r
                         *  in both failure and success states; the user is responsible for manually clearing the setup OUT to\r
                                #define ENDPOINT_DETAILS_EP4               64,  true                    \r
                        #endif\r
 \r
-                       #if defined(STATIC_ENDPOINT_CONFIGURATION)\r
-                               #define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks)        \\r
-                                                                    Endpoint_ConfigureEndpointStatic(Number,   \\r
-                                                                             ((Type << EPTYPE0) | Direction),  \\r
-                                                                             ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size)));\r
-                       #endif\r
-\r
+                       #define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks)            \\r
+                                                           Endpoint_ConfigureEndpoint_Prv(Number,          \\r
+                                                                     ((Type << EPTYPE0) | Direction),      \\r
+                                                                     ((1 << ALLOC) | Banks |               \\r
+                                                                       (__builtin_constant_p(Size) ?       \\r
+                                                                        Endpoint_BytesToEPSizeMask(Size) :  \\r
+                                                                        Endpoint_BytesToEPSizeMaskDynamic(Size))))\r
+                                                                                                       \r
                /* Function Prototypes: */\r
-                       void Endpoint_ClearEndpoints(void);\r
-                       bool Endpoint_ConfigureEndpointStatic(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData);\r
+                       void    Endpoint_ClearEndpoints(void);\r
+                       uint8_t Endpoint_BytesToEPSizeMaskDynamic(const uint16_t Size);\r
+                       bool    Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData);\r
                        \r
                /* Inline Functions: */\r
                        static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;\r
                        static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)\r
                        {\r
-                               if (Bytes <= 8)\r
-                                 return (0 << EPSIZE0);\r
-                               else if (Bytes <= 16)\r
-                                 return (1 << EPSIZE0);\r
-                               else if (Bytes <= 32)\r
-                                 return (2 << EPSIZE0);\r
-                               #if defined(USB_LIMITED_CONTROLLER)\r
-                               else\r
-                                 return (3 << EPSIZE0);\r
-                               #else\r
-                               else if (Bytes <= 64)\r
-                                 return (3 << EPSIZE0);\r
-                               else if (Bytes <= 128)\r
-                                 return (4 << EPSIZE0);\r
-                               else\r
-                                 return (5 << EPSIZE0);\r
-                               #endif\r
+                               uint8_t  MaskVal    = 0;\r
+                               uint16_t CheckBytes = 8;\r
+                               \r
+                               while (CheckBytes < Bytes)\r
+                               {\r
+                                       MaskVal++;\r
+                                       CheckBytes <<= 1;\r
+                               }\r
+                               \r
+                               return (MaskVal << EPSIZE0);\r
                        };\r
 \r
        #endif\r