source: rtems/cpukit/include/rtems/endian.h @ 1cfae28

4.11
Last change on this file since 1cfae28 was 1cfae28, checked in by Sebastian Huber <sebastian.huber@…>, on May 22, 2015 at 6:17:37 AM

rtems/endian.h: Reduce header dependencies

  • Property mode set to 100644
File size: 3.7 KB
Line 
1/**
2 * @file rtems/endian.h
3 *
4 * This include file provides endian information about the target.
5 */
6
7
8#ifndef _RTEMS_ENDIAN_H
9#define _RTEMS_ENDIAN_H
10
11#include <rtems/score/cpu.h>
12
13/*
14 * BSD-style endian declaration
15 */
16#define BIG_ENDIAN      4321
17#define LITTLE_ENDIAN   1234
18
19#ifndef BYTE_ORDER
20#if CPU_BIG_ENDIAN
21# define BYTE_ORDER BIG_ENDIAN
22#elif CPU_LITTLE_ENDIAN
23# define BYTE_ORDER LITTLE_ENDIAN
24#else
25# error "Can't decide which end is which!"
26#endif
27#endif
28
29#if ( CPU_BIG_ENDIAN == TRUE )
30
31/*
32 *  Very simply on big endian CPUs
33 */
34
35static inline uint32_t ntohl( uint32_t _x )
36{
37  return _x;
38}
39
40static inline uint16_t ntohs( uint16_t _x )
41{
42  return _x;
43}
44
45static inline uint32_t htonl( uint32_t _x )
46{
47  return _x;
48}
49
50static inline uint16_t htons( uint16_t _x )
51{
52  return _x;
53}
54
55#define NTOHS(x)
56#define HTONS(x)
57#define NTOHL(x)
58#define HTONL(x)
59
60#elif ( CPU_LITTLE_ENDIAN == TRUE )
61
62/*
63 *  A little more complicated on little endian CPUs
64 */
65
66static inline uint32_t ntohl( uint32_t _x )
67{
68  return CPU_swap_u32(_x);
69}
70
71static inline uint16_t ntohs( uint16_t _x )
72{
73  return CPU_swap_u16(_x);
74}
75
76static inline uint32_t htonl( uint32_t _x )
77{
78  return CPU_swap_u32(_x);
79}
80
81static inline uint16_t htons( uint16_t _x )
82{
83  return CPU_swap_u16(_x);
84}
85
86#define NTOHS(x) (x) = ntohs(x)
87#define HTONS(x) (x) = htons(x)
88#define NTOHL(x) (x) = ntohl(x)
89#define HTONL(x) (x) = htonl(x)
90
91#else
92#error "Unknown endian-ness for this cpu"
93#endif
94
95static inline uint16_t rtems_uint16_from_little_endian( const uint8_t *data)
96{
97  uint16_t value = 0;
98  int i;
99
100  for (i = 1; i >= 0; --i) {
101    value = (uint16_t) ((value << 8) + data [i]);
102  }
103
104  return value;
105}
106
107static inline uint32_t rtems_uint32_from_little_endian( const uint8_t *data)
108{
109  uint32_t value = 0;
110  int i;
111
112  for (i = 3; i >= 0; --i) {
113    value = (value << 8) + data [i];
114  }
115
116  return value;
117}
118
119static inline uint64_t rtems_uint64_from_little_endian( const uint8_t *data)
120{
121  uint64_t value = 0;
122  int i;
123
124  for (i = 7; i >= 0; --i) {
125    value = (value << 8) + (uint64_t) data [i];
126  }
127
128  return value;
129}
130
131static inline uint16_t rtems_uint16_from_big_endian( const uint8_t *data)
132{
133  uint16_t value = 0;
134  int i;
135
136  for (i = 0; i < 2; ++i) {
137    value = (uint16_t) ((value << 8) + data [i]);
138  }
139
140  return value;
141}
142
143static inline uint32_t rtems_uint32_from_big_endian( const uint8_t *data)
144{
145  uint32_t value = 0;
146  int i;
147
148  for (i = 0; i < 4; ++i) {
149    value = (value << 8) + (uint32_t) data [i];
150  }
151
152  return value;
153}
154
155static inline uint64_t rtems_uint64_from_big_endian( const uint8_t *data)
156{
157  uint64_t value = 0;
158  int i;
159
160  for (i = 0; i < 8; ++i) {
161    value = (value << 8) + (uint64_t) data [i];
162  }
163
164  return value;
165}
166
167static inline void rtems_uint16_to_little_endian( uint16_t value, uint8_t *data)
168{
169  int i;
170
171  for (i = 0; i < 2; ++i) {
172    data [i] = (uint8_t) value;
173    value >>= 8;
174  }
175}
176
177static inline void rtems_uint32_to_little_endian( uint32_t value, uint8_t *data)
178{
179  int i;
180
181  for (i = 0; i < 4; ++i) {
182    data [i] = (uint8_t) value;
183    value >>= 8;
184  }
185}
186
187static inline void rtems_uint64_to_little_endian( uint64_t value, uint8_t *data)
188{
189  int i;
190
191  for (i = 0; i < 8; ++i) {
192    data [i] = (uint8_t) value;
193    value >>= 8;
194  }
195}
196
197static inline void rtems_uint16_to_big_endian( uint16_t value, uint8_t *data)
198{
199  int i;
200
201  for (i = 1; i >= 0; --i) {
202    data [i] = (uint8_t) value;
203    value >>= 8;
204  }
205}
206
207static inline void rtems_uint32_to_big_endian( uint32_t value, uint8_t *data)
208{
209  int i;
210
211  for (i = 3; i >= 0; --i) {
212    data [i] = (uint8_t) value;
213    value >>= 8;
214  }
215}
216
217static inline void rtems_uint64_to_big_endian( uint64_t value, uint8_t *data)
218{
219  int i;
220
221  for (i = 7; i >= 0; --i) {
222    data [i] = (uint8_t) value;
223    value >>= 8;
224  }
225}
226
227#endif /* _RTEMS_ENDIAN_H */
Note: See TracBrowser for help on using the repository browser.