SDRAM选用了两片三星公司的K4S561632(4M*16bit*4BANK),两片拼成32位数据宽度的SDRAM存储系统,
并映射到S3C2410的SROM/SDRAM的BANK6,地址范围是0x30000000~0x33FFFFFF。开发板上电启动后,自动将NandFlash开始的4K数据复制到SRAM中,然后跳转到0
开始执行,然后初始化存储控制器,把程序本身从SRAM中复制到SDRAM中,最后跳转到SDRAM中运行。故问题的关键是SDRAM的初始化,根据S3C2410的Datasheet,
要使用SDRAM,就需配置存储控制器的13个寄存器。
.equ MEM_CTL_BASE, 0x48000000
.equ SDRAM_BASE, 0x30000000
.text
.global _start
_start:
bl disable_watch_dog
bl mem_setup
bl copy_steppingstone_to_sdram
ldr pc, =on_sdram
on_sdram:
@设置栈底指针
ldr sp, =0x34000000
@跳转到main函数执行
bl main
@进入死循环
main_loop:
b main_loop
@关闭看门狗
disable_watch_dog:
ldr r1, =0x53000000
mov r2, #0x0
str r2, [r1]
mov pc, lr
@
copy_steppingstone_to_sdram:
mov r1, #0
ldr r2, =SDRAM_BASE
mov r3, #4096
1:
ldr r4, [r1], #4
str r4, [r2], #4
cmp r1, r3
bne 1b
mov pc, lr
@设置sdram控制寄存器
mem_setup:
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
add r3, r1, #52
1:
ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b
mov pc, lr@返回
@存储器控制器参数
.align 4
mem_cfg_val:
.long 0x22011110 @BWSCON
.long 0x0700 @BANKCON0,控制外接设备的访问时序
.long 0x0700 @BANKCON1,控制外接设备的访问时序
.long 0x0700 @BANKCON2,控制外接设备的访问时序
.long 0x0700 @BANKCON3,控制外接设备的访问时序
.long 0x0700 @BANKCON4,控制外接设备的访问时序
.long 0x0700 @BANKCON5,控制外接设备的访问时序
.long 0x18005 @BANKCON6
.long 0x18005 @BANKCON7
.long 0x8C07A3 @REFRESH
.long 0xB1 @BANKSIZE
.long 0x30 @MRSRB6
.long 0x30 @MRSRB7
#define LEDCON (*(volatile unsigned long *)0x56000050)
#define LEDDAT (*(volatile unsigned long *)0x56000054)
#define LED_ON(index) (LEDDAT &= ~(0x1 << ((index) + 3)))
#define LED_OFF(index) (LEDDAT |= (0x1 << ((index) + 3)))
#define SLEEP(times) do {\
int i = times ; \
for(;i; i--); \
}while(0)
int main()
{
LEDCON = 0x00005500;
while(1){
SLEEP(0x5000);
LED_OFF(1);
LED_ON(2);
LED_OFF(3);
SLEEP(0x5000);
LED_OFF(2);
LED_ON(1);
LED_OFF(3);
SLEEP(0x5000);
LED_OFF(1);
LED_ON(3);
LED_OFF(2);
}
return 0;
}
hello.bin:hello.c crt.S
arm-linux-gcc -c hello.c crt.S
arm-linux-ld -Ttext 0x00000000 crt.o hello.o -o hello_elf
arm-linux-objcopy -O binary -S hello_elf hello.bin
clean:
rm *.bak *.bin *.o