00001
00048 #ifndef IxOsServicesEndianess_H
00049 #define IxOsServicesEndianess_H
00050
00051 #if defined (__vxworks) || defined (__linux)
00052
00053
00054 #include <netinet/in.h>
00055
00056 #else
00057
00058 #error Unknown OS, please add a section with the include file for htonl/htons/ntohl/ntohs
00059
00060 #endif
00061
00062
00063 #if defined (__ARMEL__)
00064
00065 #ifndef __LITTLE_ENDIAN
00066
00067 #define __LITTLE_ENDIAN
00068
00069 #endif
00070
00071 #elif defined (__ARMEB__) || CPU == SIMSPARCSOLARIS
00072
00073 #ifndef __BIG_ENDIAN
00074
00075 #define __BIG_ENDIAN
00076
00077 #endif
00078
00079 #else
00080
00081 #error Error, could not identify target endianness
00082
00083 #endif
00084
00085
00086 #if defined (__vxworks) && defined (__LITTLE_ENDIAN)
00087
00088 #define IX_OSSERV_VXWORKS_LE
00089
00090 #elif defined (__vxworks) && defined (__BIG_ENDIAN)
00091
00092 #define IX_OSSERV_VXWORKS_BE
00093
00094 #elif defined (__linux) && defined (__BIG_ENDIAN)
00095
00096 #define IX_OSSERV_LINUX_BE
00097
00098 #else
00099
00100 #error Unknown OS/Endianess combination - only WxWorks LE, VxWorks BE and Linux BE are supported
00101
00102 #endif
00103
00104 #ifdef __XSCALE__
00105 static __inline__ UINT32 ixOsServWordSwap(UINT32 wordIn)
00106 {
00107
00108 UINT32 wordOut;
00109
00110
00111 __asm__ (" eor r1, %1, %1, ror #16;"
00112 " bic r1, r1, #0x00ff0000;"
00113 " mov %0, %1, ror #8;"
00114 " eor %0, %0, r1, lsr #8;"
00115 : "=r" (wordOut) : "r" (wordIn) : "r1");
00116
00117 return wordOut;
00118 }
00119 #endif
00120
00121
00122
00123 #ifdef __XSCALE__
00124 #define IX_OSSERV_SWAP_LONG(wData) (ixOsServWordSwap(wData))
00125 #else
00126 #define IX_OSSERV_SWAP_LONG(wData) ((wData >> 24) | (((wData >> 16) & 0xFF) << 8) | (((wData >> 8) & 0xFF) << 16) | ((wData & 0xFF) << 24))
00127 #endif
00128 #define IX_OSSERV_SWAP_SHORT(sData) ((sData >> 8) | ((sData & 0xFF) << 8))
00129 #define IX_OSSERV_SWAP_SHORT_ADDRESS(sAddr) ((sAddr) ^ 0x2)
00130 #define IX_OSSERV_SWAP_BYTE_ADDRESS(bAddr) ((bAddr) ^ 0x3)
00131
00132 #define IX_OSSERV_BE_XSTOBUSL(wData) (wData)
00133 #define IX_OSSERV_BE_XSTOBUSS(sData) (sData)
00134 #define IX_OSSERV_BE_XSTOBUSB(bData) (bData)
00135 #define IX_OSSERV_BE_BUSTOXSL(wData) (wData)
00136 #define IX_OSSERV_BE_BUSTOXSS(sData) (sData)
00137 #define IX_OSSERV_BE_BUSTOXSB(bData) (bData)
00138
00139 #define IX_OSSERV_LE_AC_XSTOBUSL(wAddr) (wAddr)
00140 #define IX_OSSERV_LE_AC_XSTOBUSS(sAddr) IX_OSSERV_SWAP_SHORT_ADDRESS(sAddr)
00141 #define IX_OSSERV_LE_AC_XSTOBUSB(bAddr) IX_OSSERV_SWAP_BYTE_ADDRESS(bAddr)
00142 #define IX_OSSERV_LE_AC_BUSTOXSL(wAddr) (wAddr)
00143 #define IX_OSSERV_LE_AC_BUSTOXSS(sAddr) IX_OSSERV_SWAP_SHORT_ADDRESS(sAddr)
00144 #define IX_OSSERV_LE_AC_BUSTOXSB(bAddr) IX_OSSERV_SWAP_BYTE_ADDRESS(bAddr)
00145
00146 #define IX_OSSERV_LE_DC_XSTOBUSL(wData) IX_OSSERV_SWAP_LONG(wData)
00147 #define IX_OSSERV_LE_DC_XSTOBUSS(sData) IX_OSSERV_SWAP_SHORT(sData)
00148 #define IX_OSSERV_LE_DC_XSTOBUSB(bData) (bData)
00149 #define IX_OSSERV_LE_DC_BUSTOXSL(wData) IX_OSSERV_SWAP_LONG(wData)
00150 #define IX_OSSERV_LE_DC_BUSTOXSS(sData) IX_OSSERV_SWAP_SHORT(sData)
00151 #define IX_OSSERV_LE_DC_BUSTOXSB(bData) (bData)
00152
00153 #endif