天天看點

ARM S3C2410 從sdram啟動流水燈(1)head.S

@*************************************************************************

@ 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