// 适用平台, tq2440
// 简化了不少东西, 不支持中断, 显得很简洁
#define S3C2440_MPLL_200MHZ ((0x5c<<12)|(0x01<<4)|(0x02))
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))
#define MEM_CTL_BASE 0x48000000
.text
.global _start
_start:
//1. 关闭看门狗
ldr r0, =0x53000000 // WTCON = 0x53000000
mov r1, #0
str r1, [r0]
//2. 设置时钟
// 设置分频系数
ldr r0, =0x4c000014 // CLKDIVN = 0x4c000014
//mov r1, #0x03 // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
mov r1, #0x05 // FCLK:HCLK:PCLK=1:4:8
str r1, [r0]
// CLKDIV_VAL大于1就需要设置下面这个, 官方要求
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
// 设置FLCK频率
ldr r0, =0x4c000004
ldr r1, =S3C2440_MPLL_400MHZ
str r1, [r0]
//3. 启动ICACHE
//mrc p15, 0, r0, c1, c0, 0
//orr r0, r0, #(1<<12)
//mcr p15, 0, r0, c1, c0, 0
//4. 初始化SDRAM
ldr r0, =MEM_CTL_BASE
adr r1, sdram_config
add r3, r0, #(13*4)
1:
ldr r2, [r1], #4
str r2, [r0], #4
cmp r0, r3
bne 1b
//5. 重定位
// 设栈在最高地址
ldr sp, =0x34000000
// 初始化nand
bl nand_init
mov r0, #0
ldr r1, =_start
ldr r2, =__bss_start
sub r2, r2, r1
// 调用函数从Nor 或者 Nand 拷贝数据到内存
bl copy_code_to_sdram
// 清理bss段
bl clear_bss
//6. 跳到main去咯
ldr pc, =main
sdram_config:
.long 0x22011000 //BWSCON
.long 0x00000700 //BANKCON0
.long 0x00000700 //BANKCON1
.long 0x00000700 //BANKCON2
.long 0x00000700 //BANKCON3
.long 0x00000700 //BANKCON4
.long 0x00000700 //BANKCON5
.long 0x00018005 //BANKCON6
.long 0x00018005 //BANKCON7
.long 0x008C04F4 //REFRESH 4
.long 0x000000B1 //BANKSIZE
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7