X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/cb779e3d7d32d7c43e0a45bb526de0a04135b0c7..6d67b1df3cb8300612ad7b2f16e6bffe08fb8f30:/LUFA/Drivers/USB/LowLevel/Pipe.h diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h index 62d0935dc..75cdf7a7d 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.h +++ b/LUFA/Drivers/USB/LowLevel/Pipe.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 @@ -98,6 +98,8 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ + /** \name Pipe Error Flag Masks */ + //@{ /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */ #define PIPE_ERRORFLAG_OVERFLOW (1 << 6) @@ -118,7 +120,10 @@ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */ #define PIPE_ERRORFLAG_DATATGL (1 << 0) + //@} + /** \name Pipe Token Masks */ + //@{ /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes), * which will trigger a control request on the attached device when data is written to the pipe. */ @@ -133,7 +138,10 @@ * indicating that the pipe data will flow from host to device. */ #define PIPE_TOKEN_OUT (2 << PTOKEN0) - + //@} + + /** \name Pipe Bank Mode Masks */ + //@{ /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe * 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 attached device) can access the pipe's bank at the one time. @@ -146,7 +154,8 @@ * bank. */ #define PIPE_BANK_DOUBLE (1 << EPBK0) - + //@} + /** Pipe address for the default control pipe, which always resides in address 0. This is * defined for convenience to give more readable code when used with the pipe macros. */ @@ -181,12 +190,12 @@ #define PIPE_EPNUM_MASK 0x0F /** 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 PIPE_EPDIR_MASK 0x80 /* Enums: */ - /** Enum for the possible error return codes of the Pipe_WaitUntilReady function. + /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function. * * \ingroup Group_PipeRW */ @@ -209,7 +218,7 @@ * * \ingroup Group_PipeRW * - * \return Total number of bytes in the currently selected Pipe's FIFO buffer. + * \return Total number of bytes in the currently selected pipe's FIFO buffer. */ static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Pipe_BytesInPipe(void) @@ -272,7 +281,7 @@ /** Determines if the currently selected pipe is enabled, but not necessarily configured. * - * \return Boolean True if the currently selected pipe is enabled, false otherwise. + * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise. */ static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsEnabled(void) @@ -282,7 +291,7 @@ /** Gets the current pipe token, indicating the pipe's data direction and type. * - * \return The current pipe token, as a PIPE_TOKEN_* mask. + * \return The current pipe token, as a \c PIPE_TOKEN_* mask. */ static inline uint8_t Pipe_GetPipeToken(void) ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_GetPipeToken(void) @@ -290,12 +299,12 @@ return (UPCFG0X & (0x03 << PTOKEN0)); } - /** Sets the token for the currently selected pipe to one of the tokens specified by the PIPE_TOKEN_* + /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_* * masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during * control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices * which have two endpoints of opposite direction sharing the same endpoint address within the device. * - * \param[in] Token New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask. + * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask. */ static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE; static inline void Pipe_SetPipeToken(const uint8_t Token) @@ -324,7 +333,7 @@ /** Determines if the currently selected pipe is configured. * - * \return Boolean true if the selected pipe is configured, false otherwise. + * \return Boolean \c true if the selected pipe is configured, \c false otherwise. */ static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsConfigured(void) @@ -369,7 +378,7 @@ * * \param[in] PipeNumber Index of the pipe whose interrupt flag should be tested. * - * \return Boolean true if the specified pipe has interrupted, false otherwise. + * \return Boolean \c true if the specified pipe has interrupted, \c false otherwise. */ static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) @@ -393,7 +402,7 @@ /** Determines if the currently selected pipe is frozen, and not able to accept data. * - * \return Boolean true if the currently selected pipe is frozen, false otherwise. + * \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise. */ static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsFrozen(void) @@ -413,7 +422,7 @@ * * \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag. * - * \return Boolean true if an error has occurred on the selected pipe, false otherwise. + * \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise. */ static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsError(void) @@ -431,9 +440,9 @@ } /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This - * value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred. + * value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred. * - * \return Mask comprising of PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe. + * \return Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe. */ static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_GetErrorFlags(void) @@ -443,6 +452,19 @@ PIPE_ERRORFLAG_DATATGL)) | (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW))); } + + /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for + * transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the + * \ref Pipe_ClearIN() command. + * + * \ingroup Group_PipePacketManagement + * + * \return Total number of busy banks in the selected pipe. + */ + static inline uint8_t Pipe_GetBusyBanks(void) + { + return (UPSTAX & (0x03 << NBUSYBK0)); + } /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT @@ -454,7 +476,8 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the currently selected pipe may be read from or written to, depending on its direction. + * \return Boolean \c true if the currently selected pipe may be read from or written to, depending + * on its direction. */ static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsReadWriteAllowed(void) @@ -466,7 +489,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe has received an IN packet, false otherwise. + * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise. */ static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsINReceived(void) @@ -478,7 +501,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe is ready for an OUT packet, false otherwise. + * \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise. */ static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsOUTReady(void) @@ -491,7 +514,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe is ready for a SETUP packet, false otherwise. + * \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise. */ static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsSETUPSent(void) @@ -539,7 +562,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if an NAK has been received on the current pipe, false otherwise. + * \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise. */ static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsNAKReceived(void) @@ -563,7 +586,7 @@ * * \ingroup Group_PipePacketManagement * - * \return Boolean true if the current pipe has been stalled by the attached device, false otherwise. + * \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise. */ static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline bool Pipe_IsStalled(void) @@ -821,7 +844,7 @@ * * \param[in] Number Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES. * - * \param[in] Type Type of pipe to configure, a EP_TYPE_* mask. Not all pipe types are available on Low + * \param[in] Type Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low * Speed USB devices - refer to the USB 2.0 specification. * * \param[in] Token Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN. @@ -835,11 +858,12 @@ * the pipe's data direction). The bank size must indicate the maximum packet size that * the pipe can handle. * - * \param[in] Banks Number of banks to use for the pipe being configured, a PIPE_BANK_* mask. More banks + * \param[in] Banks Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks * uses more USB DPRAM, but offers better performance. Isochronous type pipes 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, Pipes must be configured in ascending order, + * or bank corruption will occur. * \n\n * * \note Certain models of USB AVR's pipes may have different maximum packet sizes based on the pipe's @@ -853,7 +877,7 @@ * \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe 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. */ bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, @@ -876,8 +900,8 @@ * * \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check. * - * \return Boolean true if a pipe bound to the given endpoint address of the specified direction is found, false - * otherwise. + * \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found, + * \c false otherwise. */ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);