JZ2440存储控制器

来源:互联网 发布:西昊电脑椅 知乎 编辑:程序博客网 时间:2024/06/03 20:00

裸机系列代码地址:链接:http://pan.baidu.com/s/1pLHOd0v 密码:4x5s

s3c2440的“存储控制器”提供了访问外部设备的信号

在JZ2440共有8个bank,每个bank的最大访问容量为128M
bank0~bank5支持外接ROM,SRAM
bank6~bank7支持外接ROM,SRAM,SDRAM
在外接SDRAM时,支持自刷新,和省电模式
S3C2440理论上可寻址4G地址范围,可实际上除了外接的8个bank可最大寻址1G空间外,还有一部分
是cpu内部寄存器的地址
S3C2440依据8个片选线nGCS0~nGCS7来选中要寻址的BANK,内部的27根地址线决定片内BANK要寻址的空间

所以每个BANK具体的起始地址由nGCS决定的基地址和内部地址线组成

nGCS决定的基地址
nGCS0:0x00000000
nGCS1:0x08000000
nGCS2:0x10000000
nGCS3:0x18000000
nGCS4:0x20000000
nGCS5:0x28000000
nGCS6:0x30000000
nGCS7:0x38000000
存储控制器所接的具体的外设及访问地址
BANKx 外设名称                            起始地址                  结束地址              大小(字节)
BANK0 NORFlash                        0x00000000            0x001fffff              2M
BANK1       IDE接口命令块寄存器     0x08000000            0x8000000f        16
BANK2       IDE接口命令块寄存器     0x10000000            0x1000000f        16
BANK3       10M网卡CS8900A          0x19000000            0x190fffff              1M
BANK4       100M网卡DM9000          0x20000000            0x20000004 注:只有这两个地址
BANK5       扩展串口A                         0x28000000            0x28000007         8
BANK5       扩展串口B                         0x29000000            0x29000007         8
BANK6       SDRAM                             0x30000000            0x33ffffff              64M

CPU使用13个寄存器来控制对这8个BANK的访问
(1)BWSCON 位宽和等待控制寄存器
每4位控制一个BANK,总共32位控制8个bank
STx:禁止启动SDRAM,对于SDRAM此位为0,其他为1
WSx:是否使用存储器的WAIT信号,通常设为0
DWx:设置位宽 0b00对应8位,0b01对应16位,0b10对应32位

对于JZ2440开发板,此位通常设置为0x22011110

(2)BANK控制寄存器BANKCONx(x为0~5,共6个)

这几个寄存器用来控制BANK0~BANK5的外接设备的访问时序,默认使用0x700

(3)BANK控制寄存器BANKCONx(x为6或7),之所以同上面分别对待,是因为BANK6(7)支持SDRAM
MT[16:15]:用来设置此BANK外接的是SDRAM还是ROM/SRAM,如果是ROM/SRAM则和BANK0~5没有区别
0b00:外接的是ROM/SRAM,此寄存器与BANKCON0~5类似
0b11:外接的是SDRAM,此时寄存器的其它位数如下设置
Trcd[3:2] : RAS TO CAS delay ,设为推荐0b01
SCAN[1:0] : SDRAM的列地址位数 0b00:8位   0b01:9位   0b10:10位    JZ2440为9位

所以在JZ2440开发板中此寄存器可设置为 0x00018005

(4)刷新控制寄存器REFRESH
[23] : 0:禁止刷新功能   1:使能刷新功能
[22] : 设置刷新模式 0:CBR/Auto Refresh, 1:self Refresh
Trp[21:20] : 设置为0即可
Tsrc[19:18]: 设置默认0b11即可
[10:0]     : 刷新计数 R_CNT
R_CNT计算方法: R_CNT=2^11+1-SDRAM时钟频率(MHZ)*SDRAM刷新周期
所以此寄存器可设为 0x008C0000+R_CNT
在未使用PLL时,RNT=1995   所以寄存器为0x008C07A3

在使用PLL=50MHZ时,R_CNT=1659   所以寄存器可设为0X008C0E1E

(5)BANKSIZE寄存器
BURST_EN[7]    : 0=ARM核禁止突发输出  1=ARM核支持突发传输
SCKE_EN[5]     : 0=不使用SCKE信号SDRAM进入省电模式 1=使用进入省电模式
SCLK_EN[4]     : 0=时刻发出SCLK信号  1=仅在访问SDRAM期间发出SCLK访问信号(推荐)
BANK76MAP[2:0] : 为保持BANK6/7地址连续,而BANK6大小不确定,故而使用BANK7地址可变策略
                 0b010 = 128M/128M
                 0B001 = 64M/64M
                 0b000 = 32M/32M
                 0b111 = 16M/16M
                 0b110 = 8M/8M
                 0b100 = 2M/2M
