Oops - fix missing constants in the TempDataLogger FatFS diskio.h header file.
[pub/USBasp.git] / LUFA / Drivers / USB / LowLevel / Endpoint.h
index 54a2d8d..9ce1380 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
+     Copyright (C) Dean Camera, 2011.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   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
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
        /* Public Interface - May be used in end-application: */
                /* Macros: */
 
        /* 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.
                         */
                        /** 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.
                         */
                         *  should be initialized in the IN direction - i.e. data flows from device to host.
                         */
                        #define ENDPOINT_DIR_IN                         (1 << EPDIR)
                         *  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
                        /** 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
                         *  accesses the second bank.
                         */
                        #define ENDPOINT_BANK_DOUBLE                    (1 << EPBK0)
                         *  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.
                         */
                        /** 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.
                         */
 
                        #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
 
                        #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_CONTROLEP_DEFAULT_SIZE     8
                        #endif
                        #define ENDPOINT_EPNUM_MASK                     0x07
 
                        /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
                        #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_EPDIR_MASK                     0x80
 
                         */
                        #define ENDPOINT_EPSIZE_MASK                    0x7F
 
                         */
                        #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)
 
                         */
                        #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)
 
                         */
                        #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] 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.
                         *                        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.
                         *
                         *                        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.
                         *
                         *                        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
                         *        \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.
                         *
                         *  \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,
                         */
                        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
                        }
 
                        /** 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.
                         */
                         *
                         *  \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
                         */
 
                        /** Determines if the currently selected endpoint is enabled, but not necessarily configured.
                         *
 
                        /** 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)
                         */
                        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);
                        }
 
                                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
                        /** 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
                         *
                         *
                         *  \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)
                         */
                        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.
                         *
 
                        /** 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)
                         */
                        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
 
                        /** 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.
                         */
                         *
                         *  \return Mask whose bits indicate which endpoints have interrupted.
                         */
                         *
                         *  \param[in] EndpointNumber  Index of the endpoint whose interrupt flag should be tested.
                         *
                         *
                         *  \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)
                         */
                        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
                         *
                         *
                         *  \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)
                         */
                        static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
                        static inline bool Endpoint_IsINReady(void)
                         *
                         *  \ingroup Group_EndpointPacketManagement
                         *
                         *
                         *  \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)
                         */
                        static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
                        static inline bool Endpoint_IsOUTReceived(void)
                         *
                         *  \ingroup Group_EndpointPacketManagement
                         *
                         *
                         *  \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)
                         */
                        static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
                        static inline bool Endpoint_IsSETUPReceived(void)
                         *
                         *  \ingroup Group_EndpointPacketManagement
                         *
                         *
                         *  \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)
                         */
                        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.
                         *
 
                        /** 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)
                         */
                        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.
                         *
 
                        /** 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)
                         */
                        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
                         *  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
                         *  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.
                         *
                         *  \note This variable should be treated as read-only in the user application, and never manually
                         *        changed in value.