• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  * Copyright (c) 2022 Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK")
3  * All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************/
18 #pragma once
19 #include "types.h"
20 
21 #define abs(a) (((a) > 0) ? ((a)) : (-(a)))
22 
23 #define cat2(i, j)    i##j
24 #define cat3(i, j, k) i##j##k
25 
26 #ifndef min
27 #define min(a, b) ((a) < (b) ? (a) : (b))
28 #endif
29 
30 #ifndef max
31 #define max(a, b) ((a) > (b) ? (a) : (b))
32 #endif
33 
34 #ifndef min2
35 #define min2(a, b) ((a) < (b) ? (a) : (b))
36 #endif
37 
38 #ifndef min3
39 #define min3(a, b, c) min2(min2(a, b), c)
40 #endif
41 
42 #ifndef max2
43 #define max2(a, b) ((a) > (b) ? (a) : (b))
44 #endif
45 
46 #ifndef max3
47 #define max3(a, b, c) max2(max2(a, b), c)
48 #endif
49 
50 #define OFFSETOF(s, m)      ((unsigned int)&((s *)0)->m)
51 #define ROUND_INT(x, r)     (((x) + (r)-1) / (r) * (r))
52 #define ROUND_TO_POW2(x, r) (((x) + (r)-1) & ~((r)-1))
53 
54 // direct memory access
55 #define U8_GET(addr)  (*(volatile unsigned char *)(addr))
56 #define U16_GET(addr) (*(volatile unsigned short *)(addr))
57 #define U32_GET(addr) (*(volatile unsigned int *)(addr))
58 
59 #define U8_SET(addr, v)  (*(volatile unsigned char *)(addr) = (unsigned char)(v))
60 #define U16_SET(addr, v) (*(volatile unsigned short *)(addr) = (unsigned short)(v))
61 #define U32_SET(addr, v) (*(volatile unsigned int *)(addr) = (v))
62 
63 #define U8_INC(addr)  U8_GET(addr) += 1
64 #define U16_INC(addr) U16_GET(addr) += 1
65 #define U32_INC(addr) U32_GET(addr) += 1
66 
67 #define U8_DEC(addr)  U8_GET(addr) -= 1
68 #define U16_DEC(addr) U16_GET(addr) -= 1
69 #define U32_DEC(addr) U32_GET(addr) -= 1
70 
71 #define U8_CPY(addr1, addr2)  U8_SET(addr1, U8_GET(addr2))
72 #define U16_CPY(addr1, addr2) U16_SET(addr1, U16_GET(addr2))
73 #define U32_CPY(addr1, addr2) U32_SET(addr1, U32_GET(addr2))
74 
75 #define MAKE_U16(h, l)       ((unsigned short)(((h) << 8) | (l)))
76 #define MAKE_U24(a, b, c)    ((unsigned int)(((a) << 16) | ((b) << 8) | (c)))
77 #define MAKE_U32(a, b, c, d) ((unsigned int)(((a) << 24) | ((b) << 16) | ((c) << 8) | (d)))
78 
79 #define BOUND(x, l, m)     ((x) < (l) ? (l) : ((x) > (m) ? (m) : (x)))
80 #define SET_BOUND(x, l, m) ((x) = BOUND(x, l, m))
81 #define BOUND_INC(x, m)                                                                                               \
82     do {                                                                                                              \
83         ++(x);                                                                                                        \
84         (x) = (x) < (m) ? (x) : 0;                                                                                    \
85     } while (0)
86 #define BOUND_INC_POW2(x, m)                                                                                          \
87     do {                                                                                                              \
88         (x) = ((x) + 1) & ((m) - 1);                                                                                    \
89     } while (0)
90 
91 #define IS_POWER_OF_2(x)  (!((x) & (x - 1)))
92 #define IS_LITTLE_ENDIAN  (*(unsigned short *)"\0\xff" > 0x100)
93 #define IS_4BYTE_ALIGN(x) (!((x) & 3))
94 
95 #define IMPLIES(x, y) (!(x) || (y))
96 
97 #define COMPARE(x, y) (((x) > (y)) - ((x) < (y)))
98 #define SIGN(x)       COMPARE(x, 0)
99 
100 // better than xor swap:
101 // http://stackoverflow.com/questions/3912699/why-swap-with-xor-works-fine-in-c-but-in-java-doesnt-some-puzzle
102 #define SWAP(x, y, T)                                                                                                 \
103     do {                                                                                                              \
104         T tmp = (x);                                                                                                  \
105         (x) = (y);                                                                                                    \
106         (y) = tmp;                                                                                                    \
107     } while (0)
108 #define SORT2(a, b, T)                                                                                                \
109     do {                                                                                                              \
110         if ((a) > (b))                                                                                                \
111             SWAP((a), (b), T);                                                                                        \
112     } while (0)
113 
114 #define foreach(i, n)          for (int i = 0; (i) < (n); ++(i))
115 #define foreach_range(i, s, e) for (int i = (s); (i) < (e); ++(i))
116 #define foreach_arr(i, arr)    for (int i = 0; (i) < ARRAY_SIZE(arr); ++(i))
117 
118 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*a))
119 
120 #define everyN(i, n)                                                                                                  \
121     ++(i);                                                                                                            \
122     (i) = ((i) < N ? (i) : 0);                                                                                        \
123     if (0 == (i))
124 
125 #define U16_HI(a) (((a) >> 8) & 0xFF)
126 #define U16_LO(a) ((a)&0xFF)
127 
128 #define U32_BYTE0(a) ((a)&0xFF)
129 #define U32_BYTE1(a) (((a) >> 8) & 0xFF)
130 #define U32_BYTE2(a) (((a) >> 16) & 0xFF)
131 #define U32_BYTE3(a) (((a) >> 24) & 0xFF)
132 
133 void swapN(unsigned char *p, int n);
134 void swapX(const u8 *src, u8 *dst, int len);
135 
136 void swap24(u8 dst[3], const u8 src[3]);
137 void swap32(u8 dst[4], const u8 src[4]);
138 void swap48(u8 dst[6], const u8 src[6]);
139 void swap56(u8 dst[7], const u8 src[7]);
140 
141 void swap64(u8 dst[8], const u8 src[8]);
142 
143 void swap128(u8 dst[16], const u8 src[16]);
144 
145 void flip_addr(u8 *dest, u8 *src);
146 
mul64_32x32(u32 u,u32 v)147 static inline u64 mul64_32x32(u32 u, u32 v)
148 {
149     return (u64)u * v;
150 }
151 
152 typedef struct {
153     u32 size;
154     u16 num;
155     u8 wptr;
156     u8 rptr;
157     u8 *p;
158 } my_fifo_t;
159 
160 void my_fifo_init(my_fifo_t *f, int s, u8 n, u8 *p);
161 u8 *my_fifo_wptr(my_fifo_t *f);
162 u8 *my_fifo_wptr_v2(my_fifo_t *f);
163 void my_fifo_next(my_fifo_t *f);
164 int my_fifo_push(my_fifo_t *f, u8 *p, int n);
165 void my_fifo_pop(my_fifo_t *f);
166 u8 *my_fifo_get(my_fifo_t *f);
167 
168 #define MYFIFO_INIT(name, size, n)                                                                                    \
169     u8 name##_b[(size) * (n)] = {0};                                                                                      \
170     my_fifo_t name = {size, n, 0, 0, name##_b}
171 
172 #define MYFIFO_INIT_IRAM(name, size, n)                                                                               \
173     u8 name##_b[(size) * (n)] __attribute__((aligned(4))); /* ={0} */                                                     \
174     my_fifo_t name = {size, n, 0, 0, name##_b}
175 
176 #define DATA_LENGTH_ALLIGN4(n)  (((n) + 3) / 4 * 4)
177 #define DATA_LENGTH_ALLIGN16(n) (((n) + 15) / 16 * 16)
178