Kinetis Bootloader Host  2.0.0
Host Tools for Kinetis devices
apps/elftosb/common/EndianUtilities.h
1 /*
2  * File: EndianUtilities.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 #if !defined(_EndianUtilities_h_)
8 #define _EndianUtilities_h_
9 
12 
13 
15 #define _BYTESWAP16(value) (((((uint16_t)value) << 8) & 0xFF00) | ((((uint16_t)value) >> 8) & 0x00FF))
16 
18 #define _BYTESWAP32(value) \
19  (((((uint32_t)value) << 24) & 0xFF000000) | ((((uint32_t)value) << 8) & 0x00FF0000) | \
20  ((((uint32_t)value) >> 8) & 0x0000FF00) | ((((uint32_t)value) >> 24) & 0x000000FF))
21 
23 #define _BYTESWAP64(value) \
24  (((((uint64_t)value) << 56) & 0xFF00000000000000ULL) | ((((uint64_t)value) << 40) & 0x00FF000000000000ULL) | \
25  ((((uint64_t)value) << 24) & 0x0000FF0000000000ULL) | ((((uint64_t)value) << 8) & 0x000000FF00000000ULL) | \
26  ((((uint64_t)value) >> 8) & 0x00000000FF000000ULL) | ((((uint64_t)value) >> 24) & 0x0000000000FF0000ULL) | \
27  ((((uint64_t)value) >> 40) & 0x000000000000FF00ULL) | ((((uint64_t)value) >> 56) & 0x00000000000000FFULL))
28 
30 
32 
33 
34 inline uint16_t _swap_u16(uint16_t value)
35 {
36  return _BYTESWAP16(value);
37 }
38 inline int16_t _swap_s16(int16_t value)
39 {
40  return (int16_t)_BYTESWAP16((uint16_t)value);
41 }
42 
43 inline uint32_t _swap_u32(uint32_t value)
44 {
45  return _BYTESWAP32(value);
46 }
47 inline int32_t _swap_s32(int32_t value)
48 {
49  return (int32_t)_BYTESWAP32((uint32_t)value);
50 }
51 
52 inline uint64_t _swap_u64(uint64_t value)
53 {
54  return _BYTESWAP64(value);
55 }
56 inline int64_t _swap_s64(int64_t value)
57 {
58  return (uint64_t)_BYTESWAP64((uint64_t)value);
59 }
60 
62 
63 #if defined(__LITTLE_ENDIAN__)
64 
65 /* little endian host */
66 
67 #define ENDIAN_BIG_TO_HOST_U16(value) (_swap_u16(value))
68 #define ENDIAN_HOST_TO_BIG_U16(value) (_swap_u16(value))
69 
70 #define ENDIAN_BIG_TO_HOST_S16(value) (_swap_s16(value))
71 #define ENDIAN_HOST_TO_BIG_S16(value) (_swap_s16(value))
72 
73 #define ENDIAN_BIG_TO_HOST_U32(value) (_swap_u32(value))
74 #define ENDIAN_HOST_TO_BIG_U32(value) (_swap_u32(value))
75 
76 #define ENDIAN_BIG_TO_HOST_S32(value) (_swap_s32(value))
77 #define ENDIAN_HOST_TO_BIG_S32(value) (_swap_s32(value))
78 
79 #define ENDIAN_BIG_TO_HOST_U64(value) (_swap_u64(value))
80 #define ENDIAN_HOST_TO_BIG_U64(value) (_swap_u64(value))
81 
82 #define ENDIAN_BIG_TO_HOST_S64(value) (_swap_s64(value))
83 #define ENDIAN_HOST_TO_BIG_S64(value) (_swap_s64(value))
84 
85 /* no-ops */
86 
87 #define ENDIAN_LITTLE_TO_HOST_U16(value) (value)
88 #define ENDIAN_HOST_TO_LITTLE_U16(value) (value)
89 
90 #define ENDIAN_LITTLE_TO_HOST_S16(value) (value)
91 #define ENDIAN_HOST_TO_LITTLE_S16(value) (value)
92 
93 #define ENDIAN_LITTLE_TO_HOST_U32(value) (value)
94 #define ENDIAN_HOST_TO_LITTLE_U32(value) (value)
95 
96 #define ENDIAN_LITTLE_TO_HOST_S32(value) (value)
97 #define ENDIAN_HOST_TO_LITTLE_S32(value) (value)
98 
99 #define ENDIAN_LITTLE_TO_HOST_U64(value) (value)
100 #define ENDIAN_HOST_TO_LITTLE_U64(value) (value)
101 
102 #define ENDIAN_LITTLE_TO_HOST_S64(value) (value)
103 #define ENDIAN_HOST_TO_LITTLE_S64(value) (value)
104 
105 #elif defined(__BIG_ENDIAN__)
106 
107 /* big endian host */
108 
109 #define ENDIAN_LITTLE_TO_HOST_U16(value) (_swap_u16(value))
110 #define ENDIAN_HOST_TO_LITTLE_U16(value) (_swap_u16(value))
111 
112 #define ENDIAN_LITTLE_TO_HOST_S16(value) (_swap_s16(value))
113 #define ENDIAN_HOST_TO_LITTLE_S16(value) (_swap_s16(value))
114 
115 #define ENDIAN_LITTLE_TO_HOST_U32(value) (_swap_u32(value))
116 #define ENDIAN_HOST_TO_LITTLE_U32(value) (_swap_u32(value))
117 
118 #define ENDIAN_LITTLE_TO_HOST_S32(value) (_swap_s32(value))
119 #define ENDIAN_HOST_TO_LITTLE_S32(value) (_swap_s32(value))
120 
121 #define ENDIAN_LITTLE_TO_HOST_U64(value) (_swap_u64(value))
122 #define ENDIAN_HOST_TO_LITTLE_U64(value) (_swap_u64(value))
123 
124 #define ENDIAN_LITTLE_TO_HOST_S64(value) (_swap_s64(value))
125 #define ENDIAN_HOST_TO_LITTLE_S64(value) (_swap_s64(value))
126 
127 /* no-ops */
128 
129 #define ENDIAN_BIG_TO_HOST_U16(value) (value)
130 #define ENDIAN_HOST_TO_BIG_U16(value) (value)
131 
132 #define ENDIAN_BIG_TO_HOST_S16(value) (value)
133 #define ENDIAN_HOST_TO_BIG_S16(value) (value)
134 
135 #define ENDIAN_BIG_TO_HOST_U32(value) (value)
136 #define ENDIAN_HOST_TO_BIG_U32(value) (value)
137 
138 #define ENDIAN_BIG_TO_HOST_S32(value) (value)
139 #define ENDIAN_HOST_TO_BIG_S32(value) (value)
140 
141 #define ENDIAN_BIG_TO_HOST_U64(value) (value)
142 #define ENDIAN_HOST_TO_BIG_U64(value) (value)
143 
144 #define ENDIAN_BIG_TO_HOST_S64(value) (value)
145 #define ENDIAN_HOST_TO_BIG_S64(value) (value)
146 
147 #endif
148 
149 #endif // _EndianUtilities_h_