Commit 995195a2 authored by Dean Camera's avatar Dean Camera

Add missing function attributes to the pipe/endpoint functions for all architectures.

Perform endianness correction in the HID report parser for big-endian platforms.
parent 852b5e61
...@@ -232,6 +232,15 @@ ...@@ -232,6 +232,15 @@
* assembly output in an unexpected manner on sections of code that are ordering-specific. * assembly output in an unexpected manner on sections of code that are ordering-specific.
*/ */
#define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory"); #define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
/** Evaluates to boolean true if the specified value can be determined at compile time to be a constant value
* when compiling under GCC.
*
* \param[in] x Value to check compile time constantness of.
*
* \return Boolean true if the given value is known to be a compile time constant.
*/
#define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
#if !defined(ISR) || defined(__DOXYGEN__) #if !defined(ISR) || defined(__DOXYGEN__)
/** Macro for the definition of interrupt service routines, so that the compiler can insert the required /** Macro for the definition of interrupt service routines, so that the compiler can insert the required
...@@ -273,10 +282,11 @@ ...@@ -273,10 +282,11 @@
* *
* \param[in] Milliseconds Number of milliseconds to delay * \param[in] Milliseconds Number of milliseconds to delay
*/ */
static inline void Delay_MS(uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
static inline void Delay_MS(uint8_t Milliseconds) static inline void Delay_MS(uint8_t Milliseconds)
{ {
#if (ARCH == ARCH_AVR8) #if (ARCH == ARCH_AVR8)
if (__builtin_constant_p(Milliseconds)) if (GCC_IS_COMPILE_CONST(Milliseconds))
{ {
_delay_ms(Milliseconds); _delay_ms(Milliseconds);
} }
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
* *
* \ingroup Group_ByteSwapping * \ingroup Group_ByteSwapping
* *
* \param[in] x 16-bit value whose byte ordering is to be swapped. * \param[in] x 16-bit value whose byte ordering is to be swapped.
* *
* \return Input value with the byte ordering reversed. * \return Input value with the byte ordering reversed.
*/ */
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
* *
* \ingroup Group_ByteSwapping * \ingroup Group_ByteSwapping
* *
* \param[in] x 32-bit value whose byte ordering is to be swapped. * \param[in] x 32-bit value whose byte ordering is to be swapped.
* *
* \return Input value with the byte ordering reversed. * \return Input value with the byte ordering reversed.
*/ */
...@@ -440,24 +440,24 @@ ...@@ -440,24 +440,24 @@
* *
* \ingroup Group_ByteSwapping * \ingroup Group_ByteSwapping
* *
* \param[in,out] Data Pointer to a number containing an even number of bytes to be reversed. * \param[in,out] Data Pointer to a number containing an even number of bytes to be reversed.
* \param[in] Bytes Length of the data in bytes. * \param[in] Length Length of the data in bytes.
*/ */
static inline void SwapEndian_n(void* Data, static inline void SwapEndian_n(void* const Data,
uint8_t Bytes) ATTR_NON_NULL_PTR_ARG(1); uint8_t Length) ATTR_NON_NULL_PTR_ARG(1);
static inline void SwapEndian_n(void* Data, static inline void SwapEndian_n(void* const Data,
uint8_t Bytes) uint8_t Length)
{ {
uint8_t* CurrDataPos = (uint8_t*)Data; uint8_t* CurrDataPos = (uint8_t*)Data;
while (Bytes > 1) while (Length > 1)
{ {
uint8_t Temp = *CurrDataPos; uint8_t Temp = *CurrDataPos;
*CurrDataPos = *(CurrDataPos + Bytes - 1); *CurrDataPos = *(CurrDataPos + Length - 1);
*(CurrDataPos + Bytes - 1) = Temp; *(CurrDataPos + Length - 1) = Temp;
CurrDataPos++; CurrDataPos++;
Bytes -= 2; Length -= 2;
} }
} }
......
...@@ -61,12 +61,12 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, ...@@ -61,12 +61,12 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
switch (HIDReportItem & HID_RI_DATA_SIZE_MASK) switch (HIDReportItem & HID_RI_DATA_SIZE_MASK)
{ {
case HID_RI_DATA_BITS_32: case HID_RI_DATA_BITS_32:
ReportItemData = *((uint32_t*)ReportData); ReportItemData = le32_to_cpu(*((uint32_t*)ReportData));
ReportSize -= 4; ReportSize -= 4;
ReportData += 4; ReportData += 4;
break; break;
case HID_RI_DATA_BITS_16: case HID_RI_DATA_BITS_16:
ReportItemData = *((uint16_t*)ReportData); ReportItemData = le16_to_cpu(*((uint16_t*)ReportData));
ReportSize -= 2; ReportSize -= 2;
ReportData += 2; ReportData += 2;
break; break;
......
...@@ -88,9 +88,7 @@ bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioIn ...@@ -88,9 +88,7 @@ bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioIn
} }
if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, ENDPOINT_BANK_DOUBLE))) if (!(Endpoint_ConfigureEndpoint(EndpointNum, Type, Direction, Size, ENDPOINT_BANK_DOUBLE)))
{ return false;
return false;
}
} }
return true; return true;
......
...@@ -137,6 +137,7 @@ ...@@ -137,6 +137,7 @@
/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host) /** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
* the frame number is incremented by one. * the frame number is incremented by one.
*/ */
static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline uint16_t USB_Device_GetFrameNumber(void) static inline uint16_t USB_Device_GetFrameNumber(void)
{ {
return UDFNUM; return UDFNUM;
...@@ -191,7 +192,7 @@ ...@@ -191,7 +192,7 @@
UDADDR |= (1 << ADDEN); UDADDR |= (1 << ADDEN);
} }
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE; static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline bool USB_Device_IsAddressSet(void) static inline bool USB_Device_IsAddressSet(void)
{ {
return (UDADDR & (1 << ADDEN)); return (UDADDR & (1 << ADDEN));
......
...@@ -394,6 +394,7 @@ ...@@ -394,6 +394,7 @@
* *
* \return Total number of busy banks in the selected endpoint. * \return Total number of busy banks in the selected endpoint.
*/ */
static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline uint8_t Endpoint_GetBusyBanks(void) static inline uint8_t Endpoint_GetBusyBanks(void)
{ {
return (UESTA0X & (0x03 << NBUSYBK0)); return (UESTA0X & (0x03 << NBUSYBK0));
......
...@@ -140,6 +140,7 @@ ...@@ -140,6 +140,7 @@
/** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended) /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
* the frame number is incremented by one. * the frame number is incremented by one.
*/ */
static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint16_t USB_Host_GetFrameNumber(void) static inline uint16_t USB_Host_GetFrameNumber(void)
{ {
return UHFNUM; return UHFNUM;
......
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
* *
* \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise * \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise
*/ */
static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_ALWAYS_INLINE; static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline bool USB_OTG_Device_IsSendingHNP(void) static inline bool USB_OTG_Device_IsSendingHNP(void)
{ {
return ((OTGCON & (1 << HNPREQ)) ? true : false); return ((OTGCON & (1 << HNPREQ)) ? true : false);
......
...@@ -273,7 +273,7 @@ ...@@ -273,7 +273,7 @@
* *
* \return The current pipe token, as a \c 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) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_GetPipeToken(void) static inline uint8_t Pipe_GetPipeToken(void)
{ {
return (UPCFG0X & (0x03 << PTOKEN0)); return (UPCFG0X & (0x03 << PTOKEN0));
...@@ -433,6 +433,7 @@ ...@@ -433,6 +433,7 @@
* *
* \return Total number of busy banks in the selected pipe. * \return Total number of busy banks in the selected pipe.
*/ */
static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_GetBusyBanks(void) static inline uint8_t Pipe_GetBusyBanks(void)
{ {
return (UPSTAX & (0x03 << NBUSYBK0)); return (UPSTAX & (0x03 << NBUSYBK0));
......
...@@ -127,6 +127,7 @@ ...@@ -127,6 +127,7 @@
/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host) /** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
* the frame number is incremented by one. * the frame number is incremented by one.
*/ */
static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline uint16_t USB_Device_GetFrameNumber(void) static inline uint16_t USB_Device_GetFrameNumber(void)
{ {
return AVR32_USBB.UDFNUM.fnum; return AVR32_USBB.UDFNUM.fnum;
...@@ -179,7 +180,7 @@ ...@@ -179,7 +180,7 @@
AVR32_USBB.UDCON.adden = true; AVR32_USBB.UDCON.adden = true;
} }
static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE; static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline bool USB_Device_IsAddressSet(void) static inline bool USB_Device_IsAddressSet(void)
{ {
return AVR32_USBB.UDCON.adden; return AVR32_USBB.UDCON.adden;
......
...@@ -402,6 +402,7 @@ ...@@ -402,6 +402,7 @@
* *
* \return Total number of busy banks in the selected endpoint. * \return Total number of busy banks in the selected endpoint.
*/ */
static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
static inline uint8_t Endpoint_GetBusyBanks(void) static inline uint8_t Endpoint_GetBusyBanks(void)
{ {
return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].nbusybk; return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].nbusybk;
......
...@@ -141,6 +141,7 @@ ...@@ -141,6 +141,7 @@
/** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended) /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
* the frame number is incremented by one. * the frame number is incremented by one.
*/ */
static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint16_t USB_Host_GetFrameNumber(void) static inline uint16_t USB_Host_GetFrameNumber(void)
{ {
return AVR32_USBB_UHFNUM; return AVR32_USBB_UHFNUM;
......
...@@ -284,7 +284,7 @@ ...@@ -284,7 +284,7 @@
* *
* \return The current pipe token, as a \c 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) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_GetPipeToken(void) static inline uint8_t Pipe_GetPipeToken(void)
{ {
return (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken; return (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken;
...@@ -451,6 +451,7 @@ ...@@ -451,6 +451,7 @@
* *
* \return Total number of busy banks in the selected pipe. * \return Total number of busy banks in the selected pipe.
*/ */
static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_GetBusyBanks(void) static inline uint8_t Pipe_GetBusyBanks(void)
{ {
return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nbusybk; return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nbusybk;
......
...@@ -191,7 +191,7 @@ ...@@ -191,7 +191,7 @@
/* Macros: */ /* Macros: */
#define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) MACROS{ USB_HostState = HOST_STATE_WaitForDevice; \ #define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) MACROS{ USB_HostState = HOST_STATE_WaitForDevice; \
WaitMSRemaining = (Duration); \ WaitMSRemaining = (Duration); \
PostWaitState = (NextState); }MACROE PostWaitState = (NextState); }MACROE
#endif #endif
/* Disable C linkage for C++ Compilers: */ /* Disable C linkage for C++ Compilers: */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment