*\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
#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