以下是jz2440的head.s文件,在FL2440可以使用,不做更改.注意这是NANDFLASH启动方式,FL2440开发板上的J5和J2都要插上.
@*************************************************************************
@ 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 @ 设置堆栈,64M内存
bl main
halt_loop:
b halt_loop
disable_watch_dog:
@ 往WATCHDOG寄存器写0即可
mov r1, #0x53000000
mov r2, #0x0
str r2, [r1] @将r2寄存器的值写到r1寄存值对应的地址单元
mov pc, lr @// 返回,用bl跳转会把返回地址(bl的下一条指令的地址)保存在lr寄存中
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
mov r1, #0
ldr r2, =SDRAM_BASE @第二参数有"="表示伪指令,r2为读SDRAM_BASE的地址
mov r3, #4*1024
1:
ldr r4, [r1],#4 @ 从Steppingstone读取4字节的数据,并让源地址加4
@ //将r1寄存器的值做为地址取的的数据存到r4中,并且r1寄存器的值+4
str r4, [r2],#4 @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
@ //将r4的数据保存到地址为r2寄存器值,并且r2寄存器的值+4
cmp r1, r3 @ 判断是否完成:源地址等于Steppingstone的未地址?
bne 1b @ 若没有复制完,继续 跳到上个段开始,1的位置 b:back 1表示第一个1标号处
mov pc, lr @ 返回
memsetup:
@ 设置存储控制器以便使用SDRAM等外设
mov r1, #MEM_CTL_BASE @ 存储控制器的13个寄存器的开始地址
adrl r2, mem_cfg_val @ 这13个值的起始存储地址
@ adrl 这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。
@
add r3, r1, #52 @ 13*4 = 54 r3=r1+52 =0x48000000 +#52 0x48000034
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 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
我的FL2440开发板的SDRAM是两片 H57V2562GTR-75C 最高主频133,16M*16。
下面是makefile文件,没有改变还是jz2440的.
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
下面是leds.c文件,要对应FL2440的原理图.
//FL2440
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define GPB5_out (1<<(5*2))
#define GPB6_out (1<<(6*2))
#define GPB8_out (1<<(8*2))
#define GPB10_out (1<<(10*2))
void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}
int main(void)
{
unsigned long i=0;
// 0010 0000
// 0100 0000
// 1 0000 0000
// 100 0000 0000
unsigned long arr[4]={0x20,0x40,0x100,0x400};
GPBCON = GPB5_out|GPB6_out|GPB8_out|GPB10_out; // 将LED0-3对应的GPB 5/6/8/10 output
while(1)
{
for(i=0;i<4;i++)
{
//GPBDAT=0x7ff;
//wait(90000);
GPBDAT=~arr[i];
wait(90000);
}
}
return 0;
}
编译环境用的是ubuntu9.10,直接用韦老师的虚拟机文件。