27#ifndef _TUSB_COMMON_H_
28#define _TUSB_COMMON_H_
37#define TU_ARRAY_SIZE(_arr) ( sizeof(_arr) / sizeof(_arr[0]) )
38#define TU_MIN(_x, _y) ( ( (_x) < (_y) ) ? (_x) : (_y) )
39#define TU_MAX(_x, _y) ( ( (_x) > (_y) ) ? (_x) : (_y) )
40#define TU_DIV_CEIL(n, d) (((n) + (d) - 1) / (d))
42#define TU_U16(_high, _low) ((uint16_t) (((_high) << 8) | (_low)))
43#define TU_U16_HIGH(_u16) ((uint8_t) (((_u16) >> 8) & 0x00ff))
44#define TU_U16_LOW(_u16) ((uint8_t) ((_u16) & 0x00ff))
45#define U16_TO_U8S_BE(_u16) TU_U16_HIGH(_u16), TU_U16_LOW(_u16)
46#define U16_TO_U8S_LE(_u16) TU_U16_LOW(_u16), TU_U16_HIGH(_u16)
48#define TU_U32_BYTE3(_u32) ((uint8_t) ((((uint32_t) _u32) >> 24) & 0x000000ff))
49#define TU_U32_BYTE2(_u32) ((uint8_t) ((((uint32_t) _u32) >> 16) & 0x000000ff))
50#define TU_U32_BYTE1(_u32) ((uint8_t) ((((uint32_t) _u32) >> 8) & 0x000000ff))
51#define TU_U32_BYTE0(_u32) ((uint8_t) (((uint32_t) _u32) & 0x000000ff))
53#define U32_TO_U8S_BE(_u32) TU_U32_BYTE3(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE0(_u32)
54#define U32_TO_U8S_LE(_u32) TU_U32_BYTE0(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE3(_u32)
56#define TU_BIT(n) (1UL << (n))
59#define TU_GENMASK(h, l) ( (UINT32_MAX << (l)) & (UINT32_MAX >> (31 - (h))) )
86TU_ATTR_WEAK
extern void tusb_app_dcache_flush(uintptr_t addr, uint32_t data_size);
100#define tu_memclr(buffer, size) memset((buffer), 0, (size))
101#define tu_varclr(_var) tu_memclr(_var, sizeof(*(_var)))
104TU_ATTR_ALWAYS_INLINE
static inline int tu_memset_s(
void *dest,
size_t destsz,
int ch,
size_t count) {
106 if ( count > destsz ) {
109 memset(dest, ch, count);
114TU_ATTR_ALWAYS_INLINE
static inline int tu_memcpy_s(
void *dest,
size_t destsz,
const void *src,
size_t count) {
116 if ( count > destsz ) {
125TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_u32(uint8_t b3, uint8_t b2, uint8_t b1, uint8_t b0) {
126 return (((uint32_t)b3) << 24) | (((uint32_t)b2) << 16) | (((uint32_t)b1) << 8) | b0;
129TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_u32_from_u16(uint16_t high, uint16_t low) {
130 return (((uint32_t)high) << 16) | low;
133TU_ATTR_ALWAYS_INLINE
static inline uint16_t
tu_u16(uint8_t high, uint8_t low) {
134 return (uint16_t)((((uint16_t)high) << 8) | low);
137TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u32_byte3(uint32_t ui32) {
return TU_U32_BYTE3(ui32); }
138TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u32_byte2(uint32_t ui32) {
return TU_U32_BYTE2(ui32); }
139TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u32_byte1(uint32_t ui32) {
return TU_U32_BYTE1(ui32); }
140TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u32_byte0(uint32_t ui32) {
return TU_U32_BYTE0(ui32); }
142TU_ATTR_ALWAYS_INLINE
static inline uint16_t
tu_u32_high16(uint32_t ui32) {
return (uint16_t) (ui32 >> 16); }
143TU_ATTR_ALWAYS_INLINE
static inline uint16_t
tu_u32_low16 (uint32_t ui32) {
return (uint16_t) (ui32 & 0x0000ffffu); }
145TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u16_high(uint16_t ui16) {
return TU_U16_HIGH(ui16); }
146TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_u16_low (uint16_t ui16) {
return TU_U16_LOW(ui16); }
149TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_bit_set (uint32_t value, uint8_t pos) {
return value | TU_BIT(
pos); }
150TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_bit_clear(uint32_t value, uint8_t pos) {
return value & (~TU_BIT(
pos)); }
151TU_ATTR_ALWAYS_INLINE
static inline bool tu_bit_test (uint32_t value, uint8_t pos) {
return (value & TU_BIT(
pos)) ? true :
false; }
154TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_min8 (uint8_t x, uint8_t y ) {
return (x < y) ? x : y; }
155TU_ATTR_ALWAYS_INLINE
static inline uint16_t
tu_min16 (uint16_t x, uint16_t y) {
return (x < y) ? x : y; }
156TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_min32 (uint32_t x, uint32_t y) {
return (x < y) ? x : y; }
159TU_ATTR_ALWAYS_INLINE
static inline uint8_t
tu_max8 (uint8_t x, uint8_t y ) {
return (x > y) ? x : y; }
160TU_ATTR_ALWAYS_INLINE
static inline uint16_t
tu_max16 (uint16_t x, uint16_t y) {
return (x > y) ? x : y; }
161TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_max32 (uint32_t x, uint32_t y) {
return (x > y) ? x : y; }
164TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align(uint32_t value, uint32_t alignment) {
165 return value & ((uint32_t) ~(alignment-1));
168TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align4 (uint32_t value) {
return (value & 0xFFFFFFFCUL); }
169TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align8 (uint32_t value) {
return (value & 0xFFFFFFF8UL); }
170TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align16 (uint32_t value) {
return (value & 0xFFFFFFF0UL); }
171TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align32 (uint32_t value) {
return (value & 0xFFFFFFE0UL); }
172TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_align4k (uint32_t value) {
return (value & 0xFFFFF000UL); }
173TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_offset4k(uint32_t value) {
return (value & 0xFFFUL); }
175TU_ATTR_ALWAYS_INLINE
static inline bool tu_is_aligned32(uint32_t value) {
return (value & 0x1FUL) == 0; }
176TU_ATTR_ALWAYS_INLINE
static inline bool tu_is_aligned64(uint64_t value) {
return (value & 0x3FUL) == 0; }
179TU_ATTR_ALWAYS_INLINE
static inline uint32_t
tu_div_ceil(uint32_t v, uint32_t d) {
return (v + d -1)/d; }
186 while (value >>= 1) { result++; }
197 return (value != 0) && ((value & (value - 1)) == 0);
201#if TUP_ARCH_STRICT_ALIGN
209 tu_unaligned_uint32_t
const* ua32 = (tu_unaligned_uint32_t
const*) mem;
215 tu_unaligned_uint32_t* ua32 = (tu_unaligned_uint32_t*) mem;
221 tu_unaligned_uint16_t
const* ua16 = (tu_unaligned_uint16_t
const*) mem;
227 tu_unaligned_uint16_t* ua16 = (tu_unaligned_uint16_t*) mem;
231#elif TUP_MCU_STRICT_ALIGN
239 volatile uint8_t
const* buf8 = (uint8_t
const*) mem;
240 return tu_u32(buf8[3], buf8[2], buf8[1], buf8[0]);
245 volatile uint8_t* buf8 = (uint8_t*) mem;
254 volatile uint8_t
const* buf8 = (uint8_t
const*) mem;
255 return tu_u16(buf8[1], buf8[0]);
260 volatile uint8_t* buf8 = (uint8_t*) mem;
270 return *((uint32_t
const *) mem);
274 return *((uint16_t
const *) mem);
278 *((uint32_t *) mem) = value;
282 *((uint16_t *) mem) = value;
289#if defined(__GNUC__) && !defined(__CC_ARM)
291#define TU_BIN8(x) ((uint8_t) (0b##x))
292#define TU_BIN16(b1, b2) ((uint16_t) (0b##b1##b2))
293#define TU_BIN32(b1, b2, b3, b4) ((uint32_t) (0b##b1##b2##b3##b4))
298#define _B8__(x) (((x&0x0000000FUL)?1:0) \
299 +((x&0x000000F0UL)?2:0) \
300 +((x&0x00000F00UL)?4:0) \
301 +((x&0x0000F000UL)?8:0) \
302 +((x&0x000F0000UL)?16:0) \
303 +((x&0x00F00000UL)?32:0) \
304 +((x&0x0F000000UL)?64:0) \
305 +((x&0xF0000000UL)?128:0))
307#define TU_BIN8(d) ((uint8_t) _B8__(0x##d##UL))
308#define TU_BIN16(dmsb,dlsb) (((uint16_t)TU_BIN8(dmsb)<<8) + TU_BIN8(dlsb))
309#define TU_BIN32(dmsb,db2,db3,dlsb) \
310 (((uint32_t)TU_BIN8(dmsb)<<24) \
311 + ((uint32_t)TU_BIN8(db2)<<16) \
312 + ((uint32_t)TU_BIN8(db3)<<8) \
static void * memcpy(void *dst, const void *src, size_t n)
AUDIO Channel Cluster Descriptor (4.1)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_div_ceil(uint32_t v, uint32_t d)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_bit_set(uint32_t value, uint8_t pos)
static TU_ATTR_ALWAYS_INLINE bool tu_is_aligned32(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align32(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_bit_clear(uint32_t value, uint8_t pos)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u16_low(uint16_t ui16)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_max8(uint8_t x, uint8_t y)
TU_ATTR_WEAK void * tusb_app_phys_to_virt(void *phys_addr)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align8(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_min8(uint8_t x, uint8_t y)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u32_byte1(uint32_t ui32)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_u32_low16(uint32_t ui32)
static bool tu_is_power_of_two(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u32_byte0(uint32_t ui32)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_u32_high16(uint32_t ui32)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align4k(uint32_t value)
static TU_ATTR_ALWAYS_INLINE void tu_unaligned_write32(void *mem, uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_min32(uint32_t x, uint32_t y)
static TU_ATTR_ALWAYS_INLINE int tu_memset_s(void *dest, size_t destsz, int ch, size_t count)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_unaligned_read32(const void *mem)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u16_high(uint16_t ui16)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align4(uint32_t value)
TU_ATTR_WEAK void * tusb_app_virt_to_phys(void *virt_addr)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_unaligned_read16(const void *mem)
static TU_ATTR_ALWAYS_INLINE bool tu_is_aligned64(uint64_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_max32(uint32_t x, uint32_t y)
TU_ATTR_WEAK void tusb_app_dcache_invalidate(uintptr_t addr, uint32_t data_size)
static TU_ATTR_ALWAYS_INLINE int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count)
static uint8_t tu_log2(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u32_byte2(uint32_t ui32)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_u32(uint8_t b3, uint8_t b2, uint8_t b1, uint8_t b0)
static TU_ATTR_ALWAYS_INLINE void tu_unaligned_write16(void *mem, uint16_t value)
static TU_ATTR_ALWAYS_INLINE bool tu_bit_test(uint32_t value, uint8_t pos)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align16(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_align(uint32_t value, uint32_t alignment)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_max16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_offset4k(uint32_t value)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_u32_from_u16(uint16_t high, uint16_t low)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_u32_byte3(uint32_t ui32)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_u16(uint8_t high, uint8_t low)