| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 | 
							- /**
 
-  * @file cpu_endian.h
 
-  * @brief Byte order conversion
 
-  *
 
-  * @section License
 
-  *
 
-  * SPDX-License-Identifier: GPL-2.0-or-later
 
-  *
 
-  * Copyright (C) 2010-2023 Oryx Embedded SARL. All rights reserved.
 
-  *
 
-  * This program is free software; you can redistribute it and/or
 
-  * modify it under the terms of the GNU General Public License
 
-  * as published by the Free Software Foundation; either version 2
 
-  * of the License, or (at your option) any later version.
 
-  *
 
-  * This program is distributed in the hope that it will be useful,
 
-  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
-  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
-  * GNU General Public License for more details.
 
-  *
 
-  * You should have received a copy of the GNU General Public License
 
-  * along with this program; if not, write to the Free Software Foundation,
 
-  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-  *
 
-  * @author Oryx Embedded SARL (www.oryx-embedded.com)
 
-  * @version 2.2.4
 
-  **/
 
- #ifndef _CPU_ENDIAN_H
 
- #define _CPU_ENDIAN_H
 
- //Dependencies
 
- #include "os_port.h"
 
- //Undefine conflicting definitions
 
- #ifdef HTONS
 
-    #undef HTONS
 
- #endif
 
- #ifdef HTONL
 
-    #undef HTONL
 
- #endif
 
- #ifdef HTONLL
 
-    #undef HTONLL
 
- #endif
 
- #ifdef htons
 
-    #undef htons
 
- #endif
 
- #ifdef htonl
 
-    #undef htonl
 
- #endif
 
- #ifdef htonll
 
-    #undef htonll
 
- #endif
 
- #ifdef NTOHS
 
-    #undef NTOHS
 
- #endif
 
- #ifdef NTOHL
 
-    #undef NTOHL
 
- #endif
 
- #ifdef NTOHLL
 
-    #undef NTOHLL
 
- #endif
 
- #ifdef ntohs
 
-    #undef ntohs
 
- #endif
 
- #ifdef ntohl
 
-    #undef ntohl
 
- #endif
 
- #ifdef ntohll
 
-    #undef ntohll
 
- #endif
 
- #ifdef HTOLE16
 
-    #undef HTOLE16
 
- #endif
 
- #ifdef HTOLE32
 
-    #undef HTOLE32
 
- #endif
 
- #ifdef HTOLE64
 
-    #undef HTOLE64
 
- #endif
 
- #ifdef htole16
 
-    #undef htole16
 
- #endif
 
- #ifdef htole32
 
-    #undef htole32
 
- #endif
 
- #ifdef htole64
 
-    #undef htole64
 
- #endif
 
- #ifdef LETOH16
 
-    #undef LETOH16
 
- #endif
 
- #ifdef LETOH32
 
-    #undef LETOH32
 
- #endif
 
- #ifdef LETOH64
 
-    #undef LETOH64
 
- #endif
 
- #ifdef letoh16
 
-    #undef letoh16
 
- #endif
 
- #ifdef letoh32
 
-    #undef letoh32
 
- #endif
 
- #ifdef letoh64
 
-    #undef letoh64
 
- #endif
 
- #ifdef HTOBE16
 
-    #undef HTOBE16
 
- #endif
 
- #ifdef HTOBE32
 
-    #undef HTOBE32
 
- #endif
 
- #ifdef HTOBE64
 
-    #undef HTOBE64
 
- #endif
 
- #ifdef htobe16
 
-    #undef htobe16
 
- #endif
 
- #ifdef htobe32
 
-    #undef htobe32
 
- #endif
 
- #ifdef htobe64
 
-    #undef htobe64
 
- #endif
 
- #ifdef BETOH16
 
-    #undef BETOH16
 
- #endif
 
- #ifdef BETOH32
 
-    #undef BETOH32
 
- #endif
 
- #ifdef BETOH64
 
-    #undef BETOH64
 
- #endif
 
- #ifdef betoh16
 
