nxdrvlinux/libcifx/Toolkit/Source/cifXEndianess.h
Sebastian Doell ac2f4d1789 Add initial driver source based on svn versions:
- toolkit V2.8.0.1@14806
 - BSL V1.8.0.0@14590
 - tcpserver: V1.4.3.0@14676 (marshaller V2.4.0.1@14551)
2024-02-05 09:23:09 +01:00

93 lines
3.9 KiB
C

/**************************************************************************************
Copyright (c) Hilscher Gesellschaft fuer Systemautomation mbH. All Rights Reserved.
***************************************************************************************
$Id: cifXEndianess.h 13253 2019-10-11 10:57:04Z LuisContreras $:
Description:
Little/Big Endian conversion
Changes:
Date Description
-----------------------------------------------------------------------------------
2019-10-11 Change prototype of endianess conversion function
2018-10-10 - Updated header and definitions to new Hilscher defines
- Derived from cifX Toolkit V1.6.0.0
**************************************************************************************/
/*****************************************************************************/
/*! \file cifXEndianess.h
* Little/Big Endian conversion */
/*****************************************************************************/
#ifndef __CIFX_ENDIANESS__H
#define __CIFX_ENDIANESS__H
/* Give the user the possibility to use own macros for
endianess conversion */
#ifndef BIGENDIAN_MACROS_PROVIDED
#ifndef CIFX_TOOLKIT_BIGENDIAN
/* Little endian, so we don't need a conversion */
#define LE16_TO_HOST(a) (a)
#define LE32_TO_HOST(a) (a)
#define LE64_TO_HOST(a) (a)
#define HOST_TO_LE16(a) (a)
#define HOST_TO_LE32(a) (a)
#define HOST_TO_LE64(a) (a)
#else
/* BIG endian, so we DO need a conversion */
/*lint -emacro(572, LE??_TO_HOST) : Excessive shift value */
/*lint -esym(666, LE??_TO_HOST) : Expression with side effects passed to repeated parameter 1 */
#define LE16_TO_HOST(a) ( (((a) & 0x00FF) << 8) | \
(((a) & 0xFF00) >> 8) )
#define LE32_TO_HOST(a) ( (((a) & 0x000000FFUL) << 24) | \
(((a) & 0x0000FF00UL) << 8) | \
(((a) & 0x00FF0000UL) >> 8) | \
(((a) & 0xFF000000UL) >> 24) )
#define LE64_TO_HOST(a) ( (((a) & 0x00000000000000FFULL) << 56) | \
(((a) & 0x000000000000FF00ULL) << 40) | \
(((a) & 0x0000000000FF0000ULL) << 24) | \
(((a) & 0x00000000FF000000ULL) << 8) | \
(((a) & 0x000000FF00000000ULL) >> 8) | \
(((a) & 0x0000FF0000000000ULL) >> 24) | \
(((a) & 0x00FF000000000000ULL) >> 40) | \
(((a) & 0xFF00000000000000ULL) >> 56) )
#define HOST_TO_LE16(a) LE16_TO_HOST(a)
#define HOST_TO_LE32(a) LE32_TO_HOST(a)
#define HOST_TO_LE64(a) LE64_TO_HOST(a)
#endif
#endif
typedef enum
{
eCIFX_ENDIANESS_WIDTH_8BIT,
eCIFX_ENDIANESS_WIDTH_16BIT,
eCIFX_ENDIANESS_WIDTH_32BIT,
eCIFX_ENDIANESS_WIDTH_64BIT
} CIFX_ENDIANESS_WIDTH;
/*****************************************************************************/
/*! Structure definition for endianess conversion function. An array of this
* this structure is used for automatically transforming a structure (which
* is described by this structure) from/to host endianess */
/*****************************************************************************/
typedef struct CIFX_ENDIANESS_ENTRY_Ttag
{
int iOffset; /*!< Offset inside the buffer */
CIFX_ENDIANESS_WIDTH eWidth; /*!< Data width of structure */
int iElementCnt; /*!< Number of elements to convert */
} CIFX_ENDIANESS_ENTRY_T, *PCIFX_ENDIANESS_ENTRY_T;
int32_t cifXConvertEndianess(unsigned int uiOffset, void* pvBuffer, int iBufferLen,
const CIFX_ENDIANESS_ENTRY_T* atConv, int iConvLen);
#endif /* __CIFX_ENDIANESS__H */