* dispatch header located in LUFA/Drivers/USB/USB.h.
*/
-/** \ingroup Group_USB
- * @defgroup Group_EndpointManagement Endpoint Management
- *
- * Functions, macros and enums related to endpoint management when in USB Device mode. This
- * module contains the endpoint management macros, as well as endpoint interrupt and data
- * send/receive functions for various data types.
- *
- * @{
- */
-
-/** @defgroup Group_EndpointRW Endpoint Data Reading and Writing
+/** \ingroup Group_EndpointManagement
+ * @defgroup Group_EndpointRW Endpoint Data Reading and Writing
*
* Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
*/
-/** \ingroup Group_EndpointRW
+/** \ingroup Group_EndpointRW
* @defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types
*
* Functions, macros, variables, enums and types related to data reading and writing of primitive data types
* from and to endpoints.
*/
-/** \ingroup Group_EndpointRW
- * @defgroup Group_EndpointStreamRW Read/Write of Multi-Byte Streams
+/** \ingroup Group_EndpointManagement
+ * @defgroup Group_EndpointPacketManagement Endpoint Packet Management
*
- * Functions, macros, variables, enums and types related to data reading and writing of data streams from
- * and to endpoints.
- */
+ * Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
-/** @defgroup Group_EndpointPacketManagement Endpoint Packet Management
+/** \ingroup Group_USB
+ * @defgroup Group_EndpointManagement Endpoint Management
*
- * Functions, macros, variables, enums and types related to packet management of endpoints.
+ * Functions, macros and enums related to endpoint management when in USB Device mode. This
+ * module contains the endpoint management macros, as well as endpoint interrupt and data
+ * send/receive functions for various data types.
+ *
+ * @{
*/
#ifndef __ENDPOINT_H__
/* Includes: */
#include <avr/io.h>
- #include <avr/pgmspace.h>
- #include <avr/eeprom.h>
#include <stdbool.h>
#include "../../../Common/Common.h"
#include "../HighLevel/USBTask.h"
#include "USBInterrupt.h"
-
- #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)
- #include "../HighLevel/StreamCallbacks.h"
- #endif
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
#if !defined(__INCLUDE_FROM_USB_DRIVER)
#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
#endif
-
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define _ENDPOINT_GET_MAXSIZE(EPIndex) _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## EPIndex)
+ #define _ENDPOINT_GET_MAXSIZE2(EPDetails) _ENDPOINT_GET_MAXSIZE3(EPDetails)
+ #define _ENDPOINT_GET_MAXSIZE3(MaxSize, DB) (MaxSize)
+
+ #define _ENDPOINT_GET_DOUBLEBANK(EPIndex) _ENDPOINT_GET_DOUBLEBANK2(ENDPOINT_DETAILS_EP ## EPIndex)
+ #define _ENDPOINT_GET_DOUBLEBANK2(EPDetails) _ENDPOINT_GET_DOUBLEBANK3(EPDetails)
+ #define _ENDPOINT_GET_DOUBLEBANK3(MaxSize, DB) (DB)
+
+ #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+ #define ENDPOINT_DETAILS_EP0 64, true
+ #define ENDPOINT_DETAILS_EP1 256, true
+ #define ENDPOINT_DETAILS_EP2 64, true
+ #define ENDPOINT_DETAILS_EP3 64, true
+ #define ENDPOINT_DETAILS_EP4 64, true
+ #define ENDPOINT_DETAILS_EP5 64, true
+ #define ENDPOINT_DETAILS_EP6 64, true
+ #else
+ #define ENDPOINT_DETAILS_EP0 64, true
+ #define ENDPOINT_DETAILS_EP1 64, false
+ #define ENDPOINT_DETAILS_EP2 64, false
+ #define ENDPOINT_DETAILS_EP3 64, true
+ #define ENDPOINT_DETAILS_EP4 64, true
+ #endif
+
+ /* Inline Functions: */
+ static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+ ATTR_ALWAYS_INLINE;
+ static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+ {
+ uint8_t MaskVal = 0;
+ uint16_t CheckBytes = 8;
+
+ while (CheckBytes < Bytes)
+ {
+ MaskVal++;
+ CheckBytes <<= 1;
+ }
+
+ return (MaskVal << EPSIZE0);
+ }
+
+ /* Function Prototypes: */
+ void Endpoint_ClearEndpoints(void);
+ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+ const uint8_t UECFG0XData,
+ const uint8_t UECFG1XData);
+
+ #endif
+
/* Public Interface - May be used in end-application: */
/* Macros: */
/** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
#define ENDPOINT_CONTROLEP 0
#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
- /** Default size of the default control endpoint's bank, until altered by the Endpoint0Size value
- * in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+ /** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
+ * value in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined.
*/
#define ENDPOINT_CONTROLEP_DEFAULT_SIZE 8
#endif
* \ref USB_STREAM_TIMEOUT_MS macro.
*/
};
-
- /** Enum for the possible error return codes of the Endpoint_*_Stream_* functions.
+
+ /* Inline Functions: */
+ /** Configures the specified endpoint number with the given endpoint type, direction, bank size
+ * and banking mode. Once configured, the endpoint may be read from or written to, depending
+ * on its direction.
*
- * \ingroup Group_EndpointStreamRW
- */
- enum Endpoint_Stream_RW_ErrorCodes_t
- {
- ENDPOINT_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */
- ENDPOINT_RWSTREAM_EndpointStalled = 1, /**< The endpoint was stalled during the stream
- * transfer by the host or device.
- */
- ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
- * the transfer.
- */
- ENDPOINT_RWSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
- * no USB endpoint traffic can occur until the bus
- * has resumed.
- */
- ENDPOINT_RWSTREAM_Timeout = 4, /**< The host failed to accept or send the next packet
- * within the software timeout period set by the
- * \ref USB_STREAM_TIMEOUT_MS macro.
- */
- ENDPOINT_RWSTREAM_CallbackAborted = 5, /**< Indicates that the stream's callback function
- * aborted the transfer early.
- */
- };
-
- /** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions..
+ * \param[in] Number Endpoint number to configure. This must be more than 0 and less than
+ * \ref ENDPOINT_TOTAL_ENDPOINTS.
+ *
+ * \param[in] Type Type of endpoint to configure, a EP_TYPE_* mask. Not all endpoint types
+ * are available on Low Speed USB devices - refer to the USB 2.0 specification.
+ *
+ * \param[in] Direction Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
+ * All endpoints (except Control type) are unidirectional - data may only be read
+ * from or written to the endpoint bank based on its direction, not both.
+ *
+ * \param[in] Size Size of the endpoint's bank, where packets are stored before they are transmitted
+ * to the USB host, or after they have been received from the USB host (depending on
+ * the endpoint's data direction). The bank size must indicate the maximum packet size
+ * that the endpoint can handle.
*
- * \ingroup Group_EndpointStreamRW
+ * \param[in] Banks Number of banks to use for the endpoint being configured, an ENDPOINT_BANK_* mask.
+ * More banks uses more USB DPRAM, but offers better performance. Isochronous type
+ * endpoints <b>must</b> have at least two banks.
+ *
+ * \note Certain models of USB AVR's endpoints may have different maximum packet sizes based on the endpoint's
+ * index - refer to the chosen USB AVR's datasheet to determine the maximum bank size for each endpoint.
+ * \n\n
+ *
+ * \note The default control endpoint should not be manually configured by the user application, as
+ * it is automatically configured by the library internally.
+ * \n\n
+ *
+ * \note This routine will automatically select the specified endpoint upon success. Upon failure, the endpoint
+ * which failed to reconfigure correctly will be selected.
+ *
+ * \return Boolean true if the configuration succeeded, false otherwise.
*/
- enum Endpoint_ControlStream_RW_ErrorCodes_t
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks) ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks)
{
- ENDPOINT_RWCSTREAM_NoError = 0, /**< Command completed successfully, no error. */
- ENDPOINT_RWCSTREAM_HostAborted = 1, /**< The aborted the transfer prematurely. */
- ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
- * the transfer.
- */
- ENDPOINT_RWCSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
- * no USB endpoint traffic can occur until the bus
- * has resumed.
- */
- };
+ return Endpoint_ConfigureEndpoint_Prv(Number, (((Type) << EPTYPE0) | (Direction)),
+ ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size)));
+ }
- /* Inline Functions: */
/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
*
* \note The return width of this function may differ, depending on the maximum endpoint bank size
static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline bool Endpoint_IsINReady(void)
{
- return ((UEINTX & (1 << TXINI)) ? true : false);
+ return ((UEINTX & (1 << TXINI)) ? true : false);
}
/** Determines if the selected OUT endpoint has received new packet.
#endif
/* Function Prototypes: */
- #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__)
- #define __CALLBACK_PARAM , StreamCallbackPtr_t Callback
- #else
- #define __CALLBACK_PARAM
- #endif
-
- /** Configures the specified endpoint number with the given endpoint type, direction, bank size
- * and banking mode. Endpoints should be allocated in ascending order by their address in the
- * device (i.e. endpoint 1 should be configured before endpoint 2 and so on) to prevent fragmentation
- * of the USB FIFO memory.
- *
- * The endpoint type may be one of the EP_TYPE_* macros listed in LowLevel.h and the direction
- * may be either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
- *
- * The bank size must indicate the maximum packet size that the endpoint can handle. Different
- * endpoint numbers can handle different maximum packet sizes - refer to the chosen USB AVR's
- * datasheet to determine the maximum bank size for each endpoint.
- *
- * The banking mode may be either \ref ENDPOINT_BANK_SINGLE or \ref ENDPOINT_BANK_DOUBLE.
- *
- * \note The default control endpoint should not be manually configured by the user application, as
- * it is automatically configured by the library internally.
- * \n\n
- *
- * \note This routine will select the specified endpoint, and the endpoint will remain selected
- * once the routine completes regardless of if the endpoint configuration succeeds.
- *
- * \return Boolean true if the configuration succeeded, false otherwise.
+ /** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
+ * with respect to the data direction. This is a convenience function which can be used to
+ * simplify user control request handling.
*/
- bool Endpoint_ConfigureEndpoint(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Direction,
- const uint16_t Size,
- const uint8_t Banks);
+ void Endpoint_ClearStatusStage(void);
/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
* to be read or written to it.
* \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
*/
uint8_t Endpoint_WaitUntilReady(void);
-
- /** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
- * with respect to the data direction. This is a convenience function which can be used to
- * simplify user control request handling.
- */
- void Endpoint_ClearStatusStage(void);
-
- /** Reads and discards the given number of bytes from the endpoint from the given buffer,
- * discarding fully read packets from the host as needed. The last packet is not automatically
- * discarded once the remaining bytes has been read; the user is responsible for manually
- * discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. Between
- * each USB packet, the given stream callback function is executed repeatedly until the next
- * packet is ready, allowing for early aborts of stream transfers.
- *
- * The callback routine should be created according to the information in \ref Group_StreamCallbacks.
- * If the token NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are
- * disabled and this function has the Callback parameter omitted.
- *
- * \note This routine should not be used on CONTROL type endpoints.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Discard_Stream(uint16_t Length
- __CALLBACK_PARAM);
-
- /** Writes the given number of bytes to the endpoint from the given buffer in little endian,
- * sending full packets to the host as needed. The last packet filled is not automatically sent;
- * the user is responsible for manually sending the last written packet to the host via the
- * \ref Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function
- * is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early
- * aborts of stream transfers.
- *
- * The callback routine should be created according to the information in \ref Group_StreamCallbacks.
- * If the token NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are
- * disabled and this function has the Callback parameter omitted.
- *
- * \note This routine should not be used on CONTROL type endpoints.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Stream_LE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_EStream_LE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().
- *
- * \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_PStream_LE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Writes the given number of bytes to the endpoint from the given buffer in big endian,
- * sending full packets to the host as needed. The last packet filled is not automatically sent;
- * the user is responsible for manually sending the last written packet to the host via the
- * \ref Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function
- * is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early
- * aborts of stream transfers.
- *
- * The callback routine should be created according to the information in \ref Group_StreamCallbacks.
- * If the token NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are
- * disabled and this function has the Callback parameter omitted.
- *
- * \note This routine should not be used on CONTROL type endpoints.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Stream_BE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_EStream_BE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().
- *
- * \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_PStream_BE(const void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Reads the given number of bytes from the endpoint from the given buffer in little endian,
- * discarding fully read packets from the host as needed. The last packet is not automatically
- * discarded once the remaining bytes has been read; the user is responsible for manually
- * discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. Between
- * each USB packet, the given stream callback function is executed repeatedly until the endpoint
- * is ready to accept the next packet, allowing for early aborts of stream transfers.
- *
- * The callback routine should be created according to the information in \ref Group_StreamCallbacks.
- * If the token NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are
- * disabled and this function has the Callback parameter omitted.
- *
- * \note This routine should not be used on CONTROL type endpoints.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Stream_LE(void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Read_Stream_LE().
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to, located in EEPROM memory space.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_EStream_LE(void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Reads the given number of bytes from the endpoint from the given buffer in big endian,
- * discarding fully read packets from the host as needed. The last packet is not automatically
- * discarded once the remaining bytes has been read; the user is responsible for manually
- * discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. Between
- * each USB packet, the given stream callback function is executed repeatedly until the endpoint
- * is ready to accept the next packet, allowing for early aborts of stream transfers.
- *
- * The callback routine should be created according to the information in \ref Group_StreamCallbacks.
- * If the token NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are
- * disabled and this function has the Callback parameter omitted.
- *
- * \note This routine should not be used on CONTROL type endpoints.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Stream_BE(void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Read_Stream_BE().
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to, located in EEPROM memory space.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- * \param[in] Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback.
- *
- * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_EStream_BE(void* Buffer,
- uint16_t Length
- __CALLBACK_PARAM) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
- * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
- * in both failure and success states; the user is responsible for manually clearing the setup OUT to
- * finalize the transfer via the \ref Endpoint_ClearOUT() macro.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_EStream_LE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().
- *
- * \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_PStream_LE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
- * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
- * in both failure and success states; the user is responsible for manually clearing the setup OUT to
- * finalize the transfer via the \ref Endpoint_ClearOUT() macro.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_EStream_BE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().
- *
- * \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[in] Buffer Pointer to the source data buffer to read from.
- * \param[in] Length Number of bytes to read for the currently selected endpoint into the buffer.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Write_Control_PStream_BE(const void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
- * discarding fully read packets from the host as needed. The device IN acknowledgement is not
- * automatically sent after success or failure states; the user is responsible for manually sending the
- * setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Control_EStream_LE(void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
- * discarding fully read packets from the host as needed. The device IN acknowledgement is not
- * automatically sent after success or failure states; the user is responsible for manually sending the
- * setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro.
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().
- *
- * \note This function automatically clears the control transfer's status stage. Do not manually attempt
- * to clear the status stage when using this routine in a control transaction.
- * \n\n
- *
- * \note This routine should only be used on CONTROL type endpoints.
- *
- * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
- * together; i.e. the entire stream data must be read or written at the one time.
- *
- * \ingroup Group_EndpointStreamRW
- *
- * \param[out] Buffer Pointer to the destination data buffer to write to.
- * \param[in] Length Number of bytes to send via the currently selected endpoint.
- *
- * \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
- */
- uint8_t Endpoint_Read_Control_EStream_BE(void* Buffer,
- uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define _ENDPOINT_GET_MAXSIZE(n) _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## n)
- #define _ENDPOINT_GET_MAXSIZE2(details) _ENDPOINT_GET_MAXSIZE3(details)
- #define _ENDPOINT_GET_MAXSIZE3(maxsize, db) maxsize
-
- #define _ENDPOINT_GET_DOUBLEBANK(n) _ENDPOINT_GET_DOUBLEBANK2(ENDPOINT_DETAILS_EP ## n)
- #define _ENDPOINT_GET_DOUBLEBANK2(details) _ENDPOINT_GET_DOUBLEBANK3(details)
- #define _ENDPOINT_GET_DOUBLEBANK3(maxsize, db) db
-
- #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
- #define ENDPOINT_DETAILS_EP0 64, true
- #define ENDPOINT_DETAILS_EP1 256, true
- #define ENDPOINT_DETAILS_EP2 64, true
- #define ENDPOINT_DETAILS_EP3 64, true
- #define ENDPOINT_DETAILS_EP4 64, true
- #define ENDPOINT_DETAILS_EP5 64, true
- #define ENDPOINT_DETAILS_EP6 64, true
- #else
- #define ENDPOINT_DETAILS_EP0 64, true
- #define ENDPOINT_DETAILS_EP1 64, false
- #define ENDPOINT_DETAILS_EP2 64, false
- #define ENDPOINT_DETAILS_EP3 64, true
- #define ENDPOINT_DETAILS_EP4 64, true
- #endif
-
- #define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks) \
- Endpoint_ConfigureEndpoint_Prv((Number), \
- (((Type) << EPTYPE0) | (Direction)), \
- ((1 << ALLOC) | (Banks) | \
- (__builtin_constant_p(Size) ? \
- Endpoint_BytesToEPSizeMask(Size) : \
- Endpoint_BytesToEPSizeMaskDynamic(Size))))
-
- /* Inline Functions: */
- static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
- static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
- {
- uint8_t MaskVal = 0;
- uint16_t CheckBytes = 8;
-
- while (CheckBytes < Bytes)
- {
- MaskVal++;
- CheckBytes <<= 1;
- }
-
- return (MaskVal << EPSIZE0);
- }
-
- /* Function Prototypes: */
- void Endpoint_ClearEndpoints(void);
- uint8_t Endpoint_BytesToEPSizeMaskDynamic(const uint16_t Size);
- bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
- const uint8_t UECFG0XData,
- const uint8_t UECFG1XData);
- #endif
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)