-    #undef betoh16
 
- #endif
 
- #ifdef betoh32
 
-    #undef betoh32
 
- #endif
 
- #ifdef betoh64
 
-    #undef betoh64
 
- #endif
 
- //Load unaligned 16-bit integer (little-endian encoding)
 
- #define LOAD16LE(p) ( \
 
-    ((uint16_t)(((uint8_t *)(p))[0]) << 0) | \
 
-    ((uint16_t)(((uint8_t *)(p))[1]) << 8))
 
- //Load unaligned 16-bit integer (big-endian encoding)
 
- #define LOAD16BE(p) ( \
 
-    ((uint16_t)(((uint8_t *)(p))[0]) << 8) | \
 
-    ((uint16_t)(((uint8_t *)(p))[1]) << 0))
 
- //Load unaligned 24-bit integer (little-endian encoding)
 
- #define LOAD24LE(p) ( \
 
-    ((uint32_t)(((uint8_t *)(p))[0]) << 0)| \
 
-    ((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
 
-    ((uint32_t)(((uint8_t *)(p))[2]) << 16))
 
- //Load unaligned 24-bit integer (big-endian encoding)
 
- #define LOAD24BE(p) ( \
 
-    ((uint32_t)(((uint8_t *)(p))[0]) << 16) | \
 
-    ((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
 
-    ((uint32_t)(((uint8_t *)(p))[2]) << 0))
 
- //Load unaligned 32-bit integer (little-endian encoding)
 
- #define LOAD32LE(p) ( \
 
-    ((uint32_t)(((uint8_t *)(p))[0]) << 0) | \
 
-    ((uint32_t)(((uint8_t *)(p))[1]) << 8) | \
 
-    ((uint32_t)(((uint8_t *)(p))[2]) << 16) | \
 
-    ((uint32_t)(((uint8_t *)(p))[3]) << 24))
 
- //Load unaligned 32-bit integer (big-endian encoding)
 
- #define LOAD32BE(p) ( \
 
-    ((uint32_t)(((uint8_t *)(p))[0]) << 24) | \
 
-    ((uint32_t)(((uint8_t *)(p))[1]) << 16) | \
 
-    ((uint32_t)(((uint8_t *)(p))[2]) << 8) | \
 
-    ((uint32_t)(((uint8_t *)(p))[3]) << 0))
 
- //Load unaligned 48-bit integer (little-endian encoding)
 
- #define LOAD48LE(p) ( \
 
-    ((uint64_t)(((uint8_t *)(p))[0]) << 0) | \
 
-    ((uint64_t)(((uint8_t *)(p))[1]) << 8) | \
 
-    ((uint64_t)(((uint8_t *)(p))[2]) << 16) | \
 
-    ((uint64_t)(((uint8_t *)(p))[3]) << 24) | \
 
-    ((uint64_t)(((uint8_t *)(p))[4]) << 32) | \
 
-    ((uint64_t)(((uint8_t *)(p))[5]) << 40)
 
- //Load unaligned 48-bit integer (big-endian encoding)
 
- #define LOAD48BE(p) ( \
 
-    ((uint64_t)(((uint8_t *)(p))[0]) << 40) | \
 
-    ((uint64_t)(((uint8_t *)(p))[1]) << 32) | \
 
-    ((uint64_t)(((uint8_t *)(p))[2]) << 24) | \
 
-    ((uint64_t)(((uint8_t *)(p))[3]) << 16) | \
 
-    ((uint64_t)(((uint8_t *)(p))[4]) << 8) | \
 
-    ((uint64_t)(((uint8_t *)(p))[5]) << 0))
 
- //Load unaligned 64-bit integer (little-endian encoding)
 
- #define LOAD64LE(p) ( \
 
-    ((uint64_t)(((uint8_t *)(p))[0]) << 0) | \
 
-    ((uint64_t)(((uint8_t *)(p))[1]) << 8) | \
 
-    ((uint64_t)(((uint8_t *)(p))[2]) << 16) | \
 
