X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/e5e7eaee7af719cee00a8c2cb6fb4649dde0aa05..feabfd12ce3d14b43d2decb2b2f1c5b27e9d6181:/LUFA/Drivers/USB/LowLevel/Endpoint.h diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h index 816e7632a..2c7a064e5 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.h +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h @@ -69,24 +69,24 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ - /** Endpoint data direction mask for Endpoint_ConfigureEndpoint(). This indicates that the endpoint + /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint * should be initialized in the OUT direction - i.e. data flows from host to device. */ #define ENDPOINT_DIR_OUT (0 << EPDIR) - /** Endpoint data direction mask for Endpoint_ConfigureEndpoint(). This indicates that the endpoint + /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint * should be initialized in the IN direction - i.e. data flows from device to host. */ #define ENDPOINT_DIR_IN (1 << EPDIR) - /** Mask for the bank mode selection for the Endpoint_ConfigureEndpoint() macro. This indicates + /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates * that the endpoint should have one single bank, which requires less USB FIFO memory but results * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's * bank at the one time. */ #define ENDPOINT_BANK_SINGLE (0 << EPBK0) - /** Mask for the bank mode selection for the Endpoint_ConfigureEndpoint() macro. This indicates + /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates * that the endpoint should have two banks, which requires more USB FIFO memory but results * in faster transfers as one USB device (the AVR or the host) can access one bank while the other * accesses the second bank. @@ -108,7 +108,7 @@ /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's * numerical address in the device. */ - #define ENDPOINT_EPNUM_MASK 0x03 + #define ENDPOINT_EPNUM_MASK 0x07 /** Endpoint bank size mask, for masking against endpoint addresses to retrieve the endpoint's * bank size in the device. @@ -127,56 +127,19 @@ */ #define ENDPOINT_DOUBLEBANK_SUPPORTED(n) _ENDPOINT_GET_DOUBLEBANK(n) - #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__) - /** Total number of endpoints (including the default control endpoint at address 0) which may - * be used in the device. Different USB AVR models support different amounts of endpoints, - * this value reflects the maximum number of endpoints for the currently selected AVR model. - */ - #define ENDPOINT_TOTAL_ENDPOINTS 7 + #if !defined(CONTROL_ONLY_DEVICE) + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__) + /** Total number of endpoints (including the default control endpoint at address 0) which may + * be used in the device. Different USB AVR models support different amounts of endpoints, + * this value reflects the maximum number of endpoints for the currently selected AVR model. + */ + #define ENDPOINT_TOTAL_ENDPOINTS 7 + #else + #define ENDPOINT_TOTAL_ENDPOINTS 5 + #endif #else - #define ENDPOINT_TOTAL_ENDPOINTS 5 + #define ENDPOINT_TOTAL_ENDPOINTS 1 #endif - - /** Interrupt definition for the endpoint SETUP interrupt (for CONTROL type endpoints). Should be - * used with the USB_INT_* macros located in USBInterrupt.h. - * - * This interrupt will fire if enabled on a CONTROL type endpoint if a new control packet is - * received from the host. - * - * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the - * endpoint is selected), and will fire the common endpoint interrupt vector. - * - * \see ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector. - */ - #define ENDPOINT_INT_SETUP UEIENX, (1 << RXSTPE), UEINTX, (1 << RXSTPI) - - /** Interrupt definition for the endpoint IN interrupt (for INTERRUPT type endpoints). Should be - * used with the USB_INT_* macros located in USBInterrupt.h. - * - * This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt - * period has elapsed and the endpoint is ready for a new packet to be written to its FIFO buffer - * (if required). - * - * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the - * endpoint is selected), and will fire the common endpoint interrupt vector. - * - * \see ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector. - */ - #define ENDPOINT_INT_IN UEIENX, (1 << TXINE) , UEINTX, (1 << TXINI) - - /** Interrupt definition for the endpoint OUT interrupt (for INTERRUPT type endpoints). Should be - * used with the USB_INT_* macros located in USBInterrupt.h. - * - * This interrupt will fire if enabled on an INTERRUPT type endpoint if a the endpoint interrupt - * period has elapsed and the endpoint is ready for a packet from the host to be read from its - * FIFO buffer (if received). - * - * \note This interrupt must be enabled and cleared on *each* endpoint which requires it (after the - * endpoint is selected), and will fire the common endpoint interrupt vector. - * - * \see ENDPOINT_PIPE_vect for more information on the common pipe and endpoint interrupt vector. - */ - #define ENDPOINT_INT_OUT UEIENX, (1 << RXOUTE), UEINTX, (1 << RXOUTI) /* Pseudo-Function Macros: */ #if defined(__DOXYGEN__) @@ -200,7 +163,7 @@ static inline uint8_t Endpoint_GetCurrentEndpoint(void); /** Selects the given endpoint number. If the address from the device descriptors is used, the - * value should be masked with the ENDPOINT_EPNUM_MASK constant to extract only the endpoint + * value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint * number (and discarding the endpoint direction bit). * * Any endpoint operations which do not require the endpoint number to be indicated will operate on @@ -220,8 +183,7 @@ /** Enables the currently selected endpoint so that data can be sent and received through it to * and from a host. * - * \note Endpoints must first be configured properly rather than just being enabled via the - * Endpoint_ConfigureEndpoint() macro, which calls Endpoint_EnableEndpoint() automatically. + * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint(). */ static inline void Endpoint_EnableEndpoint(void); @@ -262,13 +224,6 @@ */ static inline uint8_t Endpoint_GetEndpointInterrupts(void); - /** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt - * mask in the endpoint interrupt flag register. - * - * \param EndpointNumber Index of the endpoint whose interrupt flag should be cleared - */ - static inline void Endpoint_ClearEndpointInterrupt(uint8_t EndpointNumber); - /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type * endpoints). * @@ -330,7 +285,7 @@ * way for devices to indicate invalid commands to the host so that the current transfer can be * aborted and the host can begin its own recovery sequence. * - * The currently selected endpoint remains stalled until either the Endpoint_ClearStall() macro + * The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro * is called, or the host issues a CLEAR FEATURE request to the device for the currently selected * endpoint. * @@ -361,15 +316,23 @@ */ static inline uint8_t Endpoint_GetEndpointDirection(void); #else - #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__) + #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__) #define Endpoint_BytesInEndpoint() UEBCX #else #define Endpoint_BytesInEndpoint() UEBCLX #endif - #define Endpoint_GetCurrentEndpoint() (UENUM & ENDPOINT_EPNUM_MASK) + #if !defined(CONTROL_ONLY_DEVICE) + #define Endpoint_GetCurrentEndpoint() (UENUM & ENDPOINT_EPNUM_MASK) + #else + #define Endpoint_GetCurrentEndpoint() ENDPOINT_CONTROLEP + #endif - #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = epnum; }MACROE + #if !defined(CONTROL_ONLY_DEVICE) + #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = epnum; }MACROE + #else + #define Endpoint_SelectEndpoint(epnum) (void)epnum + #endif #define Endpoint_ResetFIFO(epnum) MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE @@ -379,14 +342,14 @@ #define Endpoint_IsEnabled() ((UECONX & (1 << EPEN)) ? true : false) - #define Endpoint_IsReadWriteAllowed() ((UEINTX & (1 << RWAL)) ? true : false) - + #if !defined(CONTROL_ONLY_DEVICE) + #define Endpoint_IsReadWriteAllowed() ((UEINTX & (1 << RWAL)) ? true : false) + #endif + #define Endpoint_IsConfigured() ((UESTA0X & (1 << CFGOK)) ? true : false) #define Endpoint_GetEndpointInterrupts() UEINT - #define Endpoint_ClearEndpointInterrupt(n) MACROS{ UEINT &= ~(1 << n); }MACROE - #define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << n)) ? true : false) #define Endpoint_IsINReady() ((UEINTX & (1 << TXINI)) ? true : false) @@ -397,11 +360,19 @@ #define Endpoint_ClearSETUP() MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE - #define Endpoint_ClearIN() MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << TXINI)); \ - UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE + #if !defined(CONTROL_ONLY_DEVICE) + #define Endpoint_ClearIN() MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << TXINI)); \ + UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE + #else + #define Endpoint_ClearIN() MACROS{ UEINTX &= ~(1 << TXINI); }MACROE + #endif - #define Endpoint_ClearOUT() MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << RXOUTI)); \ - UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE + #if !defined(CONTROL_ONLY_DEVICE) + #define Endpoint_ClearOUT() MACROS{ uint8_t Temp = UEINTX; UEINTX = (Temp & ~(1 << RXOUTI)); \ + UEINTX = (Temp & ~(1 << FIFOCON)); }MACROE + #else + #define Endpoint_ClearOUT() MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE + #endif #define Endpoint_StallTransaction() MACROS{ UECONX |= (1 << STALLRQ); }MACROE @@ -415,7 +386,7 @@ #endif /* Enums: */ - /** Enum for the possible error return codes of the Endpoint_WaitUntilReady function. + /** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function. * * \ingroup Group_EndpointRW */ @@ -430,7 +401,7 @@ */ ENDPOINT_READYWAIT_Timeout = 3, /**< The host failed to accept or send the next packet * within the software timeout period set by the - * USB_STREAM_TIMEOUT_MS macro. + * \ref USB_STREAM_TIMEOUT_MS macro. */ }; @@ -440,20 +411,20 @@ */ enum Endpoint_Stream_RW_ErrorCodes_t { - ENDPOINT_RWSTREAM_ERROR_NoError = 0, /**< Command completed successfully, no error. */ - ENDPOINT_RWSTREAM_ERROR_EndpointStalled = 1, /**< The endpoint was stalled during the stream - * transfer by the host or device. - */ - ENDPOINT_RWSTREAM_ERROR_DeviceDisconnected = 1, /**< Device was disconnected from the host during - * the transfer. - */ - ENDPOINT_RWSTREAM_ERROR_Timeout = 2, /**< The host failed to accept or send the next packet - * within the software timeout period set by the - * USB_STREAM_TIMEOUT_MS macro. - */ - ENDPOINT_RWSTREAM_ERROR_CallbackAborted = 3, /**< Indicates that the stream's callback function - * aborted the transfer early. - */ + 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 = 1, /**< Device was disconnected from the host during + * the transfer. + */ + ENDPOINT_RWSTREAM_Timeout = 2, /**< 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 = 3, /**< Indicates that the stream's callback function + * aborted the transfer early. + */ }; /** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions.. @@ -462,8 +433,8 @@ */ enum Endpoint_ControlStream_RW_ErrorCodes_t { - ENDPOINT_RWCSTREAM_ERROR_NoError = 0, /**< Command completed successfully, no error. */ - ENDPOINT_RWCSTREAM_ERROR_HostAborted = 1, /**< The aborted the transfer prematurely. */ + ENDPOINT_RWCSTREAM_NoError = 0, /**< Command completed successfully, no error. */ + ENDPOINT_RWCSTREAM_HostAborted = 1, /**< The aborted the transfer prematurely. */ }; /* Inline Functions: */ @@ -700,23 +671,20 @@ /* Function Prototypes: */ /** 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). + * 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 ENDPOINT_DIR_OUT or ENDPOINT_DIR_IN. + * 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 ENDPOINT_BANK_SINGLE or ENDPOINT_BANK_DOUBLE. - * - * The success of this routine can be determined via the Endpoint_IsConfigured() macro. + * The banking mode may be either \ref ENDPOINT_BANK_SINGLE or \ref ENDPOINT_BANK_DOUBLE. * - * By default, the routine is entirely dynamic, and will accept both constant and variable inputs. - * If dynamic configuration is unused, a small space savings can be made by defining the - * STATIC_ENDPOINT_CONFIGURATION macro via the -D switch to the compiler, to optimize for constant - * input values. + * \note The default control endpoint does not have to be manually configured, as it is automatically + * configured by the library internally. * * \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. @@ -726,6 +694,8 @@ bool Endpoint_ConfigureEndpoint(const uint8_t Number, const uint8_t Type, const uint8_t Direction, const uint16_t Size, const uint8_t Banks); + #if !defined(CONTROL_ONLY_DEVICE) + /** Spinloops until the currently selected non-control endpoint is ready for the next packet of data * to be read or written to it. * @@ -733,20 +703,20 @@ * * \ingroup Group_EndpointRW * - * \return A value from the Endpoint_WaitUntilReady_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. */ uint8_t Endpoint_WaitUntilReady(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 Endpoint_ClearOUT() macro. Between + * 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 using the STREAM_CALLBACK() macro. 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. + * 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. * @@ -755,24 +725,24 @@ * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * - * \return A value from the Endpoint_Stream_RW_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. */ uint8_t Endpoint_Discard_Stream(uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) - , uint8_t (* const Callback)(void) + , StreamCallbackPtr_t Callback #endif ); /** 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 - * Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function + * \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 using the STREAM_CALLBACK() macro. 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. + * 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. * @@ -782,24 +752,24 @@ * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * - * \return A value from the Endpoint_Stream_RW_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. */ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) - , uint8_t (* const Callback)(void) + , StreamCallbackPtr_t Callback #endif ) 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 - * Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function + * \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 using the STREAM_CALLBACK() macro. 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. + * 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. * @@ -809,24 +779,24 @@ * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * - * \return A value from the Endpoint_Stream_RW_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. */ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) - , uint8_t (* const Callback)(void) + , StreamCallbackPtr_t Callback #endif ) 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 Endpoint_ClearOUT() macro. Between + * 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 using the STREAM_CALLBACK() macro. 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. + * 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. * @@ -836,24 +806,24 @@ * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * - * \return A value from the Endpoint_Stream_RW_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. */ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) - , uint8_t (* const Callback)(void) + , StreamCallbackPtr_t Callback #endif ) 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 Endpoint_ClearOUT() macro. Between + * 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 using the STREAM_CALLBACK() macro. 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. + * 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. * @@ -863,18 +833,20 @@ * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * - * \return A value from the Endpoint_Stream_RW_ErrorCodes_t enum. + * \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. */ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) - , uint8_t (* const Callback)(void) + , StreamCallbackPtr_t Callback #endif ) ATTR_NON_NULL_PTR_ARG(1); + #endif + /** 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 Endpoint_ClearOUT() macro. + * finalize the transfer via the \ref Endpoint_ClearOUT() macro. * * \note This routine should only be used on CONTROL type endpoints. * @@ -886,14 +858,14 @@ * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * - * \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum. + * \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); /** 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 Endpoint_ClearOUT() macro. + * finalize the transfer via the \ref Endpoint_ClearOUT() macro. * * \note This routine should only be used on CONTROL type endpoints. * @@ -905,14 +877,14 @@ * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * - * \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum. + * \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); /** 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 Endpoint_ClearIN() macro. + * setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro. * * \note This routine should only be used on CONTROL type endpoints. * @@ -924,14 +896,14 @@ * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * - * \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum. + * \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); /** 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 Endpoint_ClearIN() macro. + * setup IN to finalize the transfer via the \ref Endpoint_ClearIN() macro. * * \note This routine should only be used on CONTROL type endpoints. * @@ -943,7 +915,7 @@ * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * - * \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum. + * \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); @@ -961,7 +933,7 @@ #define _ENDPOINT_GET_DOUBLEBANK2(details) _ENDPOINT_GET_DOUBLEBANK3(details) #define _ENDPOINT_GET_DOUBLEBANK3(maxsize, db) db - #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) + #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 @@ -977,38 +949,33 @@ #define ENDPOINT_DETAILS_EP4 64, true #endif - #if defined(STATIC_ENDPOINT_CONFIGURATION) - #define Endpoint_ConfigureEndpoint(Number, Type, Direction, Size, Banks) \ - Endpoint_ConfigureEndpointStatic(Number, \ - ((Type << EPTYPE0) | Direction), \ - ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size))); - #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)))) + /* Function Prototypes: */ - void Endpoint_ClearEndpoints(void); - bool Endpoint_ConfigureEndpointStatic(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData); + 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); /* 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) { - if (Bytes <= 8) - return (0 << EPSIZE0); - else if (Bytes <= 16) - return (1 << EPSIZE0); - else if (Bytes <= 32) - return (2 << EPSIZE0); - #if defined(USB_LIMITED_CONTROLLER) - else - return (3 << EPSIZE0); - #else - else if (Bytes <= 64) - return (3 << EPSIZE0); - else if (Bytes <= 128) - return (4 << EPSIZE0); - else - return (5 << EPSIZE0); - #endif + uint8_t MaskVal = 0; + uint16_t CheckBytes = 8; + + while (CheckBytes < Bytes) + { + MaskVal++; + CheckBytes <<= 1; + } + + return (MaskVal << EPSIZE0); }; #endif