Files

207 lines
6.6 KiB
C

#ifndef _SYSTEM_H_
#define _SYSTEM_H_
//#define isb() __asm__ volatile ("isb" : : : "memory")
typedef enum {
NO_ACCESS =0x0,
FULL_ACCESS =0x3,
READ_ONLY =0x6
}access_permission;
//region size
typedef enum {
REG_4KB =0x0B,
REG_8KB =0x0C,
REG_16KB =0x0D,
REG_32KB =0x0E,
REG_64KB =0x0F,
REG_128KB =0x10,
REG_256KB =0x11,
REG_512KB =0x12,
REG_1MB =0x13,
REG_2MB =0x14,
REG_4MB =0x15,
REG_8MB =0x16,
REG_16MB =0x17,
REG_32MB =0x18,
REG_64MB =0x19,
REG_128MB =0x1A,
REG_256MB =0x1B,
REG_512MB =0x1C,
REG_1GB =0x1D,
REG_2GB =0x1E,
REG_4GB =0x1F
}region_size;
#define SCTLR_M (1 << 0) /* Enable the MPU */
#define SCTLR_A (1 << 1) /* Alignment check enable bit */
#define SCTLR_C (1 << 2) /* Cache enable bit */
#define SCTLR_SW (1 << 10) /* SWP/SWPB enable bit */
#define SCTLR_Z (1 << 11) /* Branch prediction enable bit */
#define SCTLR_I (1 << 12) /* Instruction cache enable bit */
#define SCTLR_V (1 << 13) /* Vectors relocated to 0xffff0000 */
#define SCTLR_RR (1 << 14) /* Not on Cortex-R7 processor. Round Robin bit for cache implementation policy */
#define SCTLR_BR (1 << 17) /* Background region bit */
#define SCTLR_DZ (1 << 19) /* Divide by zero fault bit */
#define SCTLR_FI (1 << 21) /* Fast interrupts configuration enable */
#define SCTLR_U (1 << 22) /* Not on Cortex-R7 processor. Indicates use of the alignment model */
#define SCTLR_EE (1 << 25) /* Exception endianness */
#define SCTLR_NMFI (1 << 27) /* Non-maskable FIQ(NMFI) support */
#define SCTLR_TE (1 << 30) /* Thumb exception enable */
#define SCTLR_IE (1 << 31) /* Instruction Endianness */
#if 1
extern unsigned int sctlr_get(void);
extern void sctlr_set(unsigned int val);
#else
static /*inline*/ unsigned int sctlr_get(void)
{
unsigned int val;
__asm__ __volatile__ ("mrc p15, 0, %0, c1, c0, 0" : "=r" (val) : : "memory", "cc");
return val;
}
static /*inline*/ void sctlr_set(unsigned int val)
{
__asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val) : "memory", "cc");
isb();
}
#endif
/* Region num 0 has the lowest priority */
#define MAX_REGION_NUM 16
#define MPU_REGION_ACCESS_CTRL_B (1 << 0) /* Bufferable */
#define MPU_REGION_ACCESS_CTRL_C (1 << 1) /* Cacheable */
#define MPU_REGION_ACCESS_CTRL_S (1 << 2) /* Shared */
#define MPU_REGION_ACCESS_CTRL_TEX(x) (((x) & 0x7) << 3) /* Type Extensions */
#define MPU_REGION_ACCESS_CTRL_AP(x) (((x) & 0x7) << 8) /* Access Permissions */
#define MPU_REGION_ACCESS_CTRL_XN (1 << 12) /* Execute Never */
#define MPU_REGION_SIZE_MASK (0x1f << 1) /* Region size mask */
#define MPU_REGION_ENABLE (1 << 0) /* Region Enable */
#if 1
extern unsigned int mpu_get_region_num(void);
extern void mpu_set_region_num(unsigned int val);
extern unsigned int mpu_get_region_base_addr(void);
extern void mpu_set_region_base_addr(unsigned int val);
extern unsigned int mpu_get_region_size(void);
extern void mpu_set_region_size(unsigned int size);
extern unsigned int mpu_get_region_size_enable(void);
extern unsigned int mpu_get_region_access_ctrl(void);
extern void mpu_set_region_access_ctrl(unsigned int acc_ctrl);
extern void mpu_enable_region(unsigned int num, unsigned int enable);
extern void CPUCleanDCacheLine(unsigned int addr);
extern void CPUInvalidateDCacheLine(unsigned int addr);
extern void CacheInvalidateMemory(void *pMem, unsigned int size);
extern void CacheCleanMemory(void *pMem, unsigned int size);
extern void enable_psram_cache(void);
extern void disable_psram_cache(void);
#else
static /*inline*/ unsigned int mpu_get_region_num(void)
{
unsigned int val;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c2, 0" : "=r" (val) : : "memory", "cc");
return val;
}
static /*inline*/ void mpu_set_region_num(unsigned int val)
{
__asm__ __volatile__ ("mcr p15, 0, %0, c6, c2, 0" : : "r" (val) : "memory", "cc");
isb();
}
static /*inline*/ unsigned int mpu_get_region_base_addr(void)
{
unsigned int val;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 0" : "=r" (val) : : "memory", "cc");
return val;
}
static /*inline*/ void mpu_set_region_base_addr(unsigned int val)
{
__asm__ __volatile__ ("mcr p15, 0, %0, c6, c1, 0" : : "r" (val) : "cc");
isb();
}
static /*inline*/ unsigned int mpu_get_region_size(void)
{
unsigned int val;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 2" : "=r" (val) : : "memory", "cc");
return (val & MPU_REGION_SIZE_MASK) >> 1;
}
static /*inline*/ void mpu_set_region_size(unsigned int size)
{
unsigned val;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 2" : "=r" (val) : : "memory", "cc");
val = (val & ~MPU_REGION_SIZE_MASK) | (size << 1);
__asm__ __volatile__ ("mcr p15, 0, %0, c6, c1, 2" : : "r" (val) : "cc");
isb();
}
static /*inline*/ unsigned int mpu_get_region_size_enable(void)
{
unsigned int val;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 2" : "=r" (val) : : "memory", "cc");
return val;
}
static /*inline*/ unsigned int mpu_get_region_access_ctrl(void)
{
unsigned int acc_ctrl;
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 4" : "=r" (acc_ctrl) : : "memory", "cc");
return acc_ctrl;
}
static /*inline*/ void mpu_set_region_access_ctrl(unsigned int acc_ctrl)
{
__asm__ __volatile__ ("mcr p15, 0, %0, c6, c1, 4" : : "r" (acc_ctrl) : "cc");
isb();
}
static /*inline*/ void mpu_enable_region(unsigned int num, unsigned int enable)
{
unsigned val;
mpu_set_region_num(num);
__asm__ __volatile__ ("mrc p15, 0, %0, c6, c1, 2" : "=r" (val) : : "memory", "cc");
if (enable) {
val |= MPU_REGION_ENABLE;
}
else {
val &= ~MPU_REGION_ENABLE;
}
__asm__ __volatile__ ("mcr p15, 0, %0, c6, c1, 2" : : "r" (val) : "cc");
isb();
}
#endif
extern int mpu_set_region(unsigned int num, unsigned int base, unsigned int size, unsigned int acc_ctrl);
int set_mpu_reg_background(int access );
int set_mpu_reg_itcm(void);
int set_mpu_reg_dtcm(void);
int set_mpu_reg_flash(size_t size);
int set_mpu_reg_asic_reg(void);
int set_mpu_reg_psram(unsigned int enable_cache);
int set_mpu_reg_squ(void);
int set_mpu_reg_arom(void);
int reset_all_mpu_reg(void);
int reset_mpu_reg(int num);
#endif /* _SYSTEM_H_ */