X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/cb779e3d7d32d7c43e0a45bb526de0a04135b0c7..5995c3f880899b2573f1026ed6dc1c3c3a8e93d2:/LUFA/Drivers/USB/LowLevel/Endpoint.h diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h index 54a2d8dd8..9ce1380b4 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.h +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h @@ -1,13 +1,13 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. + Copyright (C) Dean Camera, 2011. dean [at] fourwalledcubicle [dot] com www.lufa-lib.org */ /* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted @@ -146,6 +146,8 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ + /** \name Endpoint Direction Masks */ + //@{ /** 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. */ @@ -155,7 +157,10 @@ * should be initialized in the IN direction - i.e. data flows from device to host. */ #define ENDPOINT_DIR_IN (1 << EPDIR) - + //@} + + /** \name Endpoint Bank Mode Masks */ + //@{ /** 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 @@ -169,7 +174,8 @@ * accesses the second bank. */ #define ENDPOINT_BANK_DOUBLE (1 << EPBK0) - + //@} + /** Endpoint address for the default control endpoint, which always resides in address 0. This is * defined for convenience to give more readable code when used with the endpoint macros. */ @@ -177,7 +183,7 @@ #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) /** 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. + * value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined. */ #define ENDPOINT_CONTROLEP_DEFAULT_SIZE 8 #endif @@ -188,7 +194,7 @@ #define ENDPOINT_EPNUM_MASK 0x07 /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's - * direction for comparing with the ENDPOINT_DESCRIPTOR_DIR_* masks. + * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks. */ #define ENDPOINT_EPDIR_MASK 0x80 @@ -197,15 +203,21 @@ */ #define ENDPOINT_EPSIZE_MASK 0x7F - /** Maximum size in bytes of a given endpoint. + /** Retrives the maximum bank size in bytes of a given endpoint. + * + * \note This macro will only work correctly on endpoint indexes that are compile-time constants + * defined by the preprocessor. * - * \param[in] EPIndex Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1) + * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1) */ #define ENDPOINT_MAX_SIZE(EPIndex) _ENDPOINT_GET_MAXSIZE(EPIndex) - /** Indicates the total number of banks supported by the given endpoint. + /** Retrieves the total number of banks supported by the given endpoint. * - * \param[in] EPIndex Endpoint number, a value between 0 and (ENDPOINT_TOTAL_ENDPOINTS - 1) + * \note This macro will only work correctly on endpoint indexes that are compile-time constants + * defined by the preprocessor. + * + * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1) */ #define ENDPOINT_BANKS_SUPPORTED(EPIndex) _ENDPOINT_GET_BANKS(EPIndex) @@ -251,7 +263,7 @@ * \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 + * \param[in] Type Type of endpoint to configure, a \c 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. @@ -263,11 +275,12 @@ * the endpoint's data direction). The bank size must indicate the maximum packet size * that the endpoint can handle. * - * \param[in] Banks Number of banks to use for the endpoint being configured, an ENDPOINT_BANK_* mask. + * \param[in] Banks Number of banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask. * More banks uses more USB DPRAM, but offers better performance. Isochronous type * endpoints must have at least two banks. * - * \note Endpoints must be configured in ascending order, or bank corruption will occur. + * \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints must be configured in + * ascending order, or bank corruption will occur. * \n\n * * \note Certain models of USB AVR's endpoints may have different maximum packet sizes based on the endpoint's @@ -281,7 +294,7 @@ * \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. + * \return Boolean \c true if the configuration succeeded, \c false otherwise. */ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number, const uint8_t Type, @@ -353,7 +366,7 @@ } /** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's - * In and Out pointers to the bank's contents. + * data In and Out pointers to the bank's contents. * * \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset. */ @@ -386,7 +399,7 @@ /** Determines if the currently selected endpoint is enabled, but not necessarily configured. * - * \return Boolean True if the currently selected endpoint is enabled, false otherwise. + * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise. */ static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsEnabled(void) @@ -394,6 +407,35 @@ return ((UECONX & (1 << EPEN)) ? true : false); } + /** Aborts all pending IN transactions on the currently selected endpoint, once the bank + * has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function + * will terminate all queued transactions, resetting the endpoint banks ready for a new + * packet. + * + * \ingroup Group_EndpointPacketManagement + */ + static inline void Endpoint_AbortPendingIN(void) + { + while (UESTA0X & (0x03 << NBUSYBK0)) + { + UEINTX |= (1 << RXOUTI); + while (UEINTX & (1 << RXOUTI)); + } + } + + /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for + * transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the + * \ref Endpoint_ClearOUT() command. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Total number of busy banks in the selected endpoint. + */ + static inline uint8_t Endpoint_GetBusyBanks(void) + { + return (UESTA0X & (0x03 << NBUSYBK0)); + } + /** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint * bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN * direction). This function will return false if an error has occurred in the endpoint, if the endpoint @@ -402,7 +444,8 @@ * * \ingroup Group_EndpointPacketManagement * - * \return Boolean true if the currently selected endpoint may be read from or written to, depending on its direction. + * \return Boolean \c true if the currently selected endpoint may be read from or written to, depending + * on its direction. */ static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsReadWriteAllowed(void) @@ -412,7 +455,7 @@ /** Determines if the currently selected endpoint is configured. * - * \return Boolean true if the currently selected endpoint has been configured, false otherwise. + * \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise. */ static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsConfigured(void) @@ -422,7 +465,7 @@ /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their * interrupt duration has elapsed. Which endpoints have interrupted can be determined by - * masking the return value against (1 << {Endpoint Number}). + * masking the return value against (1 << {Endpoint Number}). * * \return Mask whose bits indicate which endpoints have interrupted. */ @@ -437,7 +480,7 @@ * * \param[in] EndpointNumber Index of the endpoint whose interrupt flag should be tested. * - * \return Boolean true if the specified endpoint has interrupted, false otherwise. + * \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise. */ static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) @@ -449,7 +492,7 @@ * * \ingroup Group_EndpointPacketManagement * - * \return Boolean true if the current endpoint is ready for an IN packet, false otherwise. + * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. */ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsINReady(void) @@ -461,7 +504,7 @@ * * \ingroup Group_EndpointPacketManagement * - * \return Boolean true if current endpoint is has received an OUT packet, false otherwise. + * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. */ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsOUTReceived(void) @@ -473,7 +516,7 @@ * * \ingroup Group_EndpointPacketManagement * - * \return Boolean true if the selected endpoint has received a SETUP packet, false otherwise. + * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. */ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsSETUPReceived(void) @@ -555,7 +598,7 @@ * * \ingroup Group_EndpointPacketManagement * - * \return Boolean true if the currently selected endpoint is stalled, false otherwise. + * \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. */ static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Endpoint_IsStalled(void) @@ -572,7 +615,7 @@ /** Determines the currently selected endpoint's direction. * - * \return The currently selected endpoint's direction, as a ENDPOINT_DIR_* mask. + * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. */ static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_GetEndpointDirection(void) @@ -582,7 +625,7 @@ /** Sets the direction of the currently selected endpoint. * - * \param[in] DirectionMask New endpoint direction, as a ENDPOINT_DIR_* mask. + * \param[in] DirectionMask New endpoint direction, as a \c ENDPOINT_DIR_* mask. */ static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE; static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) @@ -812,12 +855,12 @@ * project once the USB interface is initialized into device mode. * * If space is an issue, it is possible to fix this to a static value by defining the control - * endpoint size in the FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile + * endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile * via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically * read from the descriptors at runtime and instead fixed to the given value. When used, it is * important that the descriptor control endpoint size value matches the size given as the - * FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the FIXED_CONTROL_ENDPOINT_SIZE token - * be used in the descriptors to ensure this. + * \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token + * be used in the device descriptors to ensure this. * * \note This variable should be treated as read-only in the user application, and never manually * changed in value.