mirror of
https://git.intern.spaceteamaachen.de/ALPAKA/sta-core.git
synced 2025-06-10 16:55:58 +00:00
199 lines
5.2 KiB
C++
199 lines
5.2 KiB
C++
/**
|
|
* @file
|
|
* @brief Helper macros for managing endian handling.
|
|
*/
|
|
#ifndef STA_CORE_ENDIAN_HPP
|
|
#define STA_CORE_ENDIAN_HPP
|
|
|
|
|
|
#include <sta/config.hpp>
|
|
|
|
#if !defined(STA_MCU_BIG_ENDIAN) && !defined(STA_MCU_LITTLE_ENDIAN)
|
|
# error "Endian-ness unknown. Please specify in <sta/config.hpp>"
|
|
#endif // !STA_MCU_BIG_ENDIAN && !STA_MCU_LITTLE_ENDIAN
|
|
|
|
|
|
/**
|
|
* @defgroup sta_core_endian Endian
|
|
* @ingroup sta_core
|
|
* @brief Endian handling.
|
|
* @{
|
|
*/
|
|
|
|
|
|
/**
|
|
* @brief Get 16-bit value with swapped byte order.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return 16-bit value w/ swapped byte order
|
|
*/
|
|
#define STA_UINT16_SWAP_BYTE_ORDER(u16) \
|
|
( \
|
|
((u16 & 0x00FF) << 8) \
|
|
| ((u16 & 0xFF00) >> 8) \
|
|
)
|
|
|
|
/**
|
|
* @brief Get 32-bit value with swapped byte order.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return 32-bit value w/ swapped byte order
|
|
*/
|
|
#define STA_UINT32_SWAP_BYTE_ORDER(u32) \
|
|
( \
|
|
((u32 & 0x000000FF) << 24) \
|
|
| ((u32 & 0x0000FF00) << 8) \
|
|
| ((u32 & 0x00FF0000) >> 8) \
|
|
| ((u32 & 0xFF000000) >> 24) \
|
|
)
|
|
|
|
/**
|
|
* @brief Get initializer list for byte array with big-endian byte order from 16-bit value.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return Initializer list for uint8_t[2]
|
|
*/
|
|
#define STA_UINT16_TO_BYTES_BE(u16) \
|
|
{ \
|
|
static_cast<uint8_t>(u16 >> 8), \
|
|
static_cast<uint8_t>(u16) \
|
|
}
|
|
|
|
/**
|
|
* @brief Get initializer list for byte array with little-endian byte order from 16-bit value.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return Initializer list for uint8_t[2]
|
|
*/
|
|
#define STA_UINT16_TO_BYTES_LE(u16) \
|
|
{ \
|
|
static_cast<uint8_t>(u16), \
|
|
static_cast<uint8_t>(u16 >> 8) \
|
|
}
|
|
|
|
/**
|
|
* @brief Get initializer list for byte array with big-endian byte order from 32-bit value.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return Initializer list for uint8_t[4]
|
|
*/
|
|
#define STA_UINT32_TO_BYTES_BE(u32) \
|
|
{ \
|
|
static_cast<uint8_t>(u32 >> 24), \
|
|
static_cast<uint8_t>(u32 >> 16), \
|
|
static_cast<uint8_t>(u32 >> 8), \
|
|
static_cast<uint8_t>(u32) \
|
|
}
|
|
|
|
/**
|
|
* @brief Get initializer list for byte array with little-endian byte order from 32-bit value.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return Initializer list for uint8_t[4]
|
|
*/
|
|
#define STA_UINT32_TO_BYTES_LE(u32) \
|
|
{ \
|
|
static_cast<uint8_t>(u32), \
|
|
static_cast<uint8_t>(u32 >> 8), \
|
|
static_cast<uint8_t>(u32 >> 16), \
|
|
static_cast<uint8_t>(u32 >> 24) \
|
|
}
|
|
|
|
|
|
/**
|
|
* @def STA_UINT16_TO_BE(u16)
|
|
* @brief Convert 16-bit value to big-endian byte order.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return 16-bit value w/ big-endian byte order
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT16_TO_LE(u16)
|
|
* @brief Convert 16-bit value to little-endian byte order.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return 16-bit value w/ little-endian byte order
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT16_TO_BYTES(u16)
|
|
* @brief Get initializer list for byte array w/ MCU byte order from 16-bit value.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return Initializer list for uint8_t[2]
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT16_TO_BYTES_SWAP(u16)
|
|
* @brief Get initializer list for byte array w/ swapped MCU byte order from 16-bit value.
|
|
*
|
|
* @param u16 16-bit input value
|
|
* @return Initializer list for uint8_t[2]
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT32_TO_BE(u32)
|
|
* @brief Convert 32-bit value to big-endian byte order.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return 32-bit value w/ big-endian byte order
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT32_TO_LE(u32)
|
|
* @brief Convert 32-bit value to little-endian byte order.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return 32-bit value w/ little-endian byte order
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT32_TO_BYTES(u32)
|
|
* @brief Get initializer list for byte array from 32-bit value.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return Initializer list for uint8_t[4]
|
|
*/
|
|
|
|
/**
|
|
* @def STA_UINT32_TO_BYTES_SWAP(u32)
|
|
* @brief Get initializer list for byte array w/ swapped byte order from 32-bit value.
|
|
*
|
|
* @param u32 32-bit input value
|
|
* @return Initializer list for uint8_t[4]
|
|
*/
|
|
|
|
|
|
/** @} */
|
|
|
|
|
|
#ifdef STA_MCU_LITTLE_ENDIAN
|
|
|
|
# define STA_UINT16_TO_BE(u16) STA_UINT16_SWAP_BYTE_ORDER(u16)
|
|
# define STA_UINT16_TO_LE(u16) (u16)
|
|
# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_LE(u16)
|
|
# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_BE(u16)
|
|
|
|
# define STA_UINT32_TO_BE(u32) STA_UINT32_SWAP_BYTE_ORDER(u32)
|
|
# define STA_UINT32_TO_LE(u32) (u32)
|
|
# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_LE(u32)
|
|
# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_BE(u32)
|
|
|
|
#else // STA_MCU_BIG_ENDIAN
|
|
|
|
# define STA_UINT16_TO_BE(u16) (u16)
|
|
# define STA_UINT16_TO_LE(u16) STA_UINT16_SWAP_BYTE_ORDER(u16)
|
|
# define STA_UINT16_TO_BYTES(u16) STA_UINT16_TO_BYTES_BE(u16)
|
|
# define STA_UINT16_TO_BYTES_SWAP(u16) STA_UINT16_TO_BYTES_LE(u16)
|
|
|
|
# define STA_UINT32_TO_BE(u32) (u32)
|
|
# define STA_UINT32_TO_LE(u32) STA_UINT32_SWAP_BYTE_ORDER(u32)
|
|
# define STA_UINT32_TO_BYTES(u32) STA_UINT32_TO_BYTES_BE(u32)
|
|
# define STA_UINT32_TO_BYTES_SWAP(u32) STA_UINT32_TO_BYTES_LE(u32)
|
|
|
|
#endif // STA_MCU_BIG_ENDIAN
|
|
|
|
|
|
#endif // STA_CORE_ENDIAN_HPP
|