SDRAM初始化过程如下:
1、加电
2、延迟指定时间,从第一个sdram的clk开始,通常为100us。具体值请参考SDRAM手册
3、延迟一些自动刷新周期,通常为两个
4、设置自动刷新寄存器
5、等待一定时间以后开始写模式寄存器
以下程序以L7205SDB为例
AREA STARTUP ,CODE, READONLY
ENTRY
start
;关中断
LDR R4,=0X90001000
MVN R5,#0
STR R5,[R4,#0X0C]
STR R5,[R4,#0X10C]
;延时
LDR R4,=0XFF
01 SUBS R4,R4,#0X01
BNE %B01 ;%B01表示向后搜索标号01
;1)NEXT寄存器
LDR R4,=0X80050004
LDR R5,=0X05FD4717
STR R5,[R4]
;2)运行寄存器
LDR R4,=0X8005000C
LDR R5,=0X014717
STR R5,[R4]
;3)命令寄存器
LDR R4,=0X80050010
LDR R5,=0X01
STR R5,[R4]
;4)设置enable
LDR R4, =0X80050030
LDR R5,[R4]
0RR R5,R5,#0X4
STR R5,[R4]
;5)延时200us
MOV R4,#0X1000
15 SUBS R4, R4,#1
BNE %B15
;6)使能slot1、slot2的7、3位
LDR R4,=0XD0000000
LDR R5,[R4]
ADD R5,R5,#0X88
STR R5,[R4]
;7)refresh timer
LDR R4,=0XD0000004
LDR R5,=0X8
STR R5,[R4]
;8)auto refresh enable 23位
LDR R4,=0XD0000000
LDR R5,[R4]
ADD R5,R5,#(1<<23)
STR R5,[R4]
;9)延时1us
MOV R4,#0X16
15 SUBS R4,R4,#1
BNE %B15
;10)设置模式寄存器
LDR R4,=0XE0000000+(3<<11)+(2<<15)
LDR R5,[R4]
ADD R5,R5,#(1<<24)
STR R5,[R4]
;11)WD,WM位
LDR R4,=0XD0000000
LDR R5,=0X00EF00CE
ORR R5,R5,#0X30000
STR R5,[R4]
;12)refresh timer
LDR R4,=0XD0000000
LDR R5,=0X200
STR R5,[R4,#4]
;13)timer buffer register
LDR R4,=0XD0000000
LDR R5,=0X55
STR R5,[R4,#0X8]
;14)禁止MMU
MOV R4,#0X0
MCR P15,0,R4,C1,C0,0
;15)halt
MOV R4,#0X0 ;这个无意义
;16)设置MMU
SETUPMMU R4,R5,R2,R3,R9,R7 ;通过SETUPMMU宏来设置MMU
;17)halt
MOV R4,#0X0
;18)重映射
UNMAPROM R4,R5 ;通过宏UMMAPROM来把R5映射到地址R4即0X0处
haltthere
;19)halt
MOV R4,#0X0
Config32 EQU 0X0
MMUOn EQU 0X01
CacheOn EQU 0X04
WriteBufferOn EQU 0X08
PageTableSize EQU (1<<14)
SDRAM_Bank1_High EQU (0XF1000000)
SDRAM_Bank2_High EQU (0XF2000000)
SDRAM_Bank1_Low EQU (0XF0000000)
SDRAM_Bank2_Low EQU (0XF1000000)
PageTableBase2 EQU SDRAM_Bank2_High-PageTableSize
PageTableBase1 EQU SDRAM_Bank1_High-PageTableSize
PageTableEntryCount EQU (0X1000)
VirtualPageTableBase EQU PageTableBase2
IOCS0Base EQU (0X24000000)
IOCS0Size EQU (0X4000000)
IOCS1Base EQU (0X10000000)
IOCS0Size EQU (0X4000000)
SRAMBase EQU (0X60000000)
DisableMMU EQU (Config32:OR:0X40)
EnableMMU32 EQU (Config32:OR:0X40:OR:MMUOn)
EnableMMUCW32 EQU (Config32:OR:0X40:OR:MMUOn:OR:CacheOn:OR:WriteBufferOn)
;宏SETUPMMU生成一级页表,建立以1MB为单位的4G虚拟存储空间的地址映射关系。
MACRO
$label SETUPMMU $base,$desc,$tmp,$tmp2,$cnt,$indx
ROUT
;用于调试时增加可读性
[ O=0 ;IF
NOP
NOP
] ;ENDIF
;禁止MMU
MOV $tmp,#DisableMMU
WriteCP15_Control $tmp
;自动识别系统中SDRAM大小,并把结果保存到系统中特定位置
AutoSizeSDRAM $tmp,$tmp2,$base,$desc,$cnt,$indx
MOVS $tmp2,$tmp,LSR #16
EOR $cnt ,$tmp,$tmp2,LSL #16
LDRNE $base ,=PageTableBase2
LDREQ $base,=PageTableBase1
STR $tmp2, [$base,#-4]
STR $cnt ,[$base,#-8]
;保存一级页表的物理地址
STR $base ,[$base,#-12]
;计算扩展槽1中SDRAM的起始地址,以便使SDRAM1和SDRAM2地址连续
;address=Bank 1 base address +Total possible size of bank1-actual size of bank 1
;address =0xF0000000+16MB-Size
LDR $indx ,=SDRAM_Bank1_High
SUB $indx,$indx,$cnt,LSL #20
;保存该起始地址
STR $indx, [$base,#-16]
;建立4G的虚拟地址空间到物理空间的映射关系
;各块的存储访问属性设置成uncached、unbuffered
;各块的域标识设置成domain 0 客户类型
;各块的存储访问权限设置成允许所有权限
LDR $desc,=MMU_STD_ACCESS
MOV $indx ,$base
LDR $cnt ,=PageTableEntryCount
01 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B01
;建立包含页表的页存储的地址映射关系
;该页默认的虚拟空间在扩展槽2的高端16KB的区域
;如果系统扩展槽2中有SDRAM存在,则该存储页的地址映射关系不变
;如果系统扩展槽2中没有SDRAM存在,则将该存储页映射到扩展槽1的高端
LDR $desc,=MMU_STD_ACCESS
LDR $indx,=VirtualPagetableBase
LDR $tmp,=0xfff00000
AND $indx,$tmp,$index ;读取虚拟地址的高12位
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
ADD $indx,$base,$base,lsr #(20)
STR $desc,[$indx]
;建立CS0选择的静态存储器的虚拟地址空间到物理地址空间的映射关系
;CS0选择的SDRAM的物理地址空间为0X24000000
;现在将虚拟空间0X0映射到0X24000000
;各块得存储访问属性设置成cacheable、bufferable
;各块的与标识设置为domain 0客户属性
;各块的存储访问权限设置成允许所有权限
LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)
LDR $indx, =IOCS0Base
LDR $tmp, =0xFFF00000
AND $indx,$tmp,$indx
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
ADD $indx ,$base,$indx,LSR #20
LDR $cnt ,=(IOCS0Size>>20)
03 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B03
;建立CS1选择的静态存储器的虚拟地址空间到物理地址空间的映射关系
;CS1选择的SDRAM的物理地址空间为0X1000 0000
;现在将虚拟空间0X0映射到0X1000 0000
;各块得存储访问属性设置成cacheable、bufferable
;各块的与标识设置为domain 0客户属性
;各块的存储访问权限设置成允许所有权限
LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)
LDR $indx, =IOCS1Base
LDR $tmp, =0xFFF00000
AND $indx,$tmp,$indx
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
ADD $indx ,$base,$indx,LSR #20
LDR $cnt ,=(IOCS1Size>>20)
04 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B04
;建立片内SRAM的虚拟地址空间到物理地址空间的映射关系
;SRAM的物理地址空间为0X60000000
;现在将虚拟空间0X0映射到0X60000000
;各块得存储访问属性设置成cacheable、bufferable
;各块的与标识设置为domain 0客户属性
;各块的存储访问权限设置成允许所有权限
LDR $desc, =(MMU_STD_ACCESS+MMU_C_BIT+MMU_B_BIT)
LDR $indx, =SRAMBase
LDR $tmp, =0xFFF00000
AND $indx,$tmp,$indx
ORR $desc,$desc,$indx ;得到(高12+存储访问属性)
ADD $indx ,$base,$indx,LSR #20
LDR $cnt ,=(SRAMSize>>20)
05 STR $desc ,[$indx],#4
ADD $desc,$desc,#(1<<20)
SUBS $cnt ,$cnt ,#1
BNE %B05
;清空cache以及写缓冲区
;重新使能MMU
;设置域访问控制寄存器为domain 0
;其他域没有任何访问权限
LDR $tmp, =0x5555 5555
WriteCP15_DAControl $tmp
WriteCP15_TTBase $base
MOV $tmp ,#0
;清空cache
CP15_FlushIDC $tmp
;清空TLB
CP15_FlushTLB $tmp
;重新使能cache和写缓冲区
MOV $tmp , #EnableMMUCW32
WriteCP15_Control $tmp
;等待流水线上指令执行完
NOP
NOP
NOP
NOP
NOP
MEND