diff --git a/include/sys/byteorder.h b/include/sys/byteorder.h index 1c329666075..b4ec2719b13 100644 --- a/include/sys/byteorder.h +++ b/include/sys/byteorder.h @@ -18,6 +18,9 @@ /* Internal helpers only used by the sys_* APIs further below */ #define __bswap_16(x) ((u16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))) +#define __bswap_24(x) ((u32_t) ((((x) >> 16) & 0xff) | \ + (((x)) & 0xff00) | \ + (((x) & 0xff) << 16))) #define __bswap_32(x) ((u32_t) ((((x) >> 24) & 0xff) | \ (((x) >> 8) & 0xff00) | \ (((x) & 0xff00) << 8) | \ @@ -47,20 +50,20 @@ * @return 16-bit integer in little-endian format. */ -/** @def sys_be16_to_cpu - * @brief Convert 16-bit integer from big-endian to host endianness. +/** @def sys_le24_to_cpu + * @brief Convert 24-bit integer from little-endian to host endianness. * - * @param val 16-bit integer in big-endian format. + * @param val 24-bit integer in little-endian format. * - * @return 16-bit integer in host endianness. + * @return 24-bit integer in host endianness. */ -/** @def sys_cpu_to_be16 - * @brief Convert 16-bit integer from host endianness to big-endian. +/** @def sys_cpu_to_le24 + * @brief Convert 24-bit integer from host endianness to little-endian. * - * @param val 16-bit integer in host endianness. + * @param val 24-bit integer in host endianness. * - * @return 16-bit integer in big-endian format. + * @return 24-bit integer in little-endian format. */ /** @def sys_le32_to_cpu @@ -79,6 +82,38 @@ * @return 32-bit integer in little-endian format. */ +/** @def sys_be16_to_cpu + * @brief Convert 16-bit integer from big-endian to host endianness. + * + * @param val 16-bit integer in big-endian format. + * + * @return 16-bit integer in host endianness. + */ + +/** @def sys_cpu_to_be16 + * @brief Convert 16-bit integer from host endianness to big-endian. + * + * @param val 16-bit integer in host endianness. + * + * @return 16-bit integer in big-endian format. + */ + +/** @def sys_be24_to_cpu + * @brief Convert 24-bit integer from big-endian to host endianness. + * + * @param val 24-bit integer in big-endian format. + * + * @return 24-bit integer in host endianness. + */ + +/** @def sys_cpu_to_be24 + * @brief Convert 24-bit integer from host endianness to big-endian. + * + * @param val 24-bit integer in host endianness. + * + * @return 24-bit integer in big-endian format. + */ + /** @def sys_be32_to_cpu * @brief Convert 32-bit integer from big-endian to host endianness. * @@ -98,12 +133,16 @@ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #define sys_le16_to_cpu(val) (val) #define sys_cpu_to_le16(val) (val) -#define sys_be16_to_cpu(val) __bswap_16(val) -#define sys_cpu_to_be16(val) __bswap_16(val) +#define sys_le24_to_cpu(val) (val) +#define sys_cpu_to_le24(val) (val) #define sys_le32_to_cpu(val) (val) #define sys_cpu_to_le32(val) (val) #define sys_le64_to_cpu(val) (val) #define sys_cpu_to_le64(val) (val) +#define sys_be16_to_cpu(val) __bswap_16(val) +#define sys_cpu_to_be16(val) __bswap_16(val) +#define sys_be24_to_cpu(val) __bswap_24(val) +#define sys_cpu_to_be24(val) __bswap_24(val) #define sys_be32_to_cpu(val) __bswap_32(val) #define sys_cpu_to_be32(val) __bswap_32(val) #define sys_be64_to_cpu(val) __bswap_64(val) @@ -111,12 +150,16 @@ #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define sys_le16_to_cpu(val) __bswap_16(val) #define sys_cpu_to_le16(val) __bswap_16(val) -#define sys_be16_to_cpu(val) (val) -#define sys_cpu_to_be16(val) (val) +#define sys_le24_to_cpu(val) __bswap_24(val) +#define sys_cpu_to_le24(val) __bswap_24(val) #define sys_le32_to_cpu(val) __bswap_32(val) #define sys_cpu_to_le32(val) __bswap_32(val) #define sys_le64_to_cpu(val) __bswap_64(val) #define sys_cpu_to_le64(val) __bswap_64(val) +#define sys_be16_to_cpu(val) (val) +#define sys_cpu_to_be16(val) (val) +#define sys_be24_to_cpu(val) (val) +#define sys_cpu_to_be24(val) (val) #define sys_be32_to_cpu(val) (val) #define sys_cpu_to_be32(val) (val) #define sys_be64_to_cpu(val) (val) @@ -140,6 +183,21 @@ static inline void sys_put_be16(u16_t val, u8_t dst[2]) dst[1] = val; } +/** + * @brief Put a 24-bit integer as big-endian to arbitrary location. + * + * Put a 24-bit integer, originally in host endianness, to a + * potentially unaligned memory location in big-endian format. + * + * @param val 24-bit integer in host endianness. + * @param dst Destination memory address to store the result. + */ +static inline void sys_put_be24(u32_t val, u8_t dst[3]) +{ + dst[0] = val >> 16; + sys_put_be16(val, &dst[1]); +} + /** * @brief Put a 32-bit integer as big-endian to arbitrary location. * @@ -185,6 +243,21 @@ static inline void sys_put_le16(u16_t val, u8_t dst[2]) dst[1] = val >> 8; } +/** + * @brief Put a 24-bit integer as little-endian to arbitrary location. + * + * Put a 24-bit integer, originally in host endianness, to a + * potentially unaligned memory location in littel-endian format. + * + * @param val 24-bit integer in host endianness. + * @param dst Destination memory address to store the result. + */ +static inline void sys_put_le24(u32_t val, u8_t dst[3]) +{ + sys_put_le16(val, dst); + dst[2] = val >> 16; +} + /** * @brief Put a 32-bit integer as little-endian to arbitrary location. * @@ -230,6 +303,21 @@ static inline u16_t sys_get_be16(const u8_t src[2]) return ((u16_t)src[0] << 8) | src[1]; } +/** + * @brief Get a 24-bit integer stored in big-endian format. + * + * Get a 24-bit integer, stored in big-endian format in a potentially + * unaligned memory location, and convert it to the host endianness. + * + * @param src Location of the big-endian 24-bit integer to get. + * + * @return 24-bit integer in host endianness. + */ +static inline u32_t sys_get_be24(const u8_t src[3]) +{ + return ((u32_t)src[0] << 16) | sys_get_be16(&src[1]); +} + /** * @brief Get a 32-bit integer stored in big-endian format. * @@ -275,6 +363,21 @@ static inline u16_t sys_get_le16(const u8_t src[2]) return ((u16_t)src[1] << 8) | src[0]; } +/** + * @brief Get a 24-bit integer stored in big-endian format. + * + * Get a 24-bit integer, stored in big-endian format in a potentially + * unaligned memory location, and convert it to the host endianness. + * + * @param src Location of the big-endian 24-bit integer to get. + * + * @return 24-bit integer in host endianness. + */ +static inline u32_t sys_get_le24(const u8_t src[3]) +{ + return ((u32_t)src[2] << 16) | sys_get_le16(&src[0]); +} + /** * @brief Get a 32-bit integer stored in little-endian format. *