Oops - fix missing constants in the TempDataLogger FatFS diskio.h header file.
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.h
index e0a45f3..9ce1380 100644 (file)
@@ -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
 
                        #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
                        #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
 
                         */
                        #define ENDPOINT_EPSIZE_MASK                    0x7F
 
-                       /** Maximum size in bytes of a given endpoint.
+                       /** Retrives the maximum bank size in bytes of a 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_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.
+                        *
+                        *  \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_BANKS_SUPPORTED(EPIndex)       _ENDPOINT_GET_BANKS(EPIndex)
 
                         *  \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.
                         *                        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 <b>must</b> have at least two banks.
                         *
-                        *  \note Endpoints <b>must</b> be configured in ascending order, or bank corruption will occur.
+                        *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> 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
                         *  \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,
                        }
 
                        /** 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.
                         */
 
                        /** 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)
                                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
                         *
                         *  \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)
 
                        /** 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)
 
                        /** 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 <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
                         *
                         *  \return Mask whose bits indicate which endpoints have interrupted.
                         */
                         *
                         *  \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)
                         *
                         *  \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)
                         *
                         *  \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)
                         *
                         *  \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)
                         *
                         *  \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)
 
                        /** 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)
 
                        /** 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)
                         *  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.