S3C2440—9.複製程序到SDRAM中執行

一.S3C2440的啓動方式

S3C2440的MMU有一種“steppingstone”.技術,是協助MCU從無法執行程序的NAND FLASH執行啓動程序的一種方法,其啓動步驟如下:

  • 1、系統上電後,首先自動判斷是否是autoboot模式,如果使用 s3c2440是帶有nandflash的,並且被設置成autoboot,從nandflash開始啓動.
  • 2、在判斷是autoboot模式後,mcu內置的nandflash控制器自動將nandflash的最前面的4k區域(這4k區域存放着 bootloader的最前面4k代碼)拷貝到samsung所謂的"steppingstone"裏面(steppingstone是在S3C2440 中,實際上是一塊4k大小的SRAM,).
  • 3、在拷貝完前4k代碼後,nandflash控制器自動將"steppingstone"映射到arm地址空間0x00000000開始的前4k區域.
  • 4、在映射過程完成後.nandflash控制器將pc指針直接指向arm地址空間的0x00000000位置,準備開始執行"steppingstone"上的代碼.
  • 5、而"steppingstone"上從nandflash拷貝過來的4k代碼,是程序員寫的bootloader的前4k代碼.這個 bootloader在之前寫好,並已經被燒寫到nandflash的0x00000000開始的最前面區域…而這"steppingstone"上的 4k代碼就是bootloader的前4k代碼.
  • 6、在pc指向arm地址空間的0x00000000後,系統就開始執行指令代碼.這4k代碼的任務是:初始化硬件,設置中斷向量表,設置堆棧,然後一個很重要的任務是,將nandflash的最前面區域的bootloader(包含4k啓動代碼)拷貝到SDRAM中去,bootloader代碼的大小是寫好bootloader就確定的.然後只需要確定bootloader想映射到SDRAM的起始位置就ok.
  • 7、在完成對nandflash上的bootloader搬移後,找到4k代碼的搬移代碼最後一個指令的下一個指令在SDRAM的bootloader的地址,然後跳轉到該位置,繼續執行bootloader的剩餘代碼(引導系統).

二.代碼

彙編代碼:


/* 相當於宏定義,定義存儲控制器和SDRAM的基地址 */
.equ MEM_CTL_BASE,        0x48000000
.equ SDRAM_BASE,          0x30000000

.text
.global _start

_start:
    /* 採用調用函數的形式 */
    
    bl watch_dog_close              @關閉看門狗
    bl memsetup                     @設置存儲控制器的13個寄存器
    bl copy_steppingstone_to_sdram  @將Steppingstone的4KB複製到SDRAM
    ldr pc, =on_sdram               @當前程序跳轉到SDRAM中去執行

on_sdram:
    ldr sp, =0x34000000             @設置棧
    bl main                         @跳轉去執行main函數

halt_loop:
    b halt_loop




watch_dog_close:
    /* 關閉看門狗,否則會一直重啓,地址0x53000000,[0]位寫0關閉 */
    ldr r0, =0x53000000
    ldr r1, =0
    str r1, [r0]
    mov pc, lr


memsetup:
    /* 存儲控制器的寄存器配置,配置存儲控制器以使用SDRAM */
    mov r1, #MEM_CTL_BASE
    adrl r2, mem_cfg_val   @將13個寄存器的值僞讀取取到r2中
    add  r3, r1, #52     @r3=r1+52  52:13*4(13個4Byte寄存器)
1:
    ldr r4, [r2], #4     @將r2中的值讀取到r4中,然後r2+4
    str r4, [r1], #4     @將r4的內容寫到r1中存儲的地址後,r1中地址+4(初次r1地址爲MEM_CTL_BASE)
    cmp r1, r3           @比較r1中現在的地址,看看是否完成13個寄存器的相應配置(13*4Byte)
    bne 1b               @如果未完成,繼續
    mov pc, lr           @完成後,返回_start繼續執行

.align 4
mem_cfg_val:
    /* 存儲控制器的13個寄存器的設置值 */
    .long 0x22011110 @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 0x008c07a3 @REFRESH
    .long 0x000000b1 @BANKSIZE
    .long 0x00000030 @MRSRB6
    .long 0x00000030 @MRSRB7


copy_steppingstone_to_sdram:
    /* 將Steppingstone的4KB數據複製到SDRAM中 
     * Steppingstone的基地址爲:0x00000000
     * SDRAM的基地址爲:0x30000000
     */
    mov r1, #0           @Steppingstone基地址
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024     
1:
    ldr r4, [r1], #4    @從源地址讀取4Byte數據
    str r4, [r2], #4    @將源地址的4Byte數據寫入目標地址
    cmp r1,r3           @對比是否複製完畢
    bne 1b
    mov pc, lr          @完成後,返回_start繼續執行


Makefile:

all:
	arm-linux-gcc -c -o main.o main.c
	arm-linux-gcc -c -o head.o head.S
	arm-linux-ld  -Ttext 0x30000000 head.o main.o  -o sdram.elf
	arm-linux-objcopy -O binary -S sdram.elf sdram.bin
	arm-linux-objdump -D sdram.elf > sdram.dis

clean:
	rm *.o *.elf *.dis

Makefile中:arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf連接到了SDRAM的基地址0x30000000

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章