1.想訪問一個芯片,需要哪些條件?
a.地址線
b.數據線 8/16/32位的數據寬度
c.時鐘/頻率
d.芯片相關的一些特性比如SDRAM(行地址、列地址、Bank)
運行時,CPU通過存儲管理器->SDRAM(列/行、刷新週期、Bank地址、數據位寬)分別看內存芯片手冊,原理圖
想使用SDRAM,就需要
a.配置存儲管理器
b.使用8bank,也就是8個片選信號。每個Bank外接128M
程序啓動過程:
a.一上電,Nand前4K被拷貝到->片內內存RAM
b.關看門狗,初始化存儲管理器
c.把代碼拷貝到SDRAM裏去,繼續執行
程序源碼:
head.S
.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中,teppingstone就是0地址指向SRAM
//Steppingstone起始地址爲0x00000000,SDRAM起始地址爲0x30000000
mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4*1024
l:
ldr r4, [r1],#4 //從Steppingstone讀取4字節的數據,並讓源地址加4
str r4, [r2],#4 //將此4字節的數據複製到SDRAM中,並讓目的地址加4
cmp r1, r3 //判斷是否完成,原地址等於Steppingstone的末地址?
bne lb //若沒有複製完,繼續
mov pc, lr //返回
memsetup:
//設置存儲控制器以便使用SDRAM等外設
mov r1, #MEM_CTL_BASE //存儲控制器的13個寄存器開始地址
adr1 r2, mem_cfg_val //這13個值的起始存儲地址
add r3, r1, #52 //13*4 = 54
l:
ldr r4, [r2],#4 //讀取設置值,並讓r2加4
str r4, [r1],#4 //將此值寫入寄存器,並讓r1加4
cmp r1, r3 //判斷是否設置完所有13個寄存器
bne lb //若沒有寫成,繼續
mov pc, lr //返回
.align 4
mem_cfg_val:
//存儲管理器13個寄存器的設置值
.long 0x22011110 //BWSCON
.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 //MESRE6
.LONG 0x00000030 //MESRE7
鏈接地址:運行時,程序應該位於哪裏
即把head.S從內存拷貝到應該位於的地方0x30000000,由Makefile指定
Makefile:
sdram.bin:head.S leds.c
arm-linux-gcc -c -o head.o head.S
arm-linux-gcc -c -o leds.o leds.c
arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
arm-linux-objcopy -o binary -S sdram elf sdram.bin
arm-linux-objdump -D -m arm sdram_elf > sdram.dis
clean:
rm-f sdram.dis sdram.bin sdram_elf *.o
持續更新