Skip to content

Commit 802a6ed

Browse files
GuEe-GUImysterywolf
authored andcommitted
[DM] Extended drivers MISC interface
1. RT_FIELD_PREP: prepare a bitfield element. 2. RT_FIELD_GET: extract a bitfield element. 3. rt_offsetof: member offset of a struct 4. rt_upper_32_bits: high 32 bits of value. 5. rt_lower_32_bits: lower 32 bits of value. 6. rt_upper_16_bits: high 16 bits of value. 7. rt_lower_16_bits: lower 16 bits of value. 8. rt_max_t: fix type of max(...). 9. rt_ilog2: integer logarithm base 2. Signed-off-by: GuEe-GUI <[email protected]>
1 parent 9631f04 commit 802a6ed

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed

components/drivers/include/drivers/misc.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#define __MISC_H__
1313

1414
#include <rtdef.h>
15+
#include <cpuport.h>
1516

1617
#ifdef ARCH_CPU_64BIT
1718
#define RT_BITS_PER_LONG 64
@@ -33,6 +34,9 @@
3334
(((__x) - ((__d) / 2)) / (__d)); \
3435
})
3536

37+
#define RT_FIELD_PREP(mask, val) (((rt_uint64_t)(val) << (__rt_ffsl((mask)) - 1)) & (mask))
38+
#define RT_FIELD_GET(mask, val) (((val) & (mask)) >> (__rt_ffsl((mask)) - 1))
39+
3640
#define RT_BIT(n) (1UL << (n))
3741
#define RT_BIT_ULL(n) (1ULL << (n))
3842
#define RT_BIT_MASK(nr) (1UL << ((nr) % RT_BITS_PER_LONG))
@@ -48,6 +52,13 @@
4852

4953
#define RT_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
5054

55+
#define rt_offsetof(s, field) ((rt_size_t)&((s *)0)->field)
56+
57+
#define rt_upper_32_bits(n) ((rt_uint32_t)(((n) >> 16) >> 16))
58+
#define rt_lower_32_bits(n) ((rt_uint32_t)((n) & 0xffffffff))
59+
#define rt_upper_16_bits(n) ((rt_uint16_t)((n) >> 16))
60+
#define rt_lower_16_bits(n) ((rt_uint16_t)((n) & 0xffff))
61+
5162
#define rt_min(x, y) \
5263
({ \
5364
typeof(x) _x = (x); \
@@ -71,6 +82,13 @@
7182
_x < _y ? _x: _y; \
7283
})
7384

85+
#define rt_max_t(type, x, y) \
86+
({ \
87+
type _x = (x); \
88+
type _y = (y); \
89+
_x > _y ? _x: _y; \
90+
})
91+
7492
#define rt_clamp(val, lo, hi) rt_min((typeof(val))rt_max(val, lo), hi)
7593

7694
#define rt_do_div(n, base) \
@@ -83,4 +101,18 @@
83101
_rem; \
84102
})
85103

104+
#ifndef rt_ilog2
105+
rt_inline int rt_ilog2(rt_ubase_t v)
106+
{
107+
int l = 0;
108+
109+
while ((1UL << l) < v)
110+
{
111+
l++;
112+
}
113+
114+
return l;
115+
}
116+
#endif /* !rt_ilog2 */
117+
86118
#endif /* __MISC_H__ */

include/rtthread.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,7 @@ rt_device_t rt_console_get_device(void);
787787
#endif /* defined(RT_USING_DEVICE) && defined(RT_USING_CONSOLE) */
788788

789789
int __rt_ffs(int value);
790+
unsigned long __rt_ffsl(unsigned long value);
790791

791792
void rt_show_version(void);
792793

libcpu/aarch64/common/cpuport.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,20 @@ int __rt_ffs(int value)
4040
#endif
4141
}
4242

43-
#endif /* RT_USING_CPU_FFS */
43+
unsigned long __rt_ffsl(unsigned long value)
44+
{
45+
#ifdef __GNUC__
46+
return __builtin_ffsl(value);
47+
#else
48+
if (!value)
49+
{
50+
return 0;
51+
}
52+
53+
__asm__ volatile ("rbit %0, %0" : "+r" (value));
54+
55+
return __rt_clz(value);
56+
#endif
57+
}
58+
59+
#endif /* RT_USING_CPU_FFS */

0 commit comments

Comments
 (0)