-    ((uint64_t)(((uint8_t *)(p))[3]) << 24) | \
 
-    ((uint64_t)(((uint8_t *)(p))[4]) << 32) | \
 
-    ((uint64_t)(((uint8_t *)(p))[5]) << 40) | \
 
-    ((uint64_t)(((uint8_t *)(p))[6]) << 48) | \
 
-    ((uint64_t)(((uint8_t *)(p))[7]) << 56))
 
- //Load unaligned 64-bit integer (big-endian encoding)
 
- #define LOAD64BE(p) ( \
 
-    ((uint64_t)(((uint8_t *)(p))[0]) << 56) | \
 
-    ((uint64_t)(((uint8_t *)(p))[1]) << 48) | \
 
-    ((uint64_t)(((uint8_t *)(p))[2]) << 40) | \
 
-    ((uint64_t)(((uint8_t *)(p))[3]) << 32) | \
 
-    ((uint64_t)(((uint8_t *)(p))[4]) << 24) | \
 
-    ((uint64_t)(((uint8_t *)(p))[5]) << 16) | \
 
-    ((uint64_t)(((uint8_t *)(p))[6]) << 8) | \
 
-    ((uint64_t)(((uint8_t *)(p))[7]) << 0))
 
- //Store unaligned 16-bit integer (little-endian encoding)
 
- #define STORE16LE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint16_t)(a) >> 0) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint16_t)(a) >> 8) & 0xFFU
 
- //Store unaligned 16-bit integer (big-endian encoding)
 
- #define STORE16BE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint16_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint16_t)(a) >> 0) & 0xFFU
 
- //Store unaligned 24-bit integer (little-endian encoding)
 
- #define STORE24LE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint32_t)(a) >> 0) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint32_t)(a) >> 16) & 0xFFU
 
- //Store unaligned 24-bit integer (big-endian encoding)
 
- #define STORE24BE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint32_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint32_t)(a) >> 0) & 0xFFU
 
- //Store unaligned 32-bit integer (little-endian encoding)
 
- #define STORE32LE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint32_t)(a) >> 0) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint32_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint32_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint32_t)(a) >> 24) & 0xFFU
 
- //Store unaligned 32-bit integer (big-endian encoding)
 
- #define STORE32BE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint32_t)(a) >> 24) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint32_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint32_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint32_t)(a) >> 0) & 0xFFU
 
- //Store unaligned 48-bit integer (little-endian encoding)
 
- #define STORE48LE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint64_t)(a) >> 0) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint64_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint64_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint64_t)(a) >> 24) & 0xFFU, \
 
-    ((uint8_t *)(p))[4] = ((uint64_t)(a) >> 32) & 0xFFU, \
 
-    ((uint8_t *)(p))[5] = ((uint64_t)(a) >> 40) & 0xFFU,
 
- //Store unaligned 48-bit integer (big-endian encoding)
 
- #define STORE48BE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint64_t)(a) >> 40) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint64_t)(a) >> 32) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint64_t)(a) >> 24) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint64_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[4] = ((uint64_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[5] = ((uint64_t)(a) >> 0) & 0xFFU
 
- //Store unaligned 64-bit integer (little-endian encoding)
 
- #define STORE64LE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint64_t)(a) >> 0) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint64_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint64_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint64_t)(a) >> 24) & 0xFFU, \
 
-    ((uint8_t *)(p))[4] = ((uint64_t)(a) >> 32) & 0xFFU, \
 
-    ((uint8_t *)(p))[5] = ((uint64_t)(a) >> 40) & 0xFFU, \
 
-    ((uint8_t *)(p))[6] = ((uint64_t)(a) >> 48) & 0xFFU, \
 
-    ((uint8_t *)(p))[7] = ((uint64_t)(a) >> 56) & 0xFFU
 
- //Store unaligned 64-bit integer (big-endian encoding)
 
- #define STORE64BE(a, p) \
 
-    ((uint8_t *)(p))[0] = ((uint64_t)(a) >> 56) & 0xFFU, \
 
