1 /******************************************************************************
4 Lantiq Deutschland GmbH
6 For licensing information, see the file 'LICENSE' in the root folder of
9 ******************************************************************************/
10 #ifndef __MTLK_BFIELD_H__
11 #define __MTLK_BFIELD_H__
13 /*********************************************************************************
14 * Defines for working with bitmasks.
16 * CAUTION: PRESET does not zero the bits prior to set!
17 * Use it only if you sure the var is zeroed! For example:
22 * MTLK_U_BITS_GET(var, 2, 5); - gets 5 bits from BIT2
23 * MTLK_U_BITS_GET(var, 0, 11); - gets 11 bits from BIT0
25 * MTLK_U_BITS_SET(var, 2, 5, 0x1F); - sets 5 bits from BIT2 to 0x1F
26 * MTLK_U_BITS_SET(var, 0, 11, 0); - sets 11 bits from BIT0 to 0
28 * MTLK_U_BITS_PRESET(var, 4, 7, 3); - sets 7 bits from BIT4 to 3
30 * MTLK_U_BITS_ZERO(var, 3, 2); - zeros 2 bits from BIT3
32 * MTLK_U_BITS_VALUE(3, 4, 2, uint32);- returns uint32 value of 2 set in 4 bits from
33 * BIT3. I.e. 0x00000010. May be used for initialization:
34 * uint32 var = MTLK_U_BITS_VALUE(3, 4, 2, uint32) |
35 * MTLK_U_BITS_VALUE(7, 1, 1, uint32);
36 **********************************************************************************/
38 #define _MTLK_U_AUX_BITS(len) \
40 #define _MTLK_U_AUX_BITMASK(from, len) \
41 (_MTLK_U_AUX_BITS(len) << (from))
43 #define _MTLK_U_AUX_BITS_GET(bf, from, len) \
44 (((bf) >> (from)) & ((1 << (len)) - 1))
45 #define _MTLK_U_AUX_BITS_ZERO(bf, from, len) \
46 (bf) &= ~_MTLK_U_AUX_BITMASK(from, len)
47 #define _MTLK_U_AUX_BITS_SET(bf, from, len, val) \
48 (bf) |= (((val) << (from)) & _MTLK_U_AUX_BITMASK(from, len))
50 #define MTLK_U_BITS_GET(bf, from, len) \
51 _MTLK_U_AUX_BITS_GET((bf), (from), (len))
53 #define MTLK_U_BITS_ZERO(bf, from, len) \
54 _MTLK_U_AUX_BITS_ZERO((bf), (from), (len))
56 #define MTLK_U_BITS_SET(bf, from, len, val) \
58 _MTLK_U_AUX_BITS_ZERO(bf, from, len); \
59 _MTLK_U_AUX_BITS_SET(bf, from, len, val); \
62 #define MTLK_U_BITS_VALUE(from, len, val, type) \
63 ((((type)(val)) & _MTLK_U_AUX_BITS(len)) << (from))
65 /*********************************************************************************
66 * Defines for working with bitmask structure fields.
68 * #define Field1 MTLK_BFIELD_INFO(0, 1)
69 * #define Field2 MTLK_BFIELD_INFO(3, 10)
71 * MTLK_U_BITS_GET(mask_field, Field1); - gets Field1 bitfield
72 * MTLK_U_BITS_SET(mask_field, Field1, 10); - sets Field1 bitfield to 10
73 * MTLK_U_BITS_ZERO(mask_field, Field1); - zeros Field1 bitfield
74 *********************************************************************************/
76 #define _MTLK_BFIELD_INFO_PACK(info, offset) \
77 (((uint16)(uint8)(info)) << (offset))
78 #define _MTLK_BFIELD_INFO_UNPACK(info, offset) \
79 ((uint8)(((uint16)(info)) >> (offset)))
81 #define MTLK_BFIELD_INFO(from, len) \
82 (_MTLK_BFIELD_INFO_PACK(from, 0) | \
83 _MTLK_BFIELD_INFO_PACK(len, 8))
85 #define MTLK_BFIELD_GET(var, info) \
86 MTLK_U_BITS_GET((var), \
87 _MTLK_BFIELD_INFO_UNPACK(info, 0), \
88 _MTLK_BFIELD_INFO_UNPACK(info, 8))
90 #define MTLK_BFIELD_ZERO(var, info) \
91 MTLK_U_BITS_ZERO((var), \
92 _MTLK_BFIELD_INFO_UNPACK(info, 0), \
93 _MTLK_BFIELD_INFO_UNPACK(info, 8))
95 #define MTLK_BFIELD_SET(var, info, val) \
96 MTLK_U_BITS_SET(var, \
97 _MTLK_BFIELD_INFO_UNPACK(info, 0), \
98 _MTLK_BFIELD_INFO_UNPACK(info, 8), \
101 #define MTLK_BFIELD_VALUE(info, val, type) \
102 MTLK_U_BITS_VALUE(_MTLK_BFIELD_INFO_UNPACK(info, 0), \
103 _MTLK_BFIELD_INFO_UNPACK(info, 8), \
107 #endif /* __MTLK_BFIELD_H__ */