#else\r
#define ENDPOINT_TOTAL_ENDPOINTS 1\r
#endif\r
-\r
- /** Interrupt definition for the endpoint SETUP interrupt (for CONTROL type endpoints). Should be\r
- * used with the USB_INT_* macros located in USBInterrupt.h.\r
- *\r
- * This interrupt will fire if enabled on a CONTROL type endpoint if a new control packet is\r
- * received from the host.\r
- *\r
- * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the\r
- * endpoint is selected), and will fire the common endpoint interrupt vector.\r
- *\r
- * \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
- */\r
- #define ENDPOINT_INT_SETUP UEIENX, (1 << RXSTPE), UEINTX, (1 << RXSTPI)\r
-\r
- /** Interrupt definition for the endpoint IN interrupt (for INTERRUPT type endpoints). Should be\r
- * used with the USB_INT_* macros located in USBInterrupt.h.\r
- *\r
- * This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt\r
- * period has elapsed and the endpoint is ready for a new packet to be written to its FIFO buffer\r
- * (if required).\r
- *\r
- * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the\r
- * endpoint is selected), and will fire the common endpoint interrupt vector.\r
- *\r
- * \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
- */\r
- #define ENDPOINT_INT_IN UEIENX, (1 << TXINE) , UEINTX, (1 << TXINI)\r
-\r
- /** Interrupt definition for the endpoint OUT interrupt (for INTERRUPT type endpoints). Should be\r
- * used with the USB_INT_* macros located in USBInterrupt.h.\r
- *\r
- * This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt\r
- * period has elapsed and the endpoint is ready for a packet from the host to be read from its\r
- * FIFO buffer (if received).\r
- *\r
- * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the\r
- * endpoint is selected), and will fire the common endpoint interrupt vector.\r
- *\r
- * \see \ref ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector.\r
- */\r
- #define ENDPOINT_INT_OUT UEIENX, (1 << RXOUTE), UEINTX, (1 << RXOUTI)\r
\r
/* Pseudo-Function Macros: */\r
#if defined(__DOXYGEN__)\r
*/\r
static inline uint8_t Endpoint_GetEndpointInterrupts(void);\r
\r
- /** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt\r
- * mask in the endpoint interrupt flag register.\r
- *\r
- * \param EndpointNumber Index of the endpoint whose interrupt flag should be cleared\r
- */\r
- static inline void Endpoint_ClearEndpointInterrupt(uint8_t EndpointNumber);\r
- \r
/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type\r
* endpoints).\r
*\r
\r
#define Endpoint_GetEndpointInterrupts() UEINT\r
\r
- #define Endpoint_ClearEndpointInterrupt(n) MACROS{ UEINT &= ~(1 << n); }MACROE\r
-\r
#define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << n)) ? true : false)\r
\r
#define Endpoint_IsINReady() ((UEINTX & (1 << TXINI)) ? true : false)\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
#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