JZ24440采用64M/64M的连接方式,尽管BANK7并没有使用

所以本寄存器可设置为 0xB1

(6)SDRAM模式设置寄存器MRSRB6/7
能修改的只有CL[6:4]位,这是SDRAM时序的一个参数
0b000 = 1 clocks
0b010 = 2 clocks
0b011 = 3 clocks
在JZ2440开发板上的SDRAM不支持CL=1,后两者都支持,设置时可采取保守值0b011

所以MRSRB6/7 可设置为0x30


下面是一个使用存储控制器的例子,例子中使用BANK6外接的SDRAM,初始化SDRAM,将steppingstone中的程序拷贝到SDRAM,并在SDRAM中运行

head.S文件

.equ    MEM_CTL_BASE,0x48000000.equ    SDRAM_BASE   ,  0x30000000.text.global _start_start:bl disable_watchdogbl memsetup                      /*设置存储控制器,使得外接在bank6的SDRAM可用*/bl copy_steppingstone_to_sdram   /*将steppingstone中的代码整个复制到SDRAM的前4k*/ldr r1,=on_sdram                 /*跳转到SDRAM中部分接着往下执行,这里是地址相关代码*/                                     on_sdram:ldr sp,=0x34000000               /*设置堆栈指针,为调用main的C函数做准备,堆栈指针为SDRAM末尾*/bl main                          /*跳转到C代码中执行*/halt_loop:b halt_loopdisable_watchdog:ldr r1,=0x53000000                /*看门狗寄存器地址*/mov r0,#0x00000000str r0,[r1]mov pc, lr                       /*手动返回到跳转之前的地址接着往下执行*/memsetup:mov  r1,#MEM_CTL_BASE            /*用于设置存储控制寄存器的13个寄存器的基地址*/adrl r2,mem_cfg_val              /*存放设置存储控制寄存器的值的起始地址,注意这里是地址无关代码*/add  r3,r1,#52                   /*总共13个寄存器需要设置,13*4=52 */1:ldr r4,[r2],#4                   /*不能在内存直接赋值,所以以寄存器为媒介来赋值*/str r4,[r1],#4cmp r1,r3bne 1b                           /*13个寄存器都赋值完成则不再循环*/mov pc, lrcopy_steppingstone_to_sdram:mov r1,#0            /*NAND启动时,0地址为steppingston的首地址,NAND的前4k自动复制到steppingstone中*/ldr r2,=SDRAM_BASE   /*SDRAM的基地址*/mov r3,#4*1024       /*总共复制大小为4k,即整个steppingstone的内容*/1:ldr r4,[r1],#4str r4,[r2],#4cmp r1,r3bne 1bmov pc,lr.align 4mem_cfg_val:.long 0x22011110.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00000700.long 0x00018005.long 0x00018005.long 0x008c07A3.long 0x000000b1.long 0x00000030.long 0x00000030

main.c文件

#define GPFCON (*(volatile unsigned long *)0x56000050)#define GPFDAT (*(volatile unsigned long *)0x56000054)#define GPGCON (*(volatile unsigned long *)0x56000060)#define GPGDAT (*(volatile unsigned long *)0x56000064)#define GPF4_5_6_OUT  ((0b01<<12)|(0b01<<10)|(0b01<<8))#define GPF0_2_IN     (~((0x3<<4)&(0x3)))#define GPG3_IN       (~(0X3<<6))#define GPF4_5_6_OFF   ((1<<4)|(1<<5)|(1<<6))int main(){GPFCON|=GPF4_5_6_OUT;GPFCON&=GPF0_2_IN;GPGCON&=GPG3_IN;GPFDAT|=GPF4_5_6_OFF;unsigned long gpfval;unsigned long gpgval;while(1){gpfval=GPFDAT;if(gpfval&1)GPFDAT|=(1<<4);elseGPFDAT&=(~(1<<4));if((gpfval>>2)&1)GPFDAT|=(1<<5);elseGPFDAT&=(~(1<<5));gpgval=GPGDAT;if((gpgval>>3)&1)GPFDAT|=(1<<6);elseGPFDAT&=(~(1<<6));}return 0;}
Makefile文件
sdram.bin:head.S main.carm-linux-gcc -g -c head.S -o head.oarm-linux-gcc -g -c main.c -o main.oarm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram_elfarm-linux-objcopy -O binary -S sdram_elf sdram.binarm-linux-objdump -D -m arm sdram_elf > sdram.disclean:rm -f sdram_elf sdram.dis sdram.bin *.o



原创粉丝点击