mcu_hi3321_watch/middleware/utils/common_headers/chip_io.h
2025-05-26 20:15:20 +08:00

333 lines
14 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) CompanyNameMagicTag 2018-2020. All rights reserved.
* Description: connectivity register, memory io.
* Author:
* Create: 2018-10-15
*/
#ifndef CHIP_IO_H
#define CHIP_IO_H
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif
#ifdef WIN32
uint8_t readb(uint32_t addr);
#endif
#define ON (true)
#define OFF (false)
#define POS(x) (x)
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef BIT
#define BIT(x) (1UL << (uint32_t)(x))
#endif
#ifndef UNUSED
#define UNUSED(var) do { (void)(var); } while (0)
#endif
/* Make true and false actual booleans, not ints, to avoid Lint moaning. GCC defines them as ints. */
#ifdef true
#undef true
#endif
#ifdef false
#undef false
#endif
#define true ((bool) 1)
#define false ((bool) 0)
/** PMU_LPM wakeup types */
typedef enum {
TURN_OFF,
TURN_ON
} switch_type_t;
/** reg32 bit pos types */
typedef enum {
POS_16 = 16,
POS_17,
POS_18,
POS_19,
POS_20,
POS_21,
POS_22,
POS_23,
POS_24,
POS_25,
POS_26,
POS_27,
POS_28,
POS_29,
POS_30,
POS_31
} REG32_POS;
/** reg32 bit pos types */
typedef enum {
POS_0,
POS_1,
POS_2,
POS_3,
POS_4,
POS_5,
POS_6,
POS_7,
POS_8,
POS_9,
POS_10,
POS_11,
POS_12,
POS_13,
POS_14,
POS_15
} REG16_POS;
#ifndef BIT_31
#define BIT_31 ((uint32_t)(1 << 31))
#define BIT_30 ((uint32_t)(1 << 30))
#define BIT_29 ((uint32_t)(1 << 29))
#define BIT_28 ((uint32_t)(1 << 28))
#define BIT_27 ((uint32_t)(1 << 27))
#define BIT_26 ((uint32_t)(1 << 26))
#define BIT_25 ((uint32_t)(1 << 25))
#define BIT_24 ((uint32_t)(1 << 24))
#define BIT_23 ((uint32_t)(1 << 23))
#define BIT_22 ((uint32_t)(1 << 22))
#define BIT_21 ((uint32_t)(1 << 21))
#define BIT_20 ((uint32_t)(1 << 20))
#define BIT_19 ((uint32_t)(1 << 19))
#define BIT_18 ((uint32_t)(1 << 18))
#define BIT_17 ((uint32_t)(1 << 17))
#define BIT_16 ((uint32_t)(1 << 16))
#define BIT_15 ((uint32_t)(1 << 15))
#define BIT_14 ((uint32_t)(1 << 14))
#define BIT_13 ((uint32_t)(1 << 13))
#define BIT_12 ((uint32_t)(1 << 12))
#define BIT_11 ((uint32_t)(1 << 11))
#define BIT_10 ((uint32_t)(1 << 10))
#define BIT_9 ((uint32_t)(1 << 9))
#define BIT_8 ((uint32_t)(1 << 8))
#define BIT_7 ((uint32_t)(1 << 7))
#define BIT_6 ((uint32_t)(1 << 6))
#define BIT_5 ((uint32_t)(1 << 5))
#define BIT_4 ((uint32_t)(1 << 4))
#define BIT_3 ((uint32_t)(1 << 3))
#define BIT_2 ((uint32_t)(1 << 2))
#define BIT_1 ((uint32_t)(1 << 1))
#define BIT_0 ((uint32_t)(1 << 0))
#endif
/*******************************内存操作宏定义 ****************************************/
/* liteos中有相同宏名定义并且定义使用有差异需要使用芯片定义宏将其他已定义相同宏undef */
#ifdef writel
#undef writel
#endif
#ifdef writew
#undef writew
#endif
#ifdef writeb
#undef writeb
#endif
#ifndef UT_TEST
#define writel(addr, d) (*(volatile uint32_t*)(uintptr_t)(addr) = (uint32_t)(d))
#define writew(addr, d) (*(volatile uint16_t*)(uintptr_t)(addr) = (uint16_t)(d))
#else
#define writel(addr, d)
#define writew(addr, d)
#endif
#define writeb(addr, d) (*(volatile uint8_t*)(uintptr_t)(addr) = (uint8_t)(d))
#ifndef readl
#ifndef UT_TEST
#define readl(addr) (*(volatile uint32_t*)(uintptr_t)(addr))
#else
#define readl(addr) NULL
#endif
#endif
#ifndef readw
#define readw(addr) (*(volatile uint16_t*)(uintptr_t)(addr))
#endif
#ifndef readb
#define readb(addr) (*(volatile uint8_t*)(uintptr_t)(addr))
#endif
/******************************寄存器操作宏定义 ***************************************/
/********************分为base + offset 和直接给出地址两类*****************************/
#define reg(base, offset) (*(volatile uint32_t *)(uintptr_t)((uint32_t)(base) + (offset)))
#define regb(base, offset) (*(volatile uint8_t *)(uintptr_t)((uint32_t)(base) + (offset)))
#define regw(base, offset) (*(volatile uint16_t *)(uintptr_t)((uint32_t)(base) + (offset)))
#define reg32(register) (*(volatile uint32_t*)(uintptr_t)(register))
#define reg16(register) (*(volatile uint16_t*)(uintptr_t)(register))
#define reg8(register) (*(volatile uint8_t*)(uintptr_t)(register))
/**************************base+register offset*********************************************************/
#define reg_clrbit(base, offset, pos) ((reg(base, offset)) &= ~((uint32_t)(1) << (pos)))
#define regw_clrbit(base, offset, pos) ((regw(base, offset)) &= ~((uint16_t)(1) << (pos)))
#define regb_clrbit(base, offset, pos) ((regb(base, offset)) &= ~((uint8_t)(1) << (pos)))
#define reg_setbit(base, offset, pos) ((reg(base, offset)) |= ((uint32_t)(1) << (pos)))
#define regw_setbit(base, offset, pos) ((regw(base, offset)) |= (uint16_t)((uint32_t)(1) << (pos)))
#define regb_setbit(base, offset, pos) ((regb(base, offset)) |= ((uint8_t)(1) << (pos)))
/* 将var中[pos, pos + bits-1]比特清零, pos从0开始编号 e.g BDOM_CLR_BITS(var, 4, 2) 表示将Bit5~4清零 */
#define reg_clrbits(base, offset, pos, bits) (reg(base, offset) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
#define regw_clrbits(base, offset, pos, bits) (regw(base, offset) &= ~((((uint16_t)1 << (bits)) - 1) << (pos)))
#define regb_clrbits(base, offset, pos, bits) (regb(base, offset) &= ~((((uint8_t)1 << (bits)) - 1) << (pos)))
/* 将var中[pos, pos + bits-1]比特设置为val, pos从0开始编号
e.g BDOM_SET_BITS(var, 4, 2, 2) 表示将Bit5~4设置为b'10 */
#define reg_setbits(b, r, pos, bits, val) (reg(b, r) = (reg(b, r) & (~((((uint32_t)1 << (bits)) - 1) << (pos)))) \
| ((uint32_t)((val) & (((uint32_t)1 << (bits)) - 1)) << (pos)))
#define regw_setbits(b, r, pos, bits, val) (regw(b, r) = (regw(b, r) & (~((((uint16_t)1 << (bits)) - 1) << (pos)))) \
| ((uint16_t)((val) & (((uint16_t)1 << (bits)) - 1)) << (pos)))
#define regb_setbits(b, r, pos, bits, val) (regb(b, r) = (regb(b, r) & (~((((uint8_t)1 << (bits)) - 1) << (pos)))) \
| ((uint8_t)((val) & (((uint8_t)1 << (bits)) - 1)) << (pos)))
/* 获取var中[pos, pos + bits-1]比特值, pos从0开始编号 */
#define reg_getbits(base, offset, pos, bits) ((reg(base, offset) >> (pos)) & (((uint32_t)1 << (bits)) - 1))
#define regw_getbits(base, offset, pos, bits) ((regw(base, offset) >> (pos)) & (((uint16_t)1 << (bits)) - 1))
#define regb_getbits(base, offset, pos, bits) ((regb(base, offset) >> (pos)) & (((uint8_t) 1<< (bits)) - 1))
#define reg_clrbitmsk(base, offset, msk) ((reg(base, offset)) &= ~(msk))
#define regw_clrbitmsk(base, offset, msk) ((regw(base, offset)) &= ~(msk))
#define regb_clrbitmsk(base, offset, msk) ((regb(base, offset)) &= ~(msk))
#define reg_setbitmsk(base, offset, msk) ((reg(base, offset)) |= (msk))
#define regw_setbitmsk(base, offset, msk) ((regw(base, offset)) |= (msk))
#define regb_setbitmsk(base, offset, msk) ((regb(base, offset)) |= (msk))
#define reg_read(base, offset, result) ((result) = reg(base, offset))
#define reg_readw(base, offset, result) ((result) = regw(base, offset))
#define reg_readb(base, offset, result) ((result) = regb(base, offset))
#define reg_write(base, offset, data) (reg(base, offset) = (data))
#define reg_writew(base, offset, data) (regw(base, offset) = (data))
#define reg_writeb(base, offset, data) (regb(base, offset) = (data))
/**************************only register*************************************************************/
#define reg32_clrbit(register, pos) (reg32(register) &= ~((uint32_t)((1U) << (uint32_t)(pos))))
#ifndef UT_TEST
#define reg16_clrbit(register, pos) (reg16(register) &= ~((uint16_t)((1U) << (uint16_t)(pos))))
#else
#define reg16_clrbit(register, pos)
#endif
#define reg8_clrbit(register, pos) (reg8(register) &= ~((uint8_t)((1U) << (pos))))
#define reg32_setbit(register, pos) (reg32(register) |= ((uint32_t)((1U) << (uint32_t)(pos))))
#ifndef UT_TEST
#define reg16_setbit(register, pos) (reg16(register) |= ((uint16_t)((1U) << (uint16_t)(pos))))
#else
#define reg16_setbit(register, pos)
#endif
#define reg8_setbit(register, pos) (reg8(register) |= ((uint8_t)((1U) << (pos))))
/* 读取寄存器指定位的值,pos从0开始编号 */
#ifndef UT_TEST
#define reg32_getbit(register, pos) ((reg32(register) >> (pos)) & ((uint32_t)(1U)))
#define reg16_getbit(register, pos) ((reg16(register) >> (pos)) & ((uint16_t)(1U)))
#else
#define reg32_getbit(register, pos) NULL
#define reg16_getbit(register, pos) NULL
#endif
#define reg8_getbit(register, pos) ((reg8(register) >> (pos)) & ((uint8_t)(1U)))
/* 将var中[pos, pos + bits-1]比特清零, pos从0开始编号 e.g BDOM_CLR_BITS(var, 4, 2) 表示将Bit5~4清零 */
#define reg32_clrbits(register, pos, bits) (reg32(register) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
#define reg16_clrbits(register, pos, bits) (reg16(register) &= \
~(uint16_t)((((uint32_t)1 << (bits)) - 1) << (pos)))
#define reg8_clrbits(register, pos, bits) (reg8(register) &= \
~(uint8_t)((((uint32_t)1 << (bits)) - 1) << (pos)))
/* 将var中[pos, pos + bits-1]比特设置为val, pos从0开始编号 e.g BDOM_SET_BITS(var, 4, 2, 2) 表示将Bit5~4设置为b'10 */
#define reg32_setbits(r, p, b, v) (reg32(r) = (reg32(r) & \
(~((((uint32_t)1 << (uint32_t)(b)) - 1) << (uint32_t)(p)))) \
| ((uint32_t)((uint32_t)(v) & \
(((uint32_t)1 << (uint32_t)(b)) - 1)) << (uint32_t)(p)))
#define reg16_setbits(r, p, b, v) (reg16(r) = (reg16(r) & \
(uint16_t)(~((((uint32_t)1 << (uint16_t)(b)) - 1) << (uint16_t)(p)))) \
| (uint16_t)((uint32_t)((uint16_t)(v) & \
(((uint32_t)1 << (uint16_t)(b)) - 1)) << (uint16_t)(p)))
#define reg8_setbits(r, p, b, v) (reg8(r) = (reg8(r) & (~((((uint8_t)1 << (b)) - 1) << (p)))) \
| ((uint8_t)((v) & (((uint8_t)1 << (b)) - 1)) << (p)))
/* 获取var中[pos, pos + bits-1]比特值, pos从0开始编号 */
#define reg32_getbits(register, pos, bits) ((reg32(register) >> (pos)) & (((uint32_t)1 << (bits)) - 1))
#define reg16_getbits(register, pos, bits) ((reg16(register) >> (pos)) & \
((uint16_t)((uint32_t)1 << (bits)) - 1))
#define reg8_getbits(register, pos, bits) ((reg8(register) >> (pos)) & (((uint8_t)1 << (bits)) - 1))
#define reg32_clrbitmsk(register, msk) ((reg32(register)) &= ~(msk))
#define reg16_clrbitmsk(register, msk) ((reg16(register)) &= ~(msk))
#define reg8_clrbitmsk(register, msk) ((reg8(register)) &= ~(msk))
#define reg32_setbitmsk(register, msk) ((reg32(register)) |= (msk))
#define reg16_setbitmsk(register, msk) ((reg16(register)) |= (msk))
#define reg8_setbitmsk(register, msk) ((reg8(register)) |= (msk))
#define reg32_read(register, result) ((result) = reg32(register))
#define reg16_read(register, result) ((result) = reg16(register))
#define reg8_read(register, result) ((result) = reg8(register))
#define reg32_write(register, data) (reg32(register) = (data))
#define reg16_write(register, data) (reg16(register) = (data))
#define reg8_write(register, data) (reg8(register) = (data))
#define p8(addr) (*((volatile uint8_t*)(addr)))
#define p16(addr) (*((volatile uint16_t*)(addr)))
#define p32(addr) (*((volatile uint32_t*)(addr)))
#define point8_setbit(point, pos) (p8(point) |= (uint8_t)((1U) << (pos)))
#define point16_setbit(point, pos) (p16(point) |= (uint16_t)((1U) << (pos)))
#define point32_setbit(point, pos) (p32(point) |= (uint32_t)((1U) << (pos)))
#define point8_setbits(p, pos, b, v) (p8(p) = (uint8_t)(p8(p) & (~((((uint8_t)1 << (b)) - 1) << (pos)))) \
| ((uint8_t)((v) & (((uint8_t)1 << (b)) - 1)) << (pos)))
#define point16_setbits(p, pos, b, v) (p16(p) = (uint16_t)(p16(p) & \
(~((((uint16_t)1 << (uint16_t)(b)) - 1) << (uint16_t)(pos)))) \
| ((uint16_t)((uint16_t)(v) & \
(((uint16_t)1 << (uint16_t)(b)) - 1)) << (uint16_t)(pos)))
#define point32_setbits(p, pos, b, v) (p32(p) = (uint32_t)(p32(p) & (~((((uint32_t)1 << (b)) - 1) << (pos)))) \
| ((uint32_t)((v) & (((uint32_t)1 << (b)) - 1)) << (pos)))
#define point8_clrbit(point, pos) (p8(point) &= ~(uint8_t)((1U) << (pos)))
#define point16_clrbit(point, pos) (p16(point) &= ~(uint16_t)((1U) << (pos)))
#define point32_clrbit(point, pos) (p32(point) &= ~(uint32_t)((1U) << (pos)))
#define point8_clrbits(point, pos, bits) (p8(point) &= ~((((uint8_t)1 << (bits)) - 1) << (pos)))
#define point16_clrbits(point, pos, bits) (p16(point) &= ~((((uint16_t)1 << (bits)) - 1) << (pos)))
#define point32_clrbits(point, pos, bits) (p32(point) &= ~((((uint32_t)1 << (bits)) - 1) << (pos)))
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif
#endif