Skip to content

Commit

Permalink
Added portable_endian.h for ARM Embedded.
Browse files Browse the repository at this point in the history
  • Loading branch information
Apaisal committed Aug 29, 2024
1 parent 4a16199 commit 53edb0c
Show file tree
Hide file tree
Showing 10 changed files with 230 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/csp_crc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <csp/csp_crc32.h>
#include <csp/csp_id.h>

#include <endian.h>
#include <portable_endian.h>

#ifdef __AVR__
#include <avr/pgmspace.h>
Expand Down Expand Up @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion src/csp_id.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* Author: johan
*/

#include <endian.h>
#include <portable_endian.h>
#include <csp/csp.h>

/**
Expand Down
2 changes: 1 addition & 1 deletion src/csp_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#include <csp/csp.h>
#include <csp/csp_debug.h>
#include <endian.h>
#include <portable_endian.h>
#include <csp/csp_crc32.h>
#include <csp/csp_rtable.h>
#include <csp/interfaces/csp_if_lo.h>
Expand Down
8 changes: 4 additions & 4 deletions src/csp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#include <stdlib.h>

#include <csp/csp_crc32.h>
#include <endian.h>
#include <portable_endian.h>
#include <csp/arch/csp_time.h>
#include <csp/arch/csp_queue.h>
#include <csp/crypto/csp_hmac.h>
Expand Down Expand Up @@ -171,7 +171,7 @@ int csp_route_work(void) {
}

/**
* Callbacks
* Callbacks
*/
csp_callback_t callback = csp_port_get_callback(packet->id.dport);
if (callback) {
Expand All @@ -186,7 +186,7 @@ int csp_route_work(void) {
}

/**
* Sockets
* Sockets
*/

/* The message is to me, search for incoming socket */
Expand All @@ -205,7 +205,7 @@ int csp_route_work(void) {
csp_buffer_free(packet);
return CSP_ERR_NONE;
}

return CSP_ERR_NONE;
}

Expand Down
4 changes: 2 additions & 2 deletions src/csp_service_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#include <csp/csp_cmp.h>
#include <csp/csp_hooks.h>
#include <endian.h>
#include <portable_endian.h>
#include <csp/csp_types.h>
#include <csp/csp_rtable.h>
#include <csp/csp_id.h>
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/csp_services.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <csp/csp_debug.h>

#include <csp/csp_cmp.h>
#include <endian.h>
#include <portable_endian.h>
#include <csp/arch/csp_time.h>

int csp_ping(uint16_t node, uint32_t timeout, unsigned int size, uint8_t conn_options) {
Expand Down
2 changes: 1 addition & 1 deletion src/csp_sfp.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <csp/csp_buffer.h>
#include <csp/csp_debug.h>
#include "csp_macro.h"
#include <endian.h>
#include <portable_endian.h>

#include "csp_conn.h"

Expand Down
2 changes: 1 addition & 1 deletion src/interfaces/csp_if_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include <string.h>
#include <stdlib.h>
#include <endian.h>
#include <portable_endian.h>

#include <csp/csp.h>
#include <csp/csp_id.h>
Expand Down
2 changes: 1 addition & 1 deletion src/interfaces/csp_if_kiss.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <csp/drivers/usart.h>
#include <string.h>

#include <endian.h>
#include <portable_endian.h>
#include <csp/csp_crc32.h>
#include <csp/csp_id.h>

Expand Down
216 changes: 216 additions & 0 deletions src/portable_endian.h
Original file line number Diff line number Diff line change
@@ -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 <machine/endian.h>

#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 <endian.h>

#elif defined(__APPLE__)

# include <libkern/OSByteOrder.h>

# 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 <endian.h>

# 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 <sys/endian.h>

# 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 <winsock2.h>
# ifdef __GNUC__
# include <sys/param.h>
# 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 <gulliver.h>

# 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

0 comments on commit 53edb0c

Please sign in to comment.