1. 概述
S3C6410内存操控器是选用的PL340内存操控芯片。AMBA APB3.0接口协议规则,能够经过编程将AXI从总线接口和APB主总线接口进行桥接,完成二者总线上的数据的传输。
DRAM操控器能够经过装备兼容SDRAM类型芯片。经过向DRAM操控器中PL340写入内存芯片装备参数,内存时序,来操控内存作业。
DRAM操控器能够直接从SDRAM或DRAM接纳一个操控指令。经过将操作指令写入direct_cmd寄存器,操作SDRAM进行对应操作。经过向memc_cmd寄存器写入状况形式指令,使DRAM操控器进入对应的作业形式。例如:向direct_cmd寄存器写入:Prechargeall’,‘Autorefresh’,‘NOP’,and ‘MRS’ 等指令,能够让SDRAM芯片别离碑文不同操作,向memc_cmd寄存器写入一些状况指令能够让SDRAM芯片进入’Config’, ‘Ready’, and ‘Low_power’等作业形式。
DRAM操控器支撑两种节能形式。当SDRAM处于不活动状况而且继续必定的时钟周期时,DRAM操控器会主动将SDRAM进入预充电节能形式或正常节能形式下以下降体系功耗。当驱动操作DRAM操控器进入对应的STOP(中止),Deep Stop(深度睡觉),Sleep Mode(睡觉)等形式时,SDRAM芯片进入自改写的节能形式。
l 支撑SDR SDRAM,Mobile SDR SDRAM,DDR SDRAM和Mobile DDR SDRAM类型芯片
l 支撑两个内存芯片
l 支撑64位的AMBA AXI总线类型
l 支撑16位、64位内存总线
n 存储器接口1:支撑16位DDR SDRAM和Mobile DDR SDRAM类型芯片
支撑32位DDR SDRAM,Mobile DDR SDRAM,Mobile SDR SDRAM和SDR SDRAM类型芯片
不支撑16位Mobile SDR SDRAM和SDR SDRAM类型芯片
l 地址空间:存储器接口1支撑最多2Gb地址空间
l 支撑正常节能形式和预充电的节能形式
l 数据传输低推迟特性
l 外部存储器总线优化
l 经过设置SFR寄存器支撑挑选外部存储器选型
l 经过SFR寄存器装备存储器的时序
l 支撑扩展MRS指令集
l 作业电压:存储器接口1: 1.8V,2.5V
2. SDRAM类型内存接口
DRAM操控器支撑最多两个相同类型的内存芯片,每个芯片最大容量256M。一切芯片同享相同引脚(时钟使能引脚和片选引脚具有),如表1-1所示给出了DRAM操控器的外部存储器引脚装备信息。
3. SDRAM初始化
在体系上电后,有必要经过软件装备SDRAM接入DRAM操控器而且初始化DRAM操控器,下面给出DDR、MOBILE DDR SDRAM的初始化流程。
a) 向mem_cmd寄存器写入0b10,使其进入NOP作业状况
b) 向mem_cmd寄存器写入0b00,使其进入Prechargeall(整片预充电)作业状况
c) 向mem_cmd寄存器写入0b11,使其进入Autorefresh(自改写)作业状况
d) 再次向mem_cmd寄存器写入0b11,使其进入Autorefresh(自改写)作业状况
e) 向mem_cmd寄存器写入0b10,使其进入MRS作业状况,而且地址空间内的EMRS有必要置位
f) 再次向mem_cmd寄存器写入0b10,使其进入MRS作业状况,而且地址空间内的MRS有必要置位
4. DRAM寄存器
1) DRAM操控器状况寄存器(P1MEMSTAT)
P1MEMSTAT |
位 |
描绘 |
初始值 |
保存 |
[31:9] |
– |
– |
芯片数量 |
[8:7] |
内存操控器支撑的芯片最大数量: 01 = 2片 6410只支撑2片芯片,初始化为只读的01 |
01 |
芯片类型 |
[6:4] |
内存操控器支撑的芯片类型: 100 = MSDR/SDR/MDDR/DDR中任一类型 |
100 |
芯片位宽 |
[3:2] |
接入内存芯片的位宽: 00 = 16位 01 = 32位 10 = 保存 11 = 保存 |
01 |
操控器状况 |
[1:0] |
DRAM操控器状况: 00 = Config装备状况 01 = Ready安排妥当状况 10 = Pause暂停状况 11 = Low-Power节能状况 |
00 |
实际上,读到的有用信息便是Controller Status和Memory width。
2) DRAM操控器指令寄存器(P1MEMCCMD)
P1MEMCCMD |
位 |
描绘 |
初始值 |
保存 |
[31:3] |
未定义,写入0 |
– |
Memc_cmd |
[2:0] |
设置内存操控器的作业状况: 000 = Go 001 = sleep 010 = wakeup 011 = Pause 100 = Configure 101~111 = 保存 |
最开端应该装备为0x4,是处于Configure状况。在装备完一切的DRAM之后,将该寄存器设置为0x0,处于运转状况。
3) 直接指令寄存器(P1DIRECTCMD)
P1DIRECTCMD |
位 |
描绘 |
初始值 |
保存 |
[31:23] |
未定义,写入0 |
|
扩展内存指令 |
[22] |
(见下表) |
|
芯片号 |
[21:20] |
映射到外部存储芯片地址的位 |
|
指令 |
[19:18] |
详细指令(见下表) |
|
Bank地址 |
[17:16] |
当以MRS或EMRS指令拜访时,映射到外部存储器的Bank地址位 |
|
[15:14] |
未定义,写入0 |
||
地址线0~13 |
[13:0] |
当以MRS或EMRS指令拜访时,映射到外部存储器的内存地址位 |
用于发送指令到DRAM和拜访DRAM中的MRS和EMRS寄存器。经过该寄存器初始化DRAM,先设置为NOP形式,然后设置为PrechargeAll进行充电,然后设置EMRS和MRS寄存器,一般是这么一个流程。详细的要拜见你所运用的DRAM的datasheet。
4) 内存装备寄存器(P1MEMCFG)
P1MEMCFG |
位 |
描绘 |
初始值 |
保存 |
[31:23] |
未定义 |
|
发动芯片 |
[22] |
使能下面数量的芯片开端碑文改写操作: 00 = 1芯片 01 = 2芯片 10/11 = 保存 |
00 |
QoS master位 |
[20:18] |
设置QoS值: 000 = ARID[3:0] 001= ARID[4:1] 010 = ARID[5:2] 011 = ARID[6:3] 100 = ARID[7:4] 101~111 = 保存 |
000 |
内存突发拜访 |
[17:15] |
在内存读写时,设置突发拜访数据的数量: 000 = 突发拜访1个数据 001 = 突发拜访2个数据 010 = 突发拜访4个数据 011 = 突发拜访8个数据 100 = 突发拜访16个数据 101~111 = 保存 该值有必要经过DIRECTORYCMD寄存器,写入到内存的形式寄存器中,而且数据有必要匹配 |
010 |
Bank地址 |
[17:16] |
当以MRS或EMRS指令拜访时,映射到外部存储器的Bank地址位 |
|
Stop_mem_clock |
[14] |
当中止芯片时钟,不允许拜访内存数据时,置位 |
0 |
主动节能 |
[13] |
当该方位位时,芯片主动进入节能状况 |
0 |
封闭芯片推迟时刻 |
[12:7] |
当封闭内存芯片时,推迟的时钟个数 |
000000 |
主动预充电位 |
[6] |
内存地址中主动预充电位的方位: 0 = ADDR[10] 1 = ADDR[8] |
0 |
行地址位数 |
[5:3] |
AXI地址线上的行地址位数: 000 = 11位 001 = 12位 010 = 13位 011 = 14位 100 = 15位 101= 16位 |
100 |
列地址位数 |
[2:0] |
AXI地址线上的列地址位数: 000 = 8位 001 = 9位 010 = 10位 011 = 11位 100 = 12位 |
000 |
参阅DRAM的datasheet。
5) 内存改写时刻寄存器(P1REFRESH)
P1REFRESH |
位 |
描绘 |
初始值 |
[31:15] |
– |
||
改写时刻 |
[14:0] |
内存改写时钟周期数 |
0xA60 |
6) CAS 推迟寄存器(P1CASLAT)
P1CASLAT |
位 |
描绘 |
初始值 |
[31:4] |
– |
– |
|
CAS推迟 |
[3:1] |
列地址选通推迟内存时钟周期数 |
0xA60 |
CAS HALF周期 |
[0] |
设置CAS推迟数是否为半个内存时钟周期 0 = 以[3:1]设置数为CAS推迟时钟周期 1 = 以[3:1]设置数的一半为CAS推迟时钟周期 |
0 |
参阅DRAM的datasheet。
下面13个寄存器用于DRAM操作中所需时刻和延时寄存器,详细能够参阅PL340文档。
7) T_DQSS寄存器(P1T_DQSS)
P1T_DQSS |
位 |
描绘 |
初始值 |
[31:2] |
– |
– |
|
t_DQSS |
[1:0] |
写入DQS的时钟周期 |
1 |
8) T_MRD寄存器(P1T_MRD)
P1T_MRD |
位 |
描绘 |
初始值 |
[31:7] |
– |
– |
|
t_ MRD |
[6:0] |
设置形式寄存器指令时刻(内存时钟周期为单位) |
0x02 |
9) T_RAS寄存器(P1T_RAS)
P1T_RAS |
位 |
描绘 |
初始值 |
[31:4] |
– |
– |
|
t_RAS |
[3:0] |
设置行地址选通到预充电操作推迟时刻(内存时钟周期为单位) |
0x7 |
10) T_RC寄存器(P1T_RC)
P1T_RC |
位 |
描绘 |
初始值 |
[31:4] |
– |
– |
|
t_RC |
[3:0] |
设置激活内存Bank x到激活别的一个Bank x操作的推迟时刻(内存时钟周期为单位) |
0xB |
11) T_RCD寄存器(P1T_RCD)
P1T_RCD |
位 |
描绘 |
初始值 |
[31:6] |
– |
– |
|
Scheduled_RCD |
[5:3] |
设置t_RCD-3 |
011 |
t_RCD |
[2:0] |
设置RAS到CAS操作的最小推迟时刻(内存时钟周期为单位) |
101 |
12) T_RFC寄存器(P1T_RFC)
P1T_RFC |
位 |
描绘 |
初始值 |
[31:10] |
– |
– |
|
Scheduled_RFC |
[9:5] |
设置t_RFC-3 |
0x10 |
t_RFC |
[4:0] |
设置主动改写指令操作推迟时刻(内存时钟周期为单位) |
0x12 |
13) T_RP寄存器(P1T_RP)
P1T_RP |
位 |
描绘 |
初始值 |
[31:6] |
– |
– |
|
Scheduled_RP |
[5:3] |
设置t_RP-3 |
011 |
t_RFC |
[2:0] |
设置预充电到RAS操作的推迟时刻(内存时钟周期为单位) |
101 |
14) T_RRD寄存器(P1T_RRD)
P1T_ RRD |
位 |
描绘 |
初始值 |
[31:4] |
– |
– |
|
t_RRD |
[3:0] |
设置激活内存Bank x到激活内存Bank y操作的推迟时刻(内存时钟周期为单位) |
0x2 |
15) T_WR寄存器(P1T_WR)
P1T_ WR |
位 |
描绘 |
初始值 |
[31:3] |
– |
– |
|
t_WR |
[2:0] |
设置写入数据到预充电操作的推迟时刻(内存时钟周期为单位) |
011 |
16) T_WTR寄存器(P1T_WTR)
P1T_ WTR |
位 |
描绘 |
初始值 |
[31:3] |
– |
– |
|
t_WTR |
[2:0] |
设置写入数据到读取数据操作的推迟时刻(内存时钟周期为单位) |
011 |
17) T_XP寄存器(P1T_XP)
P1T_ XP |
位 |
描绘 |
初始值 |
[31:8] |
– |
– |
|
t_XP |
[7:0] |
设置退出封闭电源指令的推迟时刻(内存时钟周期为单位) |
0x1 |
18) T_XSR寄存器(P1T_XSR)
P1T_ XSR |
位 |
描绘 |
初始值 |
[31:8] |
– |
– |
|
t_XSR |
[7:0] |
设置退出自改写指令的推迟时刻(内存时钟周期为单位) |
0xA |
19) T_ESR寄存器(P1T_ESR)
P1T_ ESR |
位 |
描绘 |
初始值 |
[31:8] |
– |
– |
|
t_ESR |
[7:0] |
设置自改写指令的推迟时刻(内存时钟周期为单位) |
0x14 |
内存初始化代码:
(开发环境为ADS1.2)
- MEM_SYS_CFGEQU0x7e00f120
- DMC1_BASEEQU0x7e001000
- INDEX_DMC_MEMC_STATUSEQU0x0
- INDEX_DMC_MEMC_CMDEQU0x4
- INDEX_DMC_DIRECT_CMDEQU0x08
- INDEX_DMC_MEMORY_CFGEQU0x0c
- INDEX_DMC_REFRESH_PRDEQU0x10
- INDEX_DMC_CAS_LATENCYEQU0x14
- INDEX_DMC_T_DQSSEQU0x18
- INDEX_DMC_T_MRDEQU0x1c
- INDEX_DMC_T_RASEQU0x20
- INDEX_DMC_T_RCEQU0x24
- INDEX_DMC_T_RCDEQU0x28
- INDEX_DMC_T_RFCEQU0x2c
- INDEX_DMC_T_RPEQU0x30
- INDEX_DMC_T_RRDEQU0x34
- INDEX_DMC_T_WREQU0x38
- INDEX_DMC_T_WTREQU0x3c
- INDEX_DMC_T_XPEQU0x40
- INDEX_DMC_T_XSREQU0x44
- INDEX_DMC_T_ESREQU0x48
- INDEX_DMC_MEMORY_CFG2EQU0x4C
- INDEX_DMC_CHIP_0_CFGEQU0x200
- INDEX_DMC_CHIP_1_CFGEQU0x204
- INDEX_DMC_CHIP_2_CFGEQU0x208
- INDEX_DMC_CHIP_3_CFGEQU0x20C
- INDEX_DMC_USER_STATUSEQU0x300
- INDEX_DMC_USER_CONFIGEQU0x304
- AREALOW_INIT,CODE,READONLY
- ENTRY
- EXPORTmem_init
- mem_init
- ldrr0,=MEM_SYS_CFG;Memorysussystemaddress0x7e00f120
- movr1,#0xd;Xm0CSn2=NFCONCS0设置NANDFlash为存储器
- strr1,[r0]
- ldrr0,=DMC1_BASE;DMC1baseaddress0x7e001000
- ;memc_cmd:010wakeup
- ;唤醒内存
- ldrr1,=0x04
- strr1,[r0,#INDEX_DMC_MEMC_CMD]
- ;Refreshperiod=((Startup_HCLK/1000*DDR_tREFRESH)-1)/1000000->DDR_tREFRESH7800ns
- ;HCLK=133MHz
- ;DDR内存标准规则,%&&&&&%的电荷存储上限时刻为64ms,而改写操作每次是针对
- ;一行进行的,即每一行的改写时刻为64ms,而内存芯片中必定数量的行
- ;以L-Bank一共(见内存作业原理与物理特性),每个L-Bank有8192行(见内存硬件手册)
- ;因而对L-Bank的改写操作应该在64ms/8192=7813us时刻内进行一次
- ;而MDDR作业在133MHz时,其一个时钟周期为1/133M,那么一次L-Bank改写
- ;时刻需求7.8us/1/133M个时钟周期,即有下面的公式:
- ;Refresh_Count=tREFRESH*HCLK(MHz)/1000
- ;tREFRESH=7813HCLK=133Refresh_Count=1039
- ldrr1,=1039;DMC_DDR_REFRESH_PRD
- strr1,[r0,#INDEX_DMC_REFRESH_PRD]
- ;CAS_Latency=DDR_CASL<<1->DDR_CASL3
- ldrr1,=6;DMC_DDR_CAS_LATENCY
- strr1,[r0,#INDEX_DMC_CAS_LATENCY]
- ;t_DQSS(clockcycles)
- ldrr1,=1;DMC_DDR_t_DQSS
- strr1,[r0,#INDEX_DMC_T_DQSS]
- ;T_MRD(clockcycles)
- ldrr1,=2;DMC_DDR_t_MRD
- strr1,[r0,#INDEX_DMC_T_MRD]
- ;T_RAS(clockcycles)
- ldrr1,=7;DMC_DDR_t_RAS
- strr1,[r0,#INDEX_DMC_T_RAS]
- ;T_RCActiveBankxtoActiveBankxdelay(clockcycles)
- ldrr1,=10;DMC_DDR_t_RC
- strr1,[r0,#INDEX_DMC_T_RC]
- ;T_RCDRAStoCADdelay(clockcycles)
- ldrr1,=4;DMC_DDR_t_RCD
- ldrr2,=8;DMC_DDR_schedule_RCD
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RCD]
- ;T_RFCAutoRefresh(clockcycles)
- ldrr1,=11;DMC_DDR_t_RFC
- ldrr2,=256;DMC_DDR_schedule_RFC
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RFC]
- ;T_RPPrechargetoRASdelay(clockcycles)
- ldrr1,=4;DMC_DDR_t_RP
- ldrr2,=8;DMC_DDR_schedule_RP
- orrr1,r1,r2
- strr1,[r0,#INDEX_DMC_T_RP]
- ;T_RRDActiveBankxtoActiveBankydelay(clockcycles)
- ldrr1,=3;DMC_DDR_t_RRD
- strr1,[r0,#INDEX_DMC_T_RRD]
- ;T_WRWritetoprechargedelay(clockcycles)
- ldrr1,=3;DMC_DDR_t_WR
- strr1,[r0,#INDEX_DMC_T_WR]
- ;T_WTRWritetoReaddelay(clockcycles)
- ldrr1,=2;DMC_DDR_t_WTR
- strr1,[r0,#INDEX_DMC_T_WTR]
- ;T_XPExitPowerdown(clockcycles)
- ldrr1,=2;DMC_DDR_t_XP
- strr1,[r0,#INDEX_DMC_T_XP]
- ;T_XSRExitselfrefresh(clockcycles)
- ldrr1,=17;DMC_DDR_t_XSR
- strr1,[r0,#INDEX_DMC_T_XSR]
- ;T_ESRSelfRefresh(clockcycles)
- ldrr1,=17;DMC_DDR_t_ESR
- strr1,[r0,#INDEX_DMC_T_ESR]
- ;MemoryConfigurationRegister
- ldrr1,=0x40010012;DMC1_MEM_CFG
- strr1,[r0,#INDEX_DMC_MEMORY_CFG]
- ldrr1,=0xb41;DMC1_MEM_CFG2
- strr1,[r0,#INDEX_DMC_MEMORY_CFG2]
- ldrr1,=0x150f8;DMC1_CHIP0_CFG
- strr1,[r0,#INDEX_DMC_CHIP_0_CFG]
- ldrr1,=0;DMC_DDR_32_CFG
- strr1,[r0,#INDEX_DMC_USER_CONFIG]
- ;ThefollowsisaccordingtotheDatasheetinitializationsequence
- ;DMC0DDRChip0configurationdirectcommandreg
- ldrr1,=0x0c0000;DMC_NOP0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;PrechargeAll
- ldrr1,=0;DMC_PA0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;AutoRefresh2time
- ldrr1,=0x40000;DMC_AR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;MRS
- ldrr1,=0xa0000;DMC_mDDR_EMR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;ModeReg
- ldrr1,=0x80032;DMC_mDDR_MR0
- strr1,[r0,#INDEX_DMC_DIRECT_CMD]
- ;EnableDMC1
- movr1,#0x0
- strr1,[r0,#INDEX_DMC_MEMC_CMD]
- check_dmc1_ready
- ldrr1,[r0,#INDEX_DMC_MEMC_STATUS]
- movr2,#0x3
- andr1,r1,r2
- cmpr1,#0x1
- bnecheck_dmc1_ready
- nop
- movpc,lr
- END