@*************************************************************************
@ File:head.S
@ 功能:設定SDRAM,将程式複制到SDRAM,然後跳到SDRAM繼續執行
@*************************************************************************
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog @ 關閉WATCHDOG,否則CPU會不斷重新開機
bl memsetup @ 設定存儲控制器
bl copy_steppingstone_to_sdram @ 複制代碼到SDRAM中
ldr pc, =on_sdram @ 跳到SDRAM中繼續執行
on_sdram:
ldr sp, =0x34000000 @ 設定堆棧
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往WATCHDOG寄存器寫0即可
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr @ 傳回
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K資料全部複制到SDRAM中去
@ Steppingstone起始位址為0x00000000,SDRAM中起始位址為0x30000000
mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4*1024
1:
ldr r4, [r1],#4 @ 從Steppingstone讀取4位元組的資料,并讓源位址加4
str r4, [r2],#4 @ 将此4位元組的資料複制到SDRAM中,并讓目地位址加4
cmp r1, r3 @ 判斷是否完成:源位址等于Steppingstone的未位址?
bne 1b @ 若沒有複制完,繼續
mov pc, lr @ 傳回
memsetup:
@ 設定存儲控制器以便使用SDRAM等外設
mov r1, #MEM_CTL_BASE @ 存儲控制器的13個寄存器的開始位址
adrl r2, mem_cfg_val @ 這13個值的起始存儲位址
add r3, r1, #52 @ 13*4 = 54
1:
ldr r4, [r2], #4 @ 讀取設定值,并讓r2加4
str r4, [r1], #4 @ 将此值寫入寄存器,并讓r1加4
cmp r1, r3 @ 判斷是否設定完所有13個寄存器
bne 1b @ 若沒有寫成,繼續
mov pc, lr @ 傳回
.align 4
mem_cfg_val:
@ 存儲控制器13個寄存器的設定值
.long 0x22111120 @ 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 0x008E0459 @ REFRESH
.long 0x000000B2 @ BANKSIZE
.long 0x00000030 @ MRSRB6
.long 0x00000030 @ MRSRB7