-    ((uint8_t *)(p))[1] = ((uint64_t)(a) >> 48) & 0xFFU, \
 
-    ((uint8_t *)(p))[2] = ((uint64_t)(a) >> 40) & 0xFFU, \
 
-    ((uint8_t *)(p))[3] = ((uint64_t)(a) >> 32) & 0xFFU, \
 
-    ((uint8_t *)(p))[4] = ((uint64_t)(a) >> 24) & 0xFFU, \
 
-    ((uint8_t *)(p))[5] = ((uint64_t)(a) >> 16) & 0xFFU, \
 
-    ((uint8_t *)(p))[6] = ((uint64_t)(a) >> 8) & 0xFFU, \
 
-    ((uint8_t *)(p))[7] = ((uint64_t)(a) >> 0) & 0xFFU
 
- //Swap a 16-bit integer
 
- #define SWAPINT16(x) ( \
 
-    (((uint16_t)(x) & 0x00FFU) << 8) | \
 
-    (((uint16_t)(x) & 0xFF00U) >> 8))
 
- //Swap a 32-bit integer
 
- #define SWAPINT32(x) ( \
 
-    (((uint32_t)(x) & 0x000000FFUL) << 24) | \
 
-    (((uint32_t)(x) & 0x0000FF00UL) << 8) | \
 
-    (((uint32_t)(x) & 0x00FF0000UL) >> 8) | \
 
-    (((uint32_t)(x) & 0xFF000000UL) >> 24))
 
- //Swap a 64-bit integer
 
- #define SWAPINT64(x) ( \
 
-    (((uint64_t)(x) & 0x00000000000000FFULL) << 56) | \
 
-    (((uint64_t)(x) & 0x000000000000FF00ULL) << 40) | \
 
-    (((uint64_t)(x) & 0x0000000000FF0000ULL) << 24) | \
 
-    (((uint64_t)(x) & 0x00000000FF000000ULL) << 8) | \
 
-    (((uint64_t)(x) & 0x000000FF00000000ULL) >> 8) | \
 
-    (((uint64_t)(x) & 0x0000FF0000000000ULL) >> 24) | \
 
-    (((uint64_t)(x) & 0x00FF000000000000ULL) >> 40) | \
 
-    (((uint64_t)(x) & 0xFF00000000000000ULL) >> 56))
 
- //Big-endian machine?
 
- #ifdef _CPU_BIG_ENDIAN
 
- //Host byte order to network byte order
 
- #define HTONS(value) (value)
 
- #define HTONL(value) (value)
 
- #define HTONLL(value) (value)
 
- #define htons(value) ((uint16_t) (value))
 
- #define htonl(value) ((uint32_t) (value))
 
- #define htonll(value) ((uint64_t) (value))
 
- //Network byte order to host byte order
 
- #define NTOHS(value) (value)
 
- #define NTOHL(value) (value)
 
- #define NTOHLL(value) (value)
 
- #define ntohs(value) ((uint16_t) (value))
 
- #define ntohl(value) ((uint32_t) (value))
 
- #define ntohll(value) ((uint64_t) (value))
 
- //Host byte order to little-endian byte order
 
- #define HTOLE16(value) SWAPINT16(value)
 
- #define HTOLE32(value) SWAPINT32(value)
 
- #define HTOLE64(value) SWAPINT64(value)
 
- #define htole16(value) swapInt16((uint16_t) (value))
 
- #define htole32(value) swapInt32((uint32_t) (value))
 
- #define htole64(value) swapInt64((uint64_t) (value))
 
- //Little-endian byte order to host byte order
 
- #define LETOH16(value) SWAPINT16(value)
 
- #define LETOH32(value) SWAPINT32(value)
 
- #define LETOH64(value) SWAPINT64(value)
 
- #define letoh16(value) swapInt16((uint16_t) (value))
 
- #define letoh32(value) swapInt32((uint32_t) (value))
 
- #define letoh64(value) swapInt64((uint64_t) (value))
 
