KT24-1110_65E-HA-651B/include_lib/system/crypto_toolbox/endian.h
2024-11-10 18:44:17 +08:00

258 lines
7.3 KiB
C

/**
* @file endian.h
* @brief Byte order conversion
*
* @section License
*
* Copyright (C) 2010-2014 Oryx Embedded. 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 (www.oryx-embedded.com)
* @version 1.5.0
**/
#ifndef _ENDIAN_H
#define _ENDIAN_H
//Dependencies
//#include "os_port.h"
#include "generic/typedef.h"
//#include <stdint.h>
//#include "inttypes.h"
//typedef uint32_t systime_t;
//Compilation flags used to enable/disable features
#define ENABLED (+1)
#define DISABLED (-1)
//Miscellaneous macros
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef LSB
#define LSB(x) ((x) & 0xFF)
#endif
#ifndef MSB
#define MSB(x) (((x) >> 8) & 0xFF)
#endif
#ifndef MIN
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#endif
#if 0
//Load unaligned 16-bit integer (little-endian encoding)
#define LOAD16LE(p) ((uint16_t) (((uint8_t *)(p))[0] | (((uint8_t *)(p))[1] << 8)))
//Load unaligned 16-bit integer (big-endian encoding)
#define LOAD16BE(p) ((uint16_t) ((((uint8_t *)(p))[0] << 8) | ((uint8_t *)(p))[1]))
//Load unaligned 24-bit integer (little-endian encoding)
#define LOAD24LE(p) ((uint32_t) (((uint8_t *)(p))[0] | \
(((uint8_t *)(p))[1] << 8) | (((uint8_t *)(p))[2] << 16)))
//Load unaligned 24-bit integer (big-endian encoding)
#define LOAD24BE(p) ((uint32_t) ((((uint8_t *)(p))[0] << 16) | \
(((uint8_t *)(p))[1] << 8) | ((uint8_t *)(p))[2]))
//Load unaligned 32-bit integer (little-endian encoding)
#define LOAD32LE(p) ((uint32_t) (((uint8_t *)(p))[0] | (((uint8_t *)(p))[1] << 8) | \
(((uint8_t *)(p))[2] << 16) | (((uint8_t *)(p))[3] << 24)))
//Load unaligned 32-bit integer (big-endian encoding)
#define LOAD32BE(p) ((uint32_t) ((((uint8_t *)(p))[0] << 24) | (((uint8_t *)(p))[1] << 16) | \
(((uint8_t *)(p))[2] << 8) | ((uint8_t *)(p))[3]))
//Store unaligned 16-bit integer (little-endian encoding)
#define STORE16LE(a, p) \
((uint8_t *)(p))[0] = (a) & 0xFF, \
((uint8_t *)(p))[1] = ((a) >> 8) & 0xFF
//Store unaligned 32-bit integer (big-endian encoding)
#define STORE16BE(a, p) \
((uint8_t *)(p))[0] = ((a) >> 8) & 0xFF, \
((uint8_t *)(p))[1] = (a) & 0xFF
//Store unaligned 24-bit integer (little-endian encoding)
#define STORE24LE(a, p) \
((uint8_t *)(p))[0] = (a) & 0xFF, \
((uint8_t *)(p))[1] = ((a) >> 8) & 0xFF, \
((uint8_t *)(p))[2] = ((a) >> 16) & 0xFF
//Store unaligned 24-bit integer (big-endian encoding)
#define STORE24BE(a, p) \
((uint8_t *)(p))[0] = ((a) >> 16) & 0xFF, \
((uint8_t *)(p))[1] = ((a) >> 8) & 0xFF, \
((uint8_t *)(p))[2] = (a) & 0xFF
//Store unaligned 32-bit integer (little-endian encoding)
#define STORE32LE(a, p) \
((uint8_t *)(p))[0] = (a) & 0xFF, \
((uint8_t *)(p))[1] = ((a) >> 8) & 0xFF, \
((uint8_t *)(p))[2] = ((a) >> 16) & 0xFF, \
((uint8_t *)(p))[3] = ((a) >> 24) & 0xFF
//Store unaligned 32-bit integer (big-endian encoding)
#define STORE32BE(a, p) \
((uint8_t *)(p))[0] = ((a) >> 24) & 0xFF, \
((uint8_t *)(p))[1] = ((a) >> 16) & 0xFF, \
((uint8_t *)(p))[2] = ((a) >> 8) & 0xFF, \
((uint8_t *)(p))[3] = (a) & 0xFF
#endif
//Swap a 16-bit integer
#define _SWAP16(x) ( \
(((x) & 0x00FF) << 8) | \
(((x) & 0xFF00) >> 8))
//Swap a 32-bit integer
#define _SWAP32(x) ( \
(((x) & 0x000000FFUL) << 24) | \
(((x) & 0x0000FF00UL) << 8) | \
(((x) & 0x00FF0000UL) >> 8) | \
(((x) & 0xFF000000UL) >> 24))
//Swap a 64-bit integer
#define _SWAP64(x) ( \
(((x) & 0x00000000000000FFULL) << 56) | \
(((x) & 0x000000000000FF00ULL) << 40) | \
(((x) & 0x0000000000FF0000ULL) << 24) | \
(((x) & 0x00000000FF000000ULL) << 8) | \
(((x) & 0x000000FF00000000ULL) >> 8) | \
(((x) & 0x0000FF0000000000ULL) >> 24) | \
(((x) & 0x00FF000000000000ULL) >> 40) | \
(((x) & 0xFF00000000000000ULL) >> 56))
#undef NTOHL
//#define _BIG_ENDIAN
//Big-endian machine?
#ifdef _BIG_ENDIAN
//Host byte order to network byte order
#define HTONS(value) (value)
#define HTONL(value) (value)
#define htons(value) (value)
#define htonl(value) (value)
//Network byte order to host byte order
#define NTOHS(value) (value)
#define NTOHL(value) (value)
#define ntohs(value) (value)
#define ntohl(value) (value)
//Host byte order to little-endian byte order
#define HTOLE16(value) _SWAP16(value)
#define HTOLE32(value) _SWAP32(value)
#define HTOLE64(value) _SWAP64(value)
#define htole16(value) _swap16(value)
#define htole32(value) _swap32(value)
#define htole64(value) _swap64(value)
//Little-endian byte order to host byte order
#define LETOH16(value) _SWAP16(value)
#define LETOH32(value) _SWAP32(value)
#define LETOH64(value) _SWAP64(value)
#define letoh16(value) _swap16(value)
#define letoh32(value) _swap32(value)
#define letoh64(value) _swap64(value)
//Host byte order to big-endian byte order
#define HTOBE16(value) (value)
#define HTOBE32(value) (value)
#define HTOBE64(value) (value)
#define htobe16(value) (value)
#define htobe32(value) (value)
#define htobe64(value) (value)
//Big-endian byte order to host byte order
#define BETOH16(value) (value)
#define BETOH32(value) (value)
#define BETOH64(value) (value)
#define betoh16(value) (value)
#define betoh32(value) (value)
#define betoh64(value) (value)
//Little-endian machine?
#else
//Host byte order to network byte order
#define HTONS(value) _SWAP16(value)
#define HTONL(value) _SWAP32(value)
#define htons(value) _swap16(value)
#define htonl(value) _swap32(value)
//Network byte order to host byte order
#define NTOHS(value) _SWAP16(value)
#define NTOHL(value) _SWAP32(value)
//#define ntohs(value) _swap16(value)
//#define ntohl(value) _swap32(value)
//Host byte order to little-endian byte order
#define HTOLE16(value) (value)
#define HTOLE32(value) (value)
#define HTOLE64(value) (value)
#define htole16(value) (value)
#define htole32(value) (value)
#define htole64(value) (value)
//Little-endian byte order to host byte order
#define LETOH16(value) (value)
#define LETOH32(value) (value)
#define LETOH64(value) (value)
#define letoh16(value) (value)
#define letoh32(value) (value)
#define letoh64(value) (value)
//Host byte order to big-endian byte order
#define HTOBE16(value) _SWAP16(value)
#define HTOBE32(value) _SWAP32(value)
#define HTOBE64(value) _SWAP64(value)
#define htobe16(value) _swap16(value)
#define htobe32(value) _swap32(value)
#define htobe64(value) _swap64(value)
//Big-endian byte order to host byte order
#define BETOH16(value) _SWAP16(value)
#define BETOH32(value) _SWAP32(value)
#define BETOH64(value) _SWAP64(value)
#define betoh16(value) _swap16(value)
#define betoh32(value) _swap32(value)
#define betoh64(value) _swap64(value)
#endif
//Byte order conversion functions
u16 _swap16(u16 value);
u32 _swap32(u32 value);
u64 _swap64(u64 value);
#endif