存储管理器

cpu配置储存管理器
cpu读操作发命令给储存管理器,储存管理器根据配置读取数据

Nand Flash启动方式,开机片内sram拷贝nand flash前4k执行,在这4k的程序里需要完成sram->sdram跳转


s3c2440有8个BANK,即8个片选信号,直连可以接8个内存类外设
SDRAM,Nor Flash,网卡等等


BANK6 BANK7 可以接 SDRAM


地址线
数据线 8/16/32
时钟/频率
芯片相关


SDRAM:位宽,列/行,刷新周期,BANK


1,上电,NandFlash前4k硬件自动拷贝到片内SRAM,然后从SRAM的0地址开始执行
2,程序:关看门狗,初始化储存管理器
3,SRAM中,把代码从NandFlash(从#00000000开始)拷到SDRAM(从#30000000开始),继续执行


.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


用SDRAM需配置13个寄存器,以下逐个来看:
1、 BWSCON:Bus width & wait status control register总线位宽和等待状态控制寄存器。
此寄存器用于配置BANK0 – BANK7的位宽和状态控制,每个BANK用4位来配置,分别是:
● ST(启动/禁止SDRAM的数据掩码引脚。对于SDRAM,此位置0;对于SRAM,此位置1)
● WS(是否使用存储器的WAIT信号,通常置0为不使用)
● DW(两位,设置位宽。此板子的SDRAM是32位,故将DW6设为10)
特殊的是bit[2:1],即DW0,设置BANK0的位宽,又板上的跳线决定,只读的。我这板子BWSCON可设置为0x22111110。其实只需将BANK6对应的4位设为0010即可。
2、 BANKCON0 – BANKCON7
用来分别配置8个BANK的时序等参数。SDRAM是映射到BANK6和BANK7上的(内存只能映射到这两个BANK,具体映射多大的空间,可用BANKSIZE寄存器设置),所以只需参照SDRAM芯片的datasheet配置好BANK6和BANK7,BANKCON0 – BANKCON5使用默认值0x00000700即可。
对于BANKCON6和BANKCON7中的各个位的描述:
(1)MT(bit[16:15]):设置本BANK映射的物理内存是SRAM还是SDRAM,后面的低位就根据此MT的选择而分开设置。本板子应置0b11,所以只需要再设置下面两个参数
(2)Trcd(bit[3:2]):RAS to CAS delay(00=2 clocks,01=3 clocks,10=4 clocks),推2410手册上的荐值是0b01。我们PC的BIOS里也可以调节的,应该玩过吧。
(3)SCAN(bit[1:0]):Column address number(00 = 8-bit,01 = 9-bit,10= 10-bit),SDRAM列地址位数。查阅HY57V561620CT-H芯片手册得知此值是9,所以SCAN=0b01。
综合以上各值,BANKCON6 – 7设为0x00018005。
3、 REFRESH:刷新控制寄存器。
此寄存器的bit[23:11]可参考默认值,或自己根据经验修改,这里用0x008c0000,关键是最后的Refresh Counter(简称R_CNT,bit[10:0])的设置,2410手册上给出了公式计算方法。SDRAM手册上“8192 refresh cycles / 64ms”的描述,得到刷新周期为64ms/8192=7.8125us,结合公式,R_CNT=2^11 + 1 – 12 * 7.8125 = 1955。所以可得REFRESH=0x008c0000+1995=0x008c07a3。
4、 BANKSIZE:设置SDRAM的一些参数。其中BK76MAP(bit[2:0])配置BANK6/7映射的大小,可设置为010 = 128MB/128MB或001 = 64MB/64MB,只要比实际RAM大都行,因为bootloader和linux内核都可以检测可用空间的。BANKSIZE=0x000000b2。
5、 MRSRB6、MRSRB7:Mode register set register bank6/7
可以修改的只有CL[6:4](CAS latency,000 = 1 clock, 010 = 2 clocks, 011=3 clocks),其他的全部是固定的(fixed),故值为0x00000030。这个CAS在BIOS中应该也设置过吧,对PC的速度提升很明显哦J
    至此,13个寄存器全部配置好了,下面就可以把代码复制到SDRAM中执行了,同样的程序速度要比片内SRAM运行的慢不少。

.text
.global _start
_start:
ldr r0,=0x56000010 @ WatchDog地址,r0不能mov赋值,但可以ldr赋值
mov r1,#0x00000000
str r1,[r0] @ 关闭WatchDog
bl meminit
bl memcopy
ldr pc,=ready @ ldr与adrl的区别,ldr:绝对地址(需要=号),adrl:相对地址(不需要=号)

ready:
ldr sp,=0x34000000
bl main

memcopy:
mov r1,#0x00000000 @ Nand Flash起始地址
mov r2,#0x30000000 @ SDRam起始地址
mov r3,#0x00001000 @ 4K的大小
1:
ldr r4,[r1],#4
str r4,[r2],#4 @ [r1] = [r2] , r1 += 4 , r2 += 4
cmp r1,r3
bne 1b
mov pc,lr


meminit:
mov r1,#0x48000000 @ 内存控制器地址
adrl r2,meminitdata
add r3,r1,#52 @ 4 * 13 = 52
1:
ldr r4,[r2],#4
str r4,[r1],#4 @ [r1] = [r2] , r1 += 4 , r2 += 4
cmp r1,r3
bne 1b
mov pc,lr @ 地址寄存器间可以直接mov操作



.align 4
meminitdata:
.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

猜你喜欢

转载自blog.csdn.net/wudics/article/details/26982281