• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description:  connectivity register, memory io.
15  * Author:
16  * Create:  2018-10-15
17  */
18 
19 #ifndef CHIP_IO_H
20 #define CHIP_IO_H
21 
22 #include <stdint.h>
23 #include <stddef.h>
24 #include <stdbool.h>
25 
26 #ifdef __cplusplus
27 #if __cplusplus
28 extern "C" {
29 #endif
30 #endif
31 
32 #ifdef WIN32
33 uint8_t readb(uint32_t addr);
34 #endif
35 #define ON            (true)
36 #define OFF           (false)
37 #define POS(x)        (x)
38 
39 #ifndef MAX
40 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
41 #endif
42 
43 #ifndef MIN
44 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
45 #endif
46 
47 #ifndef BIT
48 #define BIT(x) (1UL << (uint32_t)(x))
49 #endif
50 
51 #ifndef UNUSED
52 #define UNUSED(var) do { (void)(var); } while (0)
53 #endif
54 
55 /* Make true and false actual booleans, not ints, to avoid Lint moaning. GCC defines them as ints. */
56 #ifdef true
57 #undef true
58 #endif
59 
60 #ifdef false
61 #undef false
62 #endif
63 
64 #define true ((bool) 1)
65 #define false ((bool) 0)
66 
67 /** PMU_LPM wakeup types */
68 typedef enum {
69     TURN_OFF,
70     TURN_ON
71 } switch_type_t;
72 
73 /** reg32 bit pos types */
74 typedef enum {
75     POS_16 = 16,
76     POS_17,
77     POS_18,
78     POS_19,
79     POS_20,
80     POS_21,
81     POS_22,
82     POS_23,
83     POS_24,
84     POS_25,
85     POS_26,
86     POS_27,
87     POS_28,
88     POS_29,
89     POS_30,
90     POS_31
91 } REG32_POS;
92 
93 /** reg32 bit pos types */
94 typedef enum {
95     POS_0,
96     POS_1,
97     POS_2,
98     POS_3,
99     POS_4,
100     POS_5,
101     POS_6,
102     POS_7,
103     POS_8,
104     POS_9,
105     POS_10,
106     POS_11,
107     POS_12,
108     POS_13,
109     POS_14,
110     POS_15
111 } REG16_POS;
112 
113 #ifndef BIT_31
114 #define BIT_31 ((uint32_t)(1 << 31))
115 #define BIT_30 ((uint32_t)(1 << 30))
116 #define BIT_29 ((uint32_t)(1 << 29))
117 #define BIT_28 ((uint32_t)(1 << 28))
118 #define BIT_27 ((uint32_t)(1 << 27))
119 #define BIT_26 ((uint32_t)(1 << 26))
120 #define BIT_25 ((uint32_t)(1 << 25))
121 #define BIT_24 ((uint32_t)(1 << 24))
122 #define BIT_23 ((uint32_t)(1 << 23))
123 #define BIT_22 ((uint32_t)(1 << 22))
124 #define BIT_21 ((uint32_t)(1 << 21))
125 #define BIT_20 ((uint32_t)(1 << 20))
126 #define BIT_19 ((uint32_t)(1 << 19))
127 #define BIT_18 ((uint32_t)(1 << 18))
128 #define BIT_17 ((uint32_t)(1 << 17))
129 #define BIT_16 ((uint32_t)(1 << 16))
130 #define BIT_15 ((uint32_t)(1 << 15))
131 #define BIT_14 ((uint32_t)(1 << 14))
132 #define BIT_13 ((uint32_t)(1 << 13))
133 #define BIT_12 ((uint32_t)(1 << 12))
134 #define BIT_11 ((uint32_t)(1 << 11))
135 #define BIT_10 ((uint32_t)(1 << 10))
136 #define BIT_9  ((uint32_t)(1 << 9))
137 #define BIT_8  ((uint32_t)(1 << 8))
138 #define BIT_7  ((uint32_t)(1 << 7))
139 #define BIT_6  ((uint32_t)(1 << 6))
140 #define BIT_5  ((uint32_t)(1 << 5))
141 #define BIT_4  ((uint32_t)(1 << 4))
142 #define BIT_3  ((uint32_t)(1 << 3))
143 #define BIT_2  ((uint32_t)(1 << 2))
144 #define BIT_1  ((uint32_t)(1 << 1))
145 #define BIT_0  ((uint32_t)(1 << 0))
146 #endif
147 
148 /*******************************内存操作宏定义 ****************************************/
149 /* liteos中有相同宏名定义,并且定义使用有差异,需要使用芯片定义宏,将其他已定义相同宏undef */
150 #ifdef writel
151 #undef writel
152 #endif
153 
154 #ifdef writew
155 #undef writew
156 #endif
157 
158 #ifdef writeb
159 #undef writeb
160 #endif
161 
162 #ifndef UT_TEST
163 #define writel(addr, d)                             (*(volatile uint32_t*)(uintptr_t)(addr) = (uint32_t)(d))
164 #define writew(addr, d)                             (*(volatile uint16_t*)(uintptr_t)(addr) = (uint16_t)(d))
165 #else
166 #define writel(addr, d)
167 #define writew(addr, d)
168 #endif
169 #define writeb(addr, d)                             (*(volatile uint8_t*)(uintptr_t)(addr) = (uint8_t)(d))
170 
171 #ifndef readl
172 #ifndef UT_TEST
173 #define readl(addr)                                 (*(volatile uint32_t*)(uintptr_t)(addr))
174 #else
175 #define readl(addr)                                 NULL
176 #endif
177 #endif
178 
179 #ifndef readw
180 #define readw(addr)                                 (*(volatile uint16_t*)(uintptr_t)(addr))
181 #endif
182 
183 #ifndef readb
184 #define readb(addr)                                 (*(volatile uint8_t*)(uintptr_t)(addr))
185 #endif
186 
187 /******************************寄存器操作宏定义 ***************************************/
188 /********************分为base + offset 和直接给出地址两类*****************************/
189 #define reg(base, offset)                           (*(volatile uint32_t *)(uintptr_t)((uint32_t)(base) + (offset)))
190 #define regb(base, offset)                          (*(volatile uint8_t *)(uintptr_t)((uint32_t)(base) + (offset)))
191 #define regw(base, offset)                          (*(volatile uint16_t *)(uintptr_t)((uint32_t)(base) + (offset)))
192 
193 #define reg32(register)                             (*(volatile uint32_t*)(uintptr_t)(register))
194 #define reg16(register)                             (*(volatile uint16_t*)(uintptr_t)(register))
195 #define reg8(register)                              (*(volatile uint8_t*)(uintptr_t)(register))
196 
197 /**************************base+register offset*********************************************************/
198 #define reg_clrbit(base, offset, pos)               ((reg(base, offset)) &= ~((uint32_t)(1) << (pos)))
199 #define regw_clrbit(base, offset, pos)              ((regw(base, offset)) &= ~((uint16_t)(1) << (pos)))
200 #define regb_clrbit(base, offset, pos)              ((regb(base, offset)) &= ~((uint8_t)(1) << (pos)))
201 
202 #define reg_setbit(base, offset, pos)               ((reg(base, offset)) |= ((uint32_t)(1) << (pos)))
203 #define regw_setbit(base, offset, pos)              ((regw(base, offset)) |= (uint16_t)((uint32_t)(1) << (pos)))
204 #define regb_setbit(base, offset, pos)              ((regb(base, offset)) |= ((uint8_t)(1) << (pos)))
205 
206 /* 将var中[pos, pos + bits-1]比特清零,  pos从0开始编号 e.g BDOM_CLR_BITS(var, 4, 2) 表示将Bit5~4清零 */
207 #define reg_clrbits(base, offset, pos, bits)        (reg(base, offset) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
208 #define regw_clrbits(base, offset, pos, bits)       (regw(base, offset) &= ~((((uint16_t)1 << (bits)) - 1) << (pos)))
209 #define regb_clrbits(base, offset, pos, bits)       (regb(base, offset) &= ~((((uint8_t)1 << (bits)) - 1) << (pos)))
210 
211 
212 /* 将var中[pos, pos + bits-1]比特设置为val,  pos从0开始编号
213    e.g BDOM_SET_BITS(var, 4, 2, 2) 表示将Bit5~4设置为b'10 */
214 #define reg_setbits(b, r, pos, bits, val)  (reg(b, r) = (reg(b, r) & (~((((uint32_t)1 << (bits)) - 1) << (pos)))) \
215                                                         | ((uint32_t)((val) & (((uint32_t)1 << (bits)) - 1)) << (pos)))
216 #define regw_setbits(b, r, pos, bits, val) (regw(b, r) = (regw(b, r) & (~((((uint16_t)1 << (bits)) - 1) << (pos)))) \
217                                                         | ((uint16_t)((val) & (((uint16_t)1 << (bits)) - 1)) << (pos)))
218 #define regb_setbits(b, r, pos, bits, val) (regb(b, r) = (regb(b, r) & (~((((uint8_t)1 << (bits)) - 1) << (pos)))) \
219                                                         | ((uint8_t)((val) & (((uint8_t)1 << (bits)) - 1)) << (pos)))
220 /* 获取var中[pos, pos + bits-1]比特值,  pos从0开始编号 */
221 #define reg_getbits(base, offset, pos, bits)         ((reg(base, offset) >> (pos)) & (((uint32_t)1 << (bits)) - 1))
222 #define regw_getbits(base, offset, pos, bits)        ((regw(base, offset) >> (pos)) & (((uint16_t)1 << (bits)) - 1))
223 #define regb_getbits(base, offset, pos, bits)        ((regb(base, offset) >> (pos)) & (((uint8_t) 1<< (bits)) - 1))
224 
225 #define reg_clrbitmsk(base, offset, msk)             ((reg(base, offset)) &= ~(msk))
226 #define regw_clrbitmsk(base, offset, msk)            ((regw(base, offset)) &= ~(msk))
227 #define regb_clrbitmsk(base, offset, msk)            ((regb(base, offset)) &= ~(msk))
228 
229 #define reg_setbitmsk(base, offset, msk)             ((reg(base, offset)) |= (msk))
230 #define regw_setbitmsk(base, offset, msk)            ((regw(base, offset)) |= (msk))
231 #define regb_setbitmsk(base, offset, msk)            ((regb(base, offset)) |= (msk))
232 
233 #define reg_read(base, offset, result)               ((result) = reg(base, offset))
234 #define reg_readw(base, offset, result)              ((result) = regw(base, offset))
235 #define reg_readb(base, offset, result)              ((result) = regb(base, offset))
236 
237 #define reg_write(base, offset, data)                (reg(base, offset) = (data))
238 #define reg_writew(base, offset, data)               (regw(base, offset) = (data))
239 #define reg_writeb(base, offset, data)               (regb(base, offset) = (data))
240 
241 /**************************only register*************************************************************/
242 #define reg32_clrbit(register, pos)                    (reg32(register) &= ~((uint32_t)((1U) << (uint32_t)(pos))))
243 #ifndef UT_TEST
244 #define reg16_clrbit(register, pos)                    (reg16(register) &= ~((uint16_t)((1U) << (uint16_t)(pos))))
245 #else
246 #define reg16_clrbit(register, pos)
247 #endif
248 #define reg8_clrbit(register, pos)                     (reg8(register) &= ~((uint8_t)((1U) << (pos))))
249 
250 #define reg32_setbit(register, pos)                    (reg32(register) |= ((uint32_t)((1U) << (uint32_t)(pos))))
251 #ifndef UT_TEST
252 #define reg16_setbit(register, pos)                    (reg16(register) |= ((uint16_t)((1U) << (uint16_t)(pos))))
253 #else
254 #define reg16_setbit(register, pos)
255 #endif
256 #define reg8_setbit(register, pos)                     (reg8(register) |= ((uint8_t)((1U) << (pos))))
257 
258 /* 读取寄存器指定位的值,pos从0开始编号 */
259 #ifndef UT_TEST
260 #define reg32_getbit(register, pos)                    ((reg32(register) >> (pos)) & ((uint32_t)(1U)))
261 #define reg16_getbit(register, pos)                    ((reg16(register) >> (pos)) & ((uint16_t)(1U)))
262 #else
263 #define reg32_getbit(register, pos)                     NULL
264 #define reg16_getbit(register, pos)                     NULL
265 #endif
266 #define reg8_getbit(register, pos)                     ((reg8(register) >> (pos)) & ((uint8_t)(1U)))
267 
268 /* 将var中[pos, pos + bits-1]比特清零,  pos从0开始编号 e.g BDOM_CLR_BITS(var, 4, 2) 表示将Bit5~4清零 */
269 #define reg32_clrbits(register, pos, bits)             (reg32(register) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
270 #define reg16_clrbits(register, pos, bits)             (reg16(register) &= \
271                                                         ~(uint16_t)((((uint32_t)1 << (bits)) - 1) << (pos)))
272 #define reg8_clrbits(register, pos, bits)              (reg8(register) &= \
273                                                         ~(uint8_t)((((uint32_t)1 << (bits)) - 1) << (pos)))
274 
275 /* 将var中[pos, pos + bits-1]比特设置为val,  pos从0开始编号 e.g BDOM_SET_BITS(var, 4, 2, 2) 表示将Bit5~4设置为b'10 */
276 #define reg32_setbits(r, p, b, v) (reg32(r) = (reg32(r) & \
277                                               (~((((uint32_t)1 << (uint32_t)(b)) - 1) << (uint32_t)(p)))) \
278                                               | ((uint32_t)((uint32_t)(v) & \
279                                               (((uint32_t)1 << (uint32_t)(b)) - 1)) << (uint32_t)(p)))
280 
281 #define reg16_setbits(r, p, b, v) (reg16(r) = (reg16(r) & \
282                                               (uint16_t)(~((((uint32_t)1 << (uint16_t)(b)) - 1) << (uint16_t)(p)))) \
283                                               | (uint16_t)((uint32_t)((uint16_t)(v) & \
284                                               (((uint32_t)1 << (uint16_t)(b)) - 1)) << (uint16_t)(p)))
285 
286 #define reg8_setbits(r, p, b, v)  (reg8(r) = (reg8(r) & (~((((uint8_t)1 << (b)) - 1) << (p)))) \
287                                               | ((uint8_t)((v) & (((uint8_t)1 << (b)) - 1)) << (p)))
288 
289 /* 获取var中[pos, pos + bits-1]比特值,  pos从0开始编号 */
290 #define reg32_getbits(register, pos, bits)           ((reg32(register) >> (pos)) & (((uint32_t)1 << (bits)) - 1))
291 #define reg16_getbits(register, pos, bits)           ((reg16(register) >> (pos)) & \
292                                                       ((uint16_t)((uint32_t)1 << (bits)) - 1))
293 #define reg8_getbits(register, pos, bits)            ((reg8(register) >> (pos)) & (((uint8_t)1 << (bits)) - 1))
294 
295 #define reg32_clrbitmsk(register, msk)               ((reg32(register)) &= ~(msk))
296 #define reg16_clrbitmsk(register, msk)               ((reg16(register)) &= ~(msk))
297 #define reg8_clrbitmsk(register, msk)                ((reg8(register)) &= ~(msk))
298 
299 #define reg32_setbitmsk(register, msk)               ((reg32(register)) |= (msk))
300 #define reg16_setbitmsk(register, msk)               ((reg16(register)) |= (msk))
301 #define reg8_setbitmsk(register, msk)                ((reg8(register)) |= (msk))
302 
303 #define reg32_read(register, result)                 ((result) = reg32(register))
304 #define reg16_read(register, result)                 ((result) = reg16(register))
305 #define reg8_read(register, result)                  ((result) = reg8(register))
306 
307 #define reg32_write(register, data)                  (reg32(register) = (data))
308 #define reg16_write(register, data)                  (reg16(register) = (data))
309 #define reg8_write(register, data)                   (reg8(register) = (data))
310 
311 #define p8(addr)                                    (*((volatile uint8_t*)(addr)))
312 #define p16(addr)                                   (*((volatile uint16_t*)(addr)))
313 #define p32(addr)                                   (*((volatile uint32_t*)(addr)))
314 
315 #define point8_setbit(point, pos)                   (p8(point) |= (uint8_t)((1U) << (pos)))
316 #define point16_setbit(point, pos)                  (p16(point) |= (uint16_t)((1U) << (pos)))
317 #define point32_setbit(point, pos)                  (p32(point) |= (uint32_t)((1U) << (pos)))
318 
319 #define point8_setbits(p, pos, b, v)  (p8(p) = (uint8_t)(p8(p) & (~((((uint8_t)1 << (b)) - 1) << (pos)))) \
320                                                | ((uint8_t)((v) & (((uint8_t)1 << (b)) - 1)) << (pos)))
321 
322 #define point16_setbits(p, pos, b, v) (p16(p) = (uint16_t)(p16(p) & \
323                                                 (~((((uint16_t)1 << (uint16_t)(b)) - 1) << (uint16_t)(pos)))) \
324                                                 | ((uint16_t)((uint16_t)(v) & \
325                                                 (((uint16_t)1 << (uint16_t)(b)) - 1)) << (uint16_t)(pos)))
326 
327 #define point32_setbits(p, pos, b, v) (p32(p) = (uint32_t)(p32(p) & (~((((uint32_t)1 << (b)) - 1) << (pos)))) \
328                                                | ((uint32_t)((v) & (((uint32_t)1 << (b)) - 1)) << (pos)))
329 
330 #define point8_clrbit(point, pos)                  (p8(point) &= ~(uint8_t)((1U) << (pos)))
331 #define point16_clrbit(point, pos)                 (p16(point) &= ~(uint16_t)((1U) << (pos)))
332 #define point32_clrbit(point, pos)                 (p32(point) &= ~(uint32_t)((1U) << (pos)))
333 
334 #define point8_clrbits(point, pos, bits)           (p8(point) &= ~((((uint8_t)1 << (bits)) - 1) << (pos)))
335 #define point16_clrbits(point, pos, bits)          (p16(point) &= ~((((uint16_t)1 << (bits)) - 1) << (pos)))
336 #define point32_clrbits(point, pos, bits)          (p32(point) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
337 
338 #ifdef __cplusplus
339 #if __cplusplus
340         }
341 #endif
342 #endif
343 #endif
344