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