1 #ifndef __INC_ENDIANFREE_H 2 #define __INC_ENDIANFREE_H 3 4 /* 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. 9 */ 10 11 #define __MACHINE_LITTLE_ENDIAN 1234 /* LSB first: i386, vax */ 12 #define __MACHINE_BIG_ENDIAN 4321 /* MSB first: 68000, ibm, net, ppc */ 13 14 #define BYTE_ORDER __MACHINE_LITTLE_ENDIAN 15 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)) 20 21 #else 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)) 30 #endif 31 32 #define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) 33 #define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) 34 #define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) 35 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)) 47 #else 48 #define H2N1BYTE(_val) ((u8)(_val)) 49 #define H2N2BYTE(_val) ((u16)(_val)) 50 #define H2N4BYTE(_val) ((u32)(_val)) 51 #endif 52 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)) 61 #else 62 #define N2H1BYTE(_val) ((u8)(_val)) 63 #define N2H2BYTE(_val) ((u16)(_val)) 64 #define N2H4BYTE(_val) ((u32)(_val)) 65 #endif 66 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)) 70 71 #define LE_P4BYTE_TO_HOST_4BYTE(__pStart) (EF4Byte(*((u32 *)(__pStart)))) 72 73 #define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ 74 ( \ 75 (LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset)) \ 76 & \ 77 BIT_LEN_MASK_32(__BitLen) \ 78 ) 79 80 #define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ 81 ( \ 82 LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ 83 & \ 84 (~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen)) \ 85 ) 86 87 #define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ 88 *((u32 *)(__pStart)) = \ 89 EF4Byte( \ 90 LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ 91 | \ 92 ((((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset)) \ 93 ); 94 95 96 #define BIT_LEN_MASK_16(__BitLen) \ 97 (0xFFFF >> (16 - (__BitLen))) 98 99 #define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ 100 (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) 101 102 #define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ 103 (EF2Byte(*((u16 *)(__pStart)))) 104 105 #define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ 106 ( \ 107 (LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset)) \ 108 & \ 109 BIT_LEN_MASK_16(__BitLen) \ 110 ) 111 112 #define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ 113 ( \ 114 LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ 115 & \ 116 (~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen)) \ 117 ) 118 119 #define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ 120 *((u16 *)(__pStart)) = \ 121 EF2Byte( \ 122 LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ 123 | ((((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << \ 124 (__BitOffset)) \ 125 ); 126 127 #define BIT_LEN_MASK_8(__BitLen) \ 128 (0xFF >> (8 - (__BitLen))) 129 130 #define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ 131 (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) 132 133 #define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ 134 (EF1Byte(*((u8 *)(__pStart)))) 135 136 #define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ 137 ( \ 138 (LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset)) \ 139 & \ 140 BIT_LEN_MASK_8(__BitLen) \ 141 ) 142 143 #define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ 144 ( \ 145 LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ 146 & \ 147 (~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen)) \ 148 ) 149 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)) << \ 154 (__BitOffset)) \ 155 ); 156 157 #define N_BYTE_ALIGMENT(__Value, __Aligment) \ 158 ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / \ 159 __Aligment) * __Aligment)) 160 #endif 161