- //Host byte order to big-endian byte order
 
- #define HTOBE16(value) (value)
 
- #define HTOBE32(value) (value)
 
- #define HTOBE64(value) (value)
 
- #define htobe16(value) ((uint16_t) (value))
 
- #define htobe32(value) ((uint32_t) (value))
 
- #define htobe64(value) ((uint64_t) (value))
 
- //Big-endian byte order to host byte order
 
- #define BETOH16(value) (value)
 
- #define BETOH32(value) (value)
 
- #define BETOH64(value) (value)
 
- #define betoh16(value) ((uint16_t) (value))
 
- #define betoh32(value) ((uint32_t) (value))
 
- #define betoh64(value) ((uint64_t) (value))
 
- //Little-endian machine?
 
- #else
 
- //Host byte order to network byte order
 
- #define HTONS(value) SWAPINT16(value)
 
- #define HTONL(value) SWAPINT32(value)
 
- #define HTONLL(value) SWAPINT64(value)
 
- #define htons(value) swapInt16((uint16_t) (value))
 
- #define htonl(value) swapInt32((uint32_t) (value))
 
- #define htonll(value) swapInt64((uint64_t) (value))
 
- //Network byte order to host byte order
 
- #define NTOHS(value) SWAPINT16(value)
 
- #define NTOHL(value) SWAPINT32(value)
 
- #define NTOHLL(value) SWAPINT64(value)
 
- #define ntohs(value) swapInt16((uint16_t) (value))
 
- #define ntohl(value) swapInt32((uint32_t) (value))
 
- #define ntohll(value) swapInt64((uint64_t) (value))
 
- //Host byte order to little-endian byte order
 
- #define HTOLE16(value) (value)
 
- #define HTOLE32(value) (value)
 
- #define HTOLE64(value) (value)
 
- #define htole16(value) ((uint16_t) (value))
 
- #define htole32(value) ((uint32_t) (value))
 
- #define htole64(value) ((uint64_t) (value))
 
- //Little-endian byte order to host byte order
 
- #define LETOH16(value) (value)
 
- #define LETOH32(value) (value)
 
- #define LETOH64(value) (value)
 
- #define letoh16(value) ((uint16_t) (value))
 
- #define letoh32(value) ((uint32_t) (value))
 
- #define letoh64(value) ((uint64_t) (value))
 
- //Host byte order to big-endian byte order
 
- #define HTOBE16(value) SWAPINT16(value)
 
- #define HTOBE32(value) SWAPINT32(value)
 
- #define HTOBE64(value) SWAPINT64(value)
 
- #define htobe16(value) swapInt16((uint16_t) (value))
 
- #define htobe32(value) swapInt32((uint32_t) (value))
 
- #define htobe64(value) swapInt64((uint64_t) (value))
 
- //Big-endian byte order to host byte order
 
- #define BETOH16(value) SWAPINT16(value)
 
- #define BETOH32(value) SWAPINT32(value)
 
- #define BETOH64(value) SWAPINT64(value)
 
- #define betoh16(value) swapInt16((uint16_t) (value))
 
- #define betoh32(value) swapInt32((uint32_t) (value))
 
- #define betoh64(value) swapInt64((uint64_t) (value))
 
- #endif
 
- //C++ guard
 
- #ifdef __cplusplus
 
- extern "C" {
 
- #endif
 
- //Byte order conversion functions
 
- uint16_t swapInt16(uint16_t value);
 
- uint32_t swapInt32(uint32_t value);
 
- uint64_t swapInt64(uint64_t value);
 
- //Bit reversal functions
 
- uint8_t reverseInt4(uint8_t value);
 
- uint8_t reverseInt8(uint8_t value);
 
- uint16_t reverseInt16(uint16_t value);
 
- uint32_t reverseInt32(uint32_t value);
 
- uint64_t reverseInt64(uint64_t value);
 
- //C++ guard
 
- #ifdef __cplusplus
 
- }
 
- #endif
 
- #endif
 
 
  |