1:存储管理器与CPU以及其他外设的关系
CPU只负责发命令,由存储管理器来管理这些类内存的设备,那么存储管理器是怎么来管理这些类内存的设备的呢。
首先jz2440地址空间分为8个bank,(bank0~bank7),每个bank对应(NGCS0~NGCS7),相应的位为低电平表示该bank选通,这样虽然地址线总共有27根,
但是总的地址空间可以达到1G。
S3C2440的bank相对应图如下:
我们看到的地址空间是0x0-- 0x40000000,果然是1G,那么S3C2440的CPU是32位的,理论上可以访问的地址空间可以达到4G,还有一部分是CPU内部寄存器的地址
其余的一部分地址没有用,其中cpu的内部寄存器的地址都在:0x48000000-0x5fffffff之间。
那么如果想访问一个类内存的设备到底该怎么访问呢。那CPU该发什么地址呢。首先先根据NGCSn确定基地址,然后再加上访问的地址线就可以确定类内存设备的地址范围了。
比如:扩展串口为例子:
1:它选用NGCS5,基地址为0x28000000,
2:CPU的addr0~addr2连接到串口A0~A2, 所以访问空间是8字节,所以扩展串口A的访问地址为:0x28000000 ~ 0x28000007 扩展串口B的访问地址为:0x29000000 ~ 0x29000007
2: jZ2440SDRAM 为例:
1: 它选用NGCS6,基地址为0x30000000
2: CPU连接的地址线有15条,ADDR2~ADDR14,以及 ADDR24,ADDR25是bank选择信号,ADDR2~ADDR10为列地址信号,总共9列,所以相加总共22位地址线,所以每个bank总共是4M的空间,SDRAM每个空间单位是16位,每个SDRAM总共有4个bank,所以jz2440的SDRAM总共为4M*16*4*2 = 64M
SDRAM 逻辑构成图
LADDR2-LADDR14对应于行地址和列地址,根据控制位来决定是行地址还是列地址,其中行地址13位,对应LADDR2-LADDR14,列地址9位,对应LADDR2-LADDR10,所以地址一共26位,即64M空间。
那么为什么要空出LADDR0-LADDR1呢?因为SDRAM是32的,即一个地址对应着4个字节,而cpu每发出一个地址对应1个字节,所以cpu发出4个地址才能对应SDRAM的一个地址。
我们jz2440上其它一些外部存储设备的地址空间我们就不一一分析了。
相关代码如下:
.equ SDRAM_BASE, 0x30000000
.equ MEM_START_ADDR 0x0x48000000
.text
.global _start
_start:
bl watch_dog_close //关闭看门狗
bl memsetup //设置初始化SDRAM
bl copy_steppingstone_to_sdram
ldr pc, = on_sdram
on_sdram:
ldr sp, = 0x34000000
bl main
halt
b halt_loop
watch_dog_close:
mov r0, #0x0
mov r1, #0x53000000
str r0, [r1]
mov pc, lr 返回
memsetup:
mov r0 #MEM_START_ADDR //存储控制器的13个寄存器的开始地址
adr1 r1, mem_cfg_val //这13个值的起始存储地址
add r2, r0, #52 //13*4 = 54
l:
ldr r3, [r1], #4
str r3, [r0], #4
cmp r0, r2
bne 1b
mov pc lr
copy_steppingstone_to_sdram:
@ 将Steppingstone的4K数据全部复制到SDRAM中去
@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000
mov r0, #0
mov r1, #0x30000000
mov r2, #1024*4
l:
ldr r3, r0, #4
str r3, [r1], #4
cmp r2, r0
bne 1b
mov pc lr
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