* @defgroup Group_PipeManagement Pipe Management\r
*\r
* This module contains functions, macros and enums related to pipe management when in USB Host mode. This\r
- * module contains the pipe management macros, as well as pipe interrupt and data send/recieve functions\r
+ * module contains the pipe management macros, as well as pipe interrupt and data send/receive functions\r
* for various data types.\r
*\r
* @{\r
/** Freezes the selected pipe, preventing it from communicating with an attached device. */\r
static inline void Pipe_Freeze(void);\r
\r
+ /** Determines if the currently selected pipe is frozen, and not able to accept data.\r
+ *\r
+ * \return Boolean true if the currently selected pipe is frozen, false otherwise\r
+ */\r
+ static inline bool Pipe_IsFrozen(void);\r
+ \r
/** Clears the master pipe error flag. */\r
static inline void Pipe_ClearError(void);\r
\r
#define Pipe_Unfreeze() MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE\r
\r
#define Pipe_Freeze() MACROS{ UPCONX |= (1 << PFREEZE); }MACROE\r
+ \r
+ #define Pipe_IsFrozen() ((UPCONX & (1 << PFREEZE)) ? true : false)\r
\r
#define Pipe_ClearError() MACROS{ UPINTX &= ~(1 << PERRI); }MACROE\r
\r
static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;\r
static inline uint16_t Pipe_Read_Word_LE(void)\r
{\r
- uint16_t Data;\r
+ union\r
+ {\r
+ uint16_t Word;\r
+ uint8_t Bytes[2];\r
+ } Data;\r
\r
- Data = UPDATX;\r
- Data |= (((uint16_t)UPDATX) << 8);\r
+ Data.Bytes[0] = UPDATX;\r
+ Data.Bytes[1] = UPDATX;\r
\r
- return Data;\r
+ return Data.Word;\r
}\r
\r
/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT\r
static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;\r
static inline uint16_t Pipe_Read_Word_BE(void)\r
{\r
- uint16_t Data;\r
+ union\r
+ {\r
+ uint16_t Word;\r
+ uint8_t Bytes[2];\r
+ } Data;\r
\r
- Data = (((uint16_t)UPDATX) << 8);\r
- Data |= UPDATX;\r
+ Data.Bytes[1] = UPDATX;\r
+ Data.Bytes[0] = UPDATX;\r
\r
- return Data;\r
+ return Data.Word;\r
}\r
\r
/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN\r
static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
static inline void Pipe_Write_DWord_LE(const uint32_t DWord)\r
{\r
- Pipe_Write_Word_LE(DWord);\r
- Pipe_Write_Word_LE(DWord >> 16);\r
+ UPDATX = (DWord & 0xFF);\r
+ UPDATX = (DWord >> 8);\r
+ UPDATX = (DWord >> 16);\r
+ UPDATX = (DWord >> 24);\r
}\r
\r
/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN\r
static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;\r
static inline void Pipe_Write_DWord_BE(const uint32_t DWord)\r
{\r
- Pipe_Write_Word_BE(DWord >> 16);\r
- Pipe_Write_Word_BE(DWord);\r
+ UPDATX = (DWord >> 24);\r
+ UPDATX = (DWord >> 16);\r
+ UPDATX = (DWord >> 8);\r
+ UPDATX = (DWord & 0xFF);\r
} \r
\r
/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. \r
/** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given\r
* endpoint is found, it is automatically selected.\r
*\r
- * \param EndpointAddress Address of the endpoint within the attached device to check\r
+ * \param[in] EndpointAddress Address of the endpoint within the attached device to check\r
*\r
* \return Boolean true if a pipe bound to the given endpoint address is found, false otherwise\r
*/\r
- bool Pipe_IsEndpointBound(uint8_t EndpointAddress);\r
+ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress);\r
\r
/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host\r
* as needed. The last packet is not automatically discarded once the remaining bytes has been read; the\r