/********************************************************
*init.c:进行一些初始化,在steppingstone中进行
*他和head.S同属第一部分程序,此时MMU未启动,使用物理地址
*********************************************************/
#define WTCON (*(volatile unsigned long *)0x53000000)
#define MEM_CTL_BASE 0x48000000
void disable_watch_dog(void){
WTCON=0;
}
void memsetup(void){
unsigned long const mem_cfg_val[]={
0x22011110, //BWSCON
0X00000700, //BANKCON0
0X00000700, //BANKCON1
0X00000700, //BANKCON2
0X00000700, //BANKCON3
0X00000700, //BANKCON4
0X00000700, //BANKCON5
0X00180005, //BANKCON6
0X00180005, //BANKCON7
0X008C07A3, //REFRESH
0X000000B1, //BANKSIZE
0X00000030, //MRSRB6
0X00000030, //MRSRB7
};
int i=0;
volatile unsigned long *p=(volatile unsigned long *)MEM_CTL_BASE;
for(;i<13;i++)
p[i]=mem_cfg_val[i];
}
void copy_2_sdram(void){
/*******************
*复制代码到SDRAM
********************/
unsigned int *pdwSrc=(unsigned int *)2048;
unsigned int *pdwDest=(unsigned int *)0x30004000;
while (pdwSrc<(unsigned int *)4096){
*pdwDest=*pdwSrc;
pdwDest++;
pdwSrc++;
}
}
void create_page_table(void){
/*****************************
*设置页表
******************************/
#define MMU_FULL_ACCESS (3<<10) //访问权限
#define MMU_DOMAIN (0<<5) //属于哪个域
#define MMU_SPECIAL (1<<4) //必须是1
#define MMU_CACHEABLE (1<<3)
#define MMU_BUFERABLE (1<<2)
#define MMU_SECTION (2) //表示为段描述符
#define MMU_SECDESC (MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_SECTION
#define MMU_SECDESC_WB (MMU_FULL_ACCESS|MMU_DOMAIN|MMU_SPECIAL|MMU_CACHEABLE|MMU_BUFERABLE|MMU_SECTION
#define MMU_SECTION_SIZE 0x00100000
unsigned long virtuladdr,physicaladdr;
unsigned long *mmu_tlb_base=(unsigned long *)0x30000000;
virtuladdr=0;
physicaladdr=0;
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xfff00000)|MMU_SECDESC_WB;
virtuladdr=0xa0000000;
physicaladdr=0x56000040;
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xfff00000)|MMU_SECDESC;
virtuladdr=0xb0000000;
physicaladdr=0x30000000;
while(virtuladdr<0xb4000000){
*(mmu_tlb_base+(virtuladdr>>20))=(physicaladdr&0xfff00000)|MMU_SECDESC_WB;
virtuladdr+=0x100000;
physicaladdr+=0x100000;
}
}
void mmu_init(void){
/**************************
******启动mmu*************
***************************/
unsigned long ttb=0x30000000;
__asm__(
"mov r0,#0\n"
"mcr p15,0,r0,c7,c7,0\n" /*使无效ICaches和DCaches*/
"mcr p15,0,r0,c7,c10,4\n" /*drain write buffer on v4*/
"mcr p15,0,r0,c8,c7,0\n" /*使无效指令、数据TLB*/
"mov r4,%0\n" /*r4=页表基址*/
"mcr p15,0,r0,c3,c0,0\n" /*设置页表基址寄存器*/
"mvn r0,#0\n"
"mcr p15,0,r0,c3,c0,0\n" /*域访问控制寄存器设为0xffffffff,不进行权限检查*/
//对于控制寄存器,先读入其值,在此基础上修改感兴趣的位,然后写入
"mrc p15,0,r0,c1,c0,0\n"
"bic r0,r0,#0x3000\n"
"bic r0,r0,#0x0300\n"
"bic r0,r0,#0x0087\n"
"orr r0,r0,#0x0002\n"
"orr r0,r0,#0x0004\n"
"orr r0,r0,#0x1000\n"
"orr r0,r0,#0x0001\n"
"mcr p15,0,r0,c1,c0,0\n"
:
:"r"(ttb));
}