您的位置:首页 > 其它

S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

2014-06-25 12:19 232 查看
++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

/article/1433073.html

++++++++++++++++++++++++++++++++++++++++++

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)

[plain] view
plaincopy

MEM_SYS_CFG EQU 0x7e00f120

DMC1_BASE EQU 0x7e001000

INDEX_DMC_MEMC_STATUS EQU 0x0

INDEX_DMC_MEMC_CMD EQU 0x4

INDEX_DMC_DIRECT_CMD EQU 0x08

INDEX_DMC_MEMORY_CFG EQU 0x0c

INDEX_DMC_REFRESH_PRD EQU 0x10

INDEX_DMC_CAS_LATENCY EQU 0x14

INDEX_DMC_T_DQSS EQU 0x18

INDEX_DMC_T_MRD EQU 0x1c

INDEX_DMC_T_RAS EQU 0x20

INDEX_DMC_T_RC EQU 0x24

INDEX_DMC_T_RCD EQU 0x28

INDEX_DMC_T_RFC EQU 0x2c

INDEX_DMC_T_RP EQU 0x30

INDEX_DMC_T_RRD EQU 0x34

INDEX_DMC_T_WR EQU 0x38

INDEX_DMC_T_WTR EQU 0x3c

INDEX_DMC_T_XP EQU 0x40

INDEX_DMC_T_XSR EQU 0x44

INDEX_DMC_T_ESR EQU 0x48

INDEX_DMC_MEMORY_CFG2 EQU 0x4C

INDEX_DMC_CHIP_0_CFG EQU 0x200

INDEX_DMC_CHIP_1_CFG EQU 0x204

INDEX_DMC_CHIP_2_CFG EQU 0x208

INDEX_DMC_CHIP_3_CFG EQU 0x20C

INDEX_DMC_USER_STATUS EQU 0x300

INDEX_DMC_USER_CONFIG EQU 0x304

AREA LOW_INIT, CODE, READONLY

ENTRY

EXPORT mem_init

mem_init

ldr r0, =MEM_SYS_CFG ;Memory sussystem address 0x7e00f120

mov r1, #0xd ;Xm0CSn2 = NFCON CS0 设置NAND Flash为存储器

str r1, [r0]

ldr r0, =DMC1_BASE ;DMC1 base address 0x7e001000

; memc_cmd : 010 wake up

; 唤醒内存

ldr r1, =0x04

str r1, [r0, #INDEX_DMC_MEMC_CMD]

; Refresh period = ((Startup_HCLK / 1000 * DDR_tREFRESH) - 1) / 1000000 -> DDR_tREFRESH 7800 ns

; 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 = 7813 HCLK = 133 Refresh_Count = 1039

ldr r1, = 1039 ; DMC_DDR_REFRESH_PRD

str r1, [r0, #INDEX_DMC_REFRESH_PRD]

; CAS_Latency = DDR_CASL<<1 -> DDR_CASL 3

ldr r1, = 6 ; DMC_DDR_CAS_LATENCY

str r1, [r0, #INDEX_DMC_CAS_LATENCY]

; t_DQSS (clock cycles)

ldr r1, = 1 ; DMC_DDR_t_DQSS

str r1, [r0, #INDEX_DMC_T_DQSS]

; T_MRD (clock cycles)

ldr r1, = 2 ; DMC_DDR_t_MRD

str r1, [r0, #INDEX_DMC_T_MRD]

; T_RAS (clock cycles)

ldr r1, = 7 ; DMC_DDR_t_RAS

str r1, [r0, #INDEX_DMC_T_RAS]

; T_RC Active Bank x to Active Bank x delay(clock cycles)

ldr r1, = 10 ; DMC_DDR_t_RC

str r1, [r0, #INDEX_DMC_T_RC]

; T_RCD RAS to CAD delay(clock cycles)

ldr r1, = 4 ; DMC_DDR_t_RCD

ldr r2, = 8 ; DMC_DDR_schedule_RCD

orr r1, r1, r2

str r1, [r0, #INDEX_DMC_T_RCD]

; T_RFC AutoRefresh(clock cycles)

ldr r1, = 11 ; DMC_DDR_t_RFC

ldr r2, = 256 ; DMC_DDR_schedule_RFC

orr r1, r1, r2

str r1, [r0, #INDEX_DMC_T_RFC]

; T_RP Precharge to RAS delay(clock cycles)

ldr r1, = 4 ; DMC_DDR_t_RP

ldr r2, = 8 ; DMC_DDR_schedule_RP

orr r1, r1, r2

str r1, [r0, #INDEX_DMC_T_RP]

; T_RRD Active Bank x to Active Bank y delay(clock cycles)

ldr r1, = 3 ; DMC_DDR_t_RRD

str r1, [r0, #INDEX_DMC_T_RRD]

; T_WR Write to precharge delay(clock cycles)

ldr r1, =3 ; DMC_DDR_t_WR

str r1, [r0, #INDEX_DMC_T_WR]

; T_WTR Write to Read delay(clock cycles)

ldr r1, = 2 ;DMC_DDR_t_WTR

str r1, [r0, #INDEX_DMC_T_WTR]

; T_XP Exit Power down(clock cycles)

ldr r1, = 2 ; DMC_DDR_t_XP

str r1, [r0, #INDEX_DMC_T_XP]

; T_XSR Exit self refresh(clock cycles)

ldr r1, = 17 ; DMC_DDR_t_XSR

str r1, [r0, #INDEX_DMC_T_XSR]

; T_ESR SelfRefresh(clock cycles)

ldr r1, = 17 ; DMC_DDR_t_ESR

str r1, [r0, #INDEX_DMC_T_ESR]

; Memory Configuration Register

ldr r1, = 0x40010012 ; DMC1_MEM_CFG

str r1, [r0, #INDEX_DMC_MEMORY_CFG]

ldr r1, = 0xb41 ; DMC1_MEM_CFG2

str r1, [r0, #INDEX_DMC_MEMORY_CFG2]

ldr r1, = 0x150f8 ; DMC1_CHIP0_CFG

str r1, [r0, #INDEX_DMC_CHIP_0_CFG]

ldr r1, = 0 ; DMC_DDR_32_CFG

str r1, [r0, #INDEX_DMC_USER_CONFIG]

; The follows is according to the Datasheet initialization sequence

;DMC0 DDR Chip 0 configuration direct command reg

ldr r1, = 0x0c0000 ; DMC_NOP0

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

;Precharge All

ldr r1, = 0 ; DMC_PA0

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

;Auto Refresh 2 time

ldr r1, = 0x40000 ; DMC_AR0

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

;MRS

ldr r1, = 0xa0000 ; DMC_mDDR_EMR0

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

;Mode Reg

ldr r1, = 0x80032 ; DMC_mDDR_MR0

str r1, [r0, #INDEX_DMC_DIRECT_CMD]

;Enable DMC1

mov r1, #0x0

str r1, [r0, #INDEX_DMC_MEMC_CMD]

check_dmc1_ready

ldr r1, [r0, #INDEX_DMC_MEMC_STATUS]

mov r2, #0x3

and r1, r1, r2

cmp r1, #0x1

bne check_dmc1_ready

nop

mov pc, lr

END

++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

/article/1433073.html

++++++++++++++++++++++++++++++++++++++++++

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: