diff --git a/src/xrt/drivers/hydra/hydra_driver.c b/src/xrt/drivers/hydra/hydra_driver.c index 686049a03..a71eb127d 100644 --- a/src/xrt/drivers/hydra/hydra_driver.c +++ b/src/xrt/drivers/hydra/hydra_driver.c @@ -22,6 +22,7 @@ #include "os/os_hid.h" #include "os/os_time.h" #include "os/os_threading.h" +#include "xrt/xrt_byte_order.h" #include "math/m_api.h" #include "math/m_relation_history.h" @@ -275,7 +276,6 @@ static inline int16_t hydra_read_int16_le(uint8_t **bufptr) { uint8_t *buf = *bufptr; - //! @todo nothing actually defines XRT_BIG_ENDIAN when needed! #ifdef XRT_BIG_ENDIAN uint8_t bytes[2] = {buf[1], buf[0]}; #else diff --git a/src/xrt/drivers/rift_s/rift_s_camera.c b/src/xrt/drivers/rift_s/rift_s_camera.c index 8a6d5cbcf..abb74de87 100644 --- a/src/xrt/drivers/rift_s/rift_s_camera.c +++ b/src/xrt/drivers/rift_s/rift_s_camera.c @@ -15,13 +15,13 @@ * @author Jan Schmidt * @ingroup drv_rift_s */ -#include #include #include "rift_s.h" #include "rift_s_camera.h" #include "os/os_threading.h" +#include "xrt/xrt_byte_order.h" #include "xrt/xrt_defines.h" #include "xrt/xrt_frame.h" diff --git a/src/xrt/drivers/vive/vive.h b/src/xrt/drivers/vive/vive.h index e67932d03..834b9bbd5 100644 --- a/src/xrt/drivers/vive/vive.h +++ b/src/xrt/drivers/vive/vive.h @@ -10,12 +10,13 @@ #pragma once -#include -#include +#include "xrt/xrt_byte_order.h" #include "util/u_debug.h" #include "util/u_time.h" +#include + /* * * Printing functions. diff --git a/src/xrt/drivers/vive/vive_lighthouse.c b/src/xrt/drivers/vive/vive_lighthouse.c index 6e686dd61..aa8b703c0 100644 --- a/src/xrt/drivers/vive/vive_lighthouse.c +++ b/src/xrt/drivers/vive/vive_lighthouse.c @@ -10,13 +10,15 @@ // IWYU pragma: no_include // IWYU pragma: no_include -#include #include #include #include #include #include "math/m_api.h" + +#include "xrt/xrt_byte_order.h" + #include "util/u_debug.h" #include "util/u_logging.h" diff --git a/src/xrt/drivers/vive/vive_protocol.h b/src/xrt/drivers/vive/vive_protocol.h index 069140a6f..b157d7ccc 100644 --- a/src/xrt/drivers/vive/vive_protocol.h +++ b/src/xrt/drivers/vive/vive_protocol.h @@ -10,9 +10,10 @@ #pragma once -#include -#include #include "os/os_hid.h" +#include "xrt/xrt_byte_order.h" + +#include #define VIVE_CONTROLLER_BUTTON_REPORT_ID 0x01 diff --git a/src/xrt/drivers/wmr/wmr_camera.c b/src/xrt/drivers/wmr/wmr_camera.c index 3bef480ac..9fd007a9c 100644 --- a/src/xrt/drivers/wmr/wmr_camera.c +++ b/src/xrt/drivers/wmr/wmr_camera.c @@ -10,13 +10,12 @@ * @author Jakob Bornecrantz * @ingroup drv_wmr */ -#include -#include -#include -#include #include "math/m_api.h" + #include "os/os_threading.h" +#include "xrt/xrt_byte_order.h" + #include "util/u_autoexpgain.h" #include "util/u_debug.h" #include "util/u_var.h" @@ -28,6 +27,10 @@ #include "wmr_protocol.h" #include "wmr_camera.h" +#include +#include +#include + //! Specifies whether the user wants to enable autoexposure from the start. DEBUG_GET_ONCE_BOOL_OPTION(wmr_autoexposure, "WMR_AUTOEXPOSURE", true) diff --git a/src/xrt/drivers/wmr/wmr_controller_protocol.h b/src/xrt/drivers/wmr/wmr_controller_protocol.h index 5d8271cbd..4e3397c7a 100644 --- a/src/xrt/drivers/wmr/wmr_controller_protocol.h +++ b/src/xrt/drivers/wmr/wmr_controller_protocol.h @@ -10,7 +10,7 @@ #pragma once -#include +#include "xrt/xrt_byte_order.h" #include "wmr_protocol.h" diff --git a/src/xrt/include/xrt/xrt_byte_order.h b/src/xrt/include/xrt/xrt_byte_order.h new file mode 100644 index 000000000..5e269bd25 --- /dev/null +++ b/src/xrt/include/xrt/xrt_byte_order.h @@ -0,0 +1,62 @@ +// Copyright 2025, Beyley Cardellio +// SPDX-License-Identifier: BSL-1.0 +/*! + * @file + * @brief Endian-specific byte order defines. + * @author Beyley Cardellio + * @ingroup aux_os + */ + +#pragma once + +#include "xrt_compiler.h" + +#include + +#ifdef __linux__ + +// On Linux, all these conversion functions are defined for both endians +#include + +#elif defined(XRT_BIG_ENDIAN) + +#error "@todo: Add byte order constants and functions for this OS or big endian machines." + +#else + +#define __be64 uint64_t +#define __be32 uint32_t +#define __be16 uint16_t + +#define __be16_to_cpu(x) ((((uint16_t)x & (uint16_t)0x00FFU) << 8) | (((uint16_t)x & (uint16_t)0xFF00U) >> 8)) +#define __cpu_to_be16(x) __be16_to_cpu(x) + +#define __be32_to_cpu(x) \ + ((((uint32_t)x & (uint32_t)0x000000FFUL) << 24) | (((uint32_t)x & (uint32_t)0x0000FF00UL) << 8) | \ + (((uint32_t)x & (uint32_t)0x00FF0000UL) >> 8) | (((uint32_t)x & (uint32_t)0xFF000000UL) >> 24)) +#define __cpu_to_be32(x) __be32_to_cpu(x) + +#define __be64_to_cpu(x) \ + ((((uint64_t)x & (uint64_t)0x00000000000000FFULL) << 56) | \ + (((uint64_t)x & (uint64_t)0x000000000000FF00ULL) << 40) | \ + (((uint64_t)x & (uint64_t)0x0000000000FF0000ULL) << 24) | \ + (((uint64_t)x & (uint64_t)0x00000000FF000000ULL) << 8) | \ + (((uint64_t)x & (uint64_t)0x000000FF00000000ULL) >> 8) | \ + (((uint64_t)x & (uint64_t)0x0000FF0000000000ULL) >> 24) | \ + (((uint64_t)x & (uint64_t)0x00FF000000000000ULL) >> 40) | \ + (((uint64_t)x & (uint64_t)0xFF00000000000000ULL) >> 56)) | +#define __cpu_to_be64(x) __be64_to_cpu(x) + +#define __le64 uint64_t +#define __le32 uint32_t +#define __le16 uint16_t +#define __u8 uint8_t +#define __s8 int8_t +#define __cpu_to_le16 +#define __le16_to_cpu +#define __cpu_to_le32 +#define __le32_to_cpu +#define __cpu_to_le64 +#define __le64_to_cpu + +#endif diff --git a/src/xrt/include/xrt/xrt_compiler.h b/src/xrt/include/xrt/xrt_compiler.h index 50c39a432..6123e180c 100644 --- a/src/xrt/include/xrt/xrt_compiler.h +++ b/src/xrt/include/xrt/xrt_compiler.h @@ -24,6 +24,27 @@ #include "xrt_windows.h" #endif // _MSC_VER +#if (defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) || \ + (defined(__STDC_ENDIAN_NATIVE__) && __STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_BIG__) || defined(__BIG_ENDIAN__) || \ + defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(_MIBSEB) || defined(__MIBSEB) || \ + defined(__MIBSEB__) + +#define XRT_BIG_ENDIAN + +#elif (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ + (defined(__STDC_ENDIAN_NATIVE__) && __STDC_ENDIAN_NATIVE__ == __STDC_ENDIAN_LITTLE__) || \ + defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || \ + defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(__x86_64__) || defined(_M_X64) || \ + defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) + +#undef XRT_BIG_ENDIAN + +#else +#error "@todo: Unable to determine current architecture." +#endif + /*! * Array size helper. */