1 #ifndef __INC_ENDIANFREE_H
2 #define __INC_ENDIANFREE_H
5 * Call endian free function when
6 * 1. Read/write packet content.
7 * 2. Before write integer to IO.
8 * 3. After read integer from IO.
11 #define __MACHINE_LITTLE_ENDIAN 1234 /* LSB first: i386, vax */
12 #define __MACHINE_BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net, ppc */
14 #define BYTE_ORDER __MACHINE_LITTLE_ENDIAN
16 #if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
17 #define EF1Byte(_val) ((u8)(_val))
18 #define EF2Byte(_val) ((u16)(_val))
19 #define EF4Byte(_val) ((u32)(_val))
22 #define EF1Byte(_val) ((u8)(_val))
23 #define EF2Byte(_val) \
24 (((((u16)(_val))&0x00ff)<<8)|((((u16)(_val))&0xff00)>>8))
25 #define EF4Byte(_val) \
26 (((((u32)(_val))&0x000000ff)<<24)|\
27 ((((u32)(_val))&0x0000ff00)<<8)|\
28 ((((u32)(_val))&0x00ff0000)>>8)|\
29 ((((u32)(_val))&0xff000000)>>24))
32 #define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr)))
33 #define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr)))
34 #define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr)))
36 #define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr))) = EF1Byte(_val)
37 #define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr))) = EF2Byte(_val)
38 #define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr))) = EF4Byte(_val)
39 #if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
40 #define H2N1BYTE(_val) ((u8)(_val))
41 #define H2N2BYTE(_val) (((((u16)(_val))&0x00ff)<<8)|\
42 ((((u16)(_val))&0xff00)>>8))
43 #define H2N4BYTE(_val) (((((u32)(_val))&0x000000ff)<<24)|\
44 ((((u32)(_val))&0x0000ff00)<<8) |\
45 ((((u32)(_val))&0x00ff0000)>>8) |\
46 ((((u32)(_val))&0xff000000)>>24))
48 #define H2N1BYTE(_val) ((u8)(_val))
49 #define H2N2BYTE(_val) ((u16)(_val))
50 #define H2N4BYTE(_val) ((u32)(_val))
53 #if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
54 #define N2H1BYTE(_val) ((u8)(_val))
55 #define N2H2BYTE(_val) (((((u16)(_val))&0x00ff)<<8)|\
56 ((((u16)(_val))&0xff00)>>8))
57 #define N2H4BYTE(_val) (((((u32)(_val))&0x000000ff)<<24)|\
58 ((((u32)(_val))&0x0000ff00)<<8) |\
59 ((((u32)(_val))&0x00ff0000)>>8) |\
60 ((((u32)(_val))&0xff000000)>>24))
62 #define N2H1BYTE(_val) ((u8)(_val))
63 #define N2H2BYTE(_val) ((u16)(_val))
64 #define N2H4BYTE(_val) ((u32)(_val))
67 #define BIT_LEN_MASK_32(__BitLen) (0xFFFFFFFF >> (32 - (__BitLen)))
68 #define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \
69 (BIT_LEN_MASK_32(__BitLen) << (__BitOffset))
71 #define LE_P4BYTE_TO_HOST_4BYTE(__pStart) (EF4Byte(*((u32 *)(__pStart))))
73 #define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
75 (LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset)) \
77 BIT_LEN_MASK_32(__BitLen) \
80 #define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
82 LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
84 (~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen)) \
87 #define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \
88 *((u32 *)(__pStart)) = \
90 LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
92 ((((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset)) \
96 #define BIT_LEN_MASK_16(__BitLen) \
97 (0xFFFF >> (16 - (__BitLen)))
99 #define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \
100 (BIT_LEN_MASK_16(__BitLen) << (__BitOffset))
102 #define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
103 (EF2Byte(*((u16 *)(__pStart))))
105 #define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
107 (LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset)) \
109 BIT_LEN_MASK_16(__BitLen) \
112 #define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
114 LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
116 (~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen)) \
119 #define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \
120 *((u16 *)(__pStart)) = \
122 LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
123 | ((((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << \
127 #define BIT_LEN_MASK_8(__BitLen) \
128 (0xFF >> (8 - (__BitLen)))
130 #define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \
131 (BIT_LEN_MASK_8(__BitLen) << (__BitOffset))
133 #define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
134 (EF1Byte(*((u8 *)(__pStart))))
136 #define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
138 (LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset)) \
140 BIT_LEN_MASK_8(__BitLen) \
143 #define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
145 LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
147 (~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen)) \
150 #define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \
151 *((u8 *)(__pStart)) = EF1Byte( \
152 LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
153 | ((((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << \
157 #define N_BYTE_ALIGMENT(__Value, __Aligment) \
158 ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / \
159 __Aligment) * __Aligment))