Files
kunlun/inc/hw/hw_reg_api.h
2025-01-06 17:15:25 +08:00

262 lines
8.9 KiB
C
Raw 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) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef HW_REG_API_H
#define HW_REG_API_H
#include "os_types.h"
#include "chip_reg_base.h"
#ifdef __cplusplus
extern "C" {
#endif
//#define MSVC_CHECK_REG
#ifdef __GNUC__
#define SOC_READ_REG(addr) ((volatile uint32_t)*((volatile uint32_t*)(addr)))
#define SOC_WRITE_REG(addr, value) (*((volatile uint32_t*)(addr)) = (value))
#else
#ifdef MSVC_CHECK_REG
#define SOC_READ_REG(addr) \
printf("r 0x%x\n", (addr))?0:0
#define SOC_WRITE_REG(addr, value) \
printf("w 0x%x = 0x%x\n", (addr), (value))
#else
#define SOC_READ_REG(addr) (0)
#define SOC_WRITE_REG(addr, value) (void)(0)
#endif
#endif
#define REG_FIELD_GET(name, dword) ((dword & name##_MASK) >> name##_OFFSET)
#define REG_FIELD_SET(name, dword, value) \
do { \
(dword) &= ~name##_MASK; \
(dword) |= (((value) << name##_OFFSET) & name##_MASK); \
} while(0)
// 输出参数个数/2
#define __REG_N_FIELD__(...) __REG_N_FIELD_(__VA_ARGS__, __FIELD_RSEQ_N())
// 输出第66个参数
#define __REG_N_FIELD_(...) __REG_FIELD_N(__VA_ARGS__)
// 输出第N个参数至少需要66个参数
#define __REG_FIELD_N(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, \
_13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, \
_24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, \
_35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, \
_46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, \
_57, _58, _59, _60, _61, _62, _63, _64, N, ...) \
N
// 定义66个参数
#define __FIELD_RSEQ_N() \
32, 32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, \
23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16, 15, \
15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, 7, 7, 6, 6, 5, \
5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0,
// 连接字符
#define CONCATENATE(arg1, arg2) arg1##arg2
// 改写一个区域的值 需要结构体类型有 _b 变量
#define WR_FIELD_1(bitfield, val) __x._b.bitfield = val;
// 改写两个区域的值,以此类推
#define WR_FIELD_2(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_1(__VA_ARGS__); \
}
#define WR_FIELD_3(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_2(__VA_ARGS__); \
}
#define WR_FIELD_4(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_3(__VA_ARGS__); \
}
#define WR_FIELD_5(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_4(__VA_ARGS__); \
}
#define WR_FIELD_6(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_5(__VA_ARGS__); \
}
#define WR_FIELD_7(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_6(__VA_ARGS__); \
}
#define WR_FIELD_8(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_7(__VA_ARGS__); \
}
#define WR_FIELD_9(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_8(__VA_ARGS__); \
}
#define WR_FIELD_10(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_9(__VA_ARGS__); \
}
#define WR_FIELD_11(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_10(__VA_ARGS__); \
}
#define WR_FIELD_12(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_11(__VA_ARGS__); \
}
#define WR_FIELD_13(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_12(__VA_ARGS__); \
}
#define WR_FIELD_14(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_13(__VA_ARGS__); \
}
#define WR_FIELD_15(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_14(__VA_ARGS__); \
}
#define WR_FIELD_16(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_15(__VA_ARGS__); \
}
#define WR_FIELD_17(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_16(__VA_ARGS__); \
}
#define WR_FIELD_18(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_17(__VA_ARGS__); \
}
#define WR_FIELD_19(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_18(__VA_ARGS__); \
}
#define WR_FIELD_20(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_19(__VA_ARGS__); \
}
#define WR_FIELD_21(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_20(__VA_ARGS__); \
}
#define WR_FIELD_22(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_21(__VA_ARGS__); \
}
#define WR_FIELD_23(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_22(__VA_ARGS__); \
}
#define WR_FIELD_24(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_23(__VA_ARGS__); \
}
#define WR_FIELD_25(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_24(__VA_ARGS__); \
}
#define WR_FIELD_26(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_25(__VA_ARGS__); \
}
#define WR_FIELD_27(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_26(__VA_ARGS__); \
}
#define WR_FIELD_28(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_27(__VA_ARGS__); \
}
#define WR_FIELD_29(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_28(__VA_ARGS__); \
}
#define WR_FIELD_30(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_29(__VA_ARGS__); \
}
#define WR_FIELD_31(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_30(__VA_ARGS__); \
}
#define WR_FIELD_32(f, val, ...) \
{ \
WR_FIELD_1(f, val); \
WR_FIELD_31(__VA_ARGS__); \
}
// 改写寄存器结构体的N个区域用法为 WR_REG_FIELD_(改写区域个数,寄存器值,区域1名称,区域1值,区域2名称,区域2值,...)
#define WR_REG_FIELD_(N, reg, ...) \
({ \
typeof(reg) __x = reg; \
CONCATENATE(WR_FIELD_, N)(__VA_ARGS__); \
reg = __x; \
})
/**
* WR_REG_FIELD(reg, field1, val1, field2, val2, field3, val3, ...)
* 这个宏会根据参数个数自动推断需要改写的区域个数
*/
#define WR_REG_FIELD(reg, ...) \
WR_REG_FIELD_(__REG_N_FIELD__(reg, __VA_ARGS__), reg, __VA_ARGS__)
// 读取寄存器的指定区域
#define RE_REG_FIELD(reg, bitfield) \
({ \
typeof(reg) __x = reg; \
__x._b.bitfield; \
})
#ifdef __cplusplus
}
#endif
#endif // !HW_REG_API_H