From 53edb0ccfb8649a377c865b04113bcd957eec1c0 Mon Sep 17 00:00:00 2001 From: Anol Paisal Date: Thu, 29 Aug 2024 14:52:05 +0700 Subject: [PATCH] Added portable_endian.h for ARM Embedded. --- src/csp_crc32.c | 4 +- src/csp_id.c | 2 +- src/csp_io.c | 2 +- src/csp_route.c | 8 +- src/csp_service_handler.c | 4 +- src/csp_services.c | 2 +- src/csp_sfp.c | 2 +- src/interfaces/csp_if_can.c | 2 +- src/interfaces/csp_if_kiss.c | 2 +- src/portable_endian.h | 216 +++++++++++++++++++++++++++++++++++ 10 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 src/portable_endian.h diff --git a/src/csp_crc32.c b/src/csp_crc32.c index 2cf416afd..966bdeabd 100644 --- a/src/csp_crc32.c +++ b/src/csp_crc32.c @@ -3,7 +3,7 @@ #include #include -#include +#include #ifdef __AVR__ #include @@ -132,7 +132,7 @@ int csp_crc32_verify(csp_packet_t * packet) { if (memcmp(&packet->data[packet->length] - sizeof(crc), &crc, sizeof(crc)) != 0) { return CSP_ERR_CRC32; } - + } /* Strip CRC32 */ diff --git a/src/csp_id.c b/src/csp_id.c index ee5549576..9d6e9edb7 100644 --- a/src/csp_id.c +++ b/src/csp_id.c @@ -5,7 +5,7 @@ * Author: johan */ -#include +#include #include /** diff --git a/src/csp_io.c b/src/csp_io.c index 00ad0aae3..7920a59b0 100644 --- a/src/csp_io.c +++ b/src/csp_io.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/csp_route.c b/src/csp_route.c index 2e4b76f3b..9cc6e8141 100644 --- a/src/csp_route.c +++ b/src/csp_route.c @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include @@ -171,7 +171,7 @@ int csp_route_work(void) { } /** - * Callbacks + * Callbacks */ csp_callback_t callback = csp_port_get_callback(packet->id.dport); if (callback) { @@ -186,7 +186,7 @@ int csp_route_work(void) { } /** - * Sockets + * Sockets */ /* The message is to me, search for incoming socket */ @@ -205,7 +205,7 @@ int csp_route_work(void) { csp_buffer_free(packet); return CSP_ERR_NONE; } - + return CSP_ERR_NONE; } diff --git a/src/csp_service_handler.c b/src/csp_service_handler.c index a9eb05c20..ed9d5bfd2 100644 --- a/src/csp_service_handler.c +++ b/src/csp_service_handler.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include #include #include @@ -234,7 +234,7 @@ void csp_service_handler(csp_packet_t * packet) { uint32_t total = 0; total = csp_memfree_hook(); - + total = htobe32(total); memcpy(packet->data, &total, sizeof(total)); packet->length = sizeof(total); diff --git a/src/csp_services.c b/src/csp_services.c index 8495f9959..4c267ac8f 100644 --- a/src/csp_services.c +++ b/src/csp_services.c @@ -5,7 +5,7 @@ #include #include -#include +#include #include int csp_ping(uint16_t node, uint32_t timeout, unsigned int size, uint8_t conn_options) { diff --git a/src/csp_sfp.c b/src/csp_sfp.c index 1e845b658..896ad24fd 100644 --- a/src/csp_sfp.c +++ b/src/csp_sfp.c @@ -5,7 +5,7 @@ #include #include #include "csp_macro.h" -#include +#include #include "csp_conn.h" diff --git a/src/interfaces/csp_if_can.c b/src/interfaces/csp_if_can.c index 3619f8580..41df35427 100644 --- a/src/interfaces/csp_if_can.c +++ b/src/interfaces/csp_if_can.c @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include diff --git a/src/interfaces/csp_if_kiss.c b/src/interfaces/csp_if_kiss.c index 2ea547a27..f9be0e0fe 100644 --- a/src/interfaces/csp_if_kiss.c +++ b/src/interfaces/csp_if_kiss.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include #include diff --git a/src/portable_endian.h b/src/portable_endian.h new file mode 100644 index 000000000..4a19cf276 --- /dev/null +++ b/src/portable_endian.h @@ -0,0 +1,216 @@ +// "License": Public Domain +// I, Mathias Panzenböck, place this file hereby into the public domain. Use it at your own risk for whatever you like. +// In case there are jurisdictions that don't support putting things in the public domain you can also consider it to +// be "dual licensed" under the BSD, MIT and Apache licenses, if you want to. This code is trivial anyway. Consider it +// an example on how to get the endian conversion functions on different platforms. + +#ifndef PORTABLE_ENDIAN_H__ +#define PORTABLE_ENDIAN_H__ + +#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__) + +# define __WINDOWS__ + +#endif + +#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) + + /* + * GNU ARM toolchain, and possibly other bare-metal toolchains + * built on newlib. Tested with + * (GNU Tools for ARM Embedded Processors 6-2017-q2-update + */ + +# include + +#if BYTE_ORDER == LITTLE_ENDIAN + +# define htobe16(x) __bswap16(x) +# define htole16(x) (x) +# define be16toh(x) __bswap16(x) +# define le16toh(x) (x) + +# define htobe32(x) __bswap32(x) +# define htole32(x) (x) +# define be32toh(x) __bswap32(x) +# define le32toh(x) (x) + +# define htobe64(x) __bswap64(x) +# define htole64(x) (x) +# define be64toh(x) __bswap64(x) +# define le64toh(x) (x) + +#elif BYTE_ORDER == BIG_ENDIAN + +# define htobe16(x) (x) +# define htole16(x) __bswap16(x) +# define be16toh(x) (x) +# define le16toh(x) __bswap16(x) + +# define htobe32(x) (x) +# define htole32(x) __bswap32(x) +# define be32toh(x) (x) +# define le32toh(x) __bswap32(x) + +# define htobe64(x) (x) +# define htole64(x) __bswap64(x) +# define be64toh(x) (x) +# define le64toh(x) __bswap64(x) + +#endif + +#elif defined(__linux__) || defined(__CYGWIN__) || defined(__GNU__) + +# include + +#elif defined(__APPLE__) + +# include + +# define htobe16(x) OSSwapHostToBigInt16(x) +# define htole16(x) OSSwapHostToLittleInt16(x) +# define be16toh(x) OSSwapBigToHostInt16(x) +# define le16toh(x) OSSwapLittleToHostInt16(x) + +# define htobe32(x) OSSwapHostToBigInt32(x) +# define htole32(x) OSSwapHostToLittleInt32(x) +# define be32toh(x) OSSwapBigToHostInt32(x) +# define le32toh(x) OSSwapLittleToHostInt32(x) + +# define htobe64(x) OSSwapHostToBigInt64(x) +# define htole64(x) OSSwapHostToLittleInt64(x) +# define be64toh(x) OSSwapBigToHostInt64(x) +# define le64toh(x) OSSwapLittleToHostInt64(x) + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#elif defined(__OpenBSD__) + +# include + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) + +# include + +# define be16toh(x) betoh16(x) +# define le16toh(x) letoh16(x) + +# define be32toh(x) betoh32(x) +# define le32toh(x) letoh32(x) + +# define be64toh(x) betoh64(x) +# define le64toh(x) letoh64(x) + +#elif defined(__WINDOWS__) + +# include +# ifdef __GNUC__ +# include +# endif + +# if BYTE_ORDER == LITTLE_ENDIAN + +# define htobe16(x) htons(x) +# define htole16(x) (x) +# define be16toh(x) ntohs(x) +# define le16toh(x) (x) + +# define htobe32(x) htonl(x) +# define htole32(x) (x) +# define be32toh(x) ntohl(x) +# define le32toh(x) (x) + +# define htobe64(x) htonll(x) +# define htole64(x) (x) +# define be64toh(x) ntohll(x) +# define le64toh(x) (x) + +# elif BYTE_ORDER == BIG_ENDIAN + + /* that would be xbox 360 */ +# define htobe16(x) (x) +# define htole16(x) __builtin_bswap16(x) +# define be16toh(x) (x) +# define le16toh(x) __builtin_bswap16(x) + +# define htobe32(x) (x) +# define htole32(x) __builtin_bswap32(x) +# define be32toh(x) (x) +# define le32toh(x) __builtin_bswap32(x) + +# define htobe64(x) (x) +# define htole64(x) __builtin_bswap64(x) +# define be64toh(x) (x) +# define le64toh(x) __builtin_bswap64(x) + +# else + +# error byte order not supported + +# endif + +# define __BYTE_ORDER BYTE_ORDER +# define __BIG_ENDIAN BIG_ENDIAN +# define __LITTLE_ENDIAN LITTLE_ENDIAN +# define __PDP_ENDIAN PDP_ENDIAN + +#elif defined(__QNXNTO__) + +# include + +# define __LITTLE_ENDIAN 1234 +# define __BIG_ENDIAN 4321 +# define __PDP_ENDIAN 3412 + +# if defined(__BIGENDIAN__) + +# define __BYTE_ORDER __BIG_ENDIAN + +# define htobe16(x) (x) +# define htobe32(x) (x) +# define htobe64(x) (x) + +# define htole16(x) ENDIAN_SWAP16(x) +# define htole32(x) ENDIAN_SWAP32(x) +# define htole64(x) ENDIAN_SWAP64(x) + +# elif defined(__LITTLEENDIAN__) + +# define __BYTE_ORDER __LITTLE_ENDIAN + +# define htole16(x) (x) +# define htole32(x) (x) +# define htole64(x) (x) + +# define htobe16(x) ENDIAN_SWAP16(x) +# define htobe32(x) ENDIAN_SWAP32(x) +# define htobe64(x) ENDIAN_SWAP64(x) + +# else + +# error byte order not supported + +# endif + +# define be16toh(x) ENDIAN_BE16(x) +# define be32toh(x) ENDIAN_BE32(x) +# define be64toh(x) ENDIAN_BE64(x) +# define le16toh(x) ENDIAN_LE16(x) +# define le32toh(x) ENDIAN_LE32(x) +# define le64toh(x) ENDIAN_LE64(x) + + +#else + +# error platform not supported + +#endif +#endif