您的位置 首页 发布

S3C6410,Tiny6410,Mini6410,MoblieDDR内存驱动

1.概述S3C6410内存控制器是采用的PL340内存控制芯片。AMBAAPB3.0接口协议规定,可以通过编程将AXI从总线接口和APB主总线接口进行桥接,…

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)

  1. MEM_SYS_CFGEQU0x7e00f120
  2. DMC1_BASEEQU0x7e001000
  3. INDEX_DMC_MEMC_STATUSEQU0x0
  4. INDEX_DMC_MEMC_CMDEQU0x4
  5. INDEX_DMC_DIRECT_CMDEQU0x08
  6. INDEX_DMC_MEMORY_CFGEQU0x0c
  7. INDEX_DMC_REFRESH_PRDEQU0x10
  8. INDEX_DMC_CAS_LATENCYEQU0x14
  9. INDEX_DMC_T_DQSSEQU0x18
  10. INDEX_DMC_T_MRDEQU0x1c
  11. INDEX_DMC_T_RASEQU0x20
  12. INDEX_DMC_T_RCEQU0x24
  13. INDEX_DMC_T_RCDEQU0x28
  14. INDEX_DMC_T_RFCEQU0x2c
  15. INDEX_DMC_T_RPEQU0x30
  16. INDEX_DMC_T_RRDEQU0x34
  17. INDEX_DMC_T_WREQU0x38
  18. INDEX_DMC_T_WTREQU0x3c
  19. INDEX_DMC_T_XPEQU0x40
  20. INDEX_DMC_T_XSREQU0x44
  21. INDEX_DMC_T_ESREQU0x48
  22. INDEX_DMC_MEMORY_CFG2EQU0x4C
  23. INDEX_DMC_CHIP_0_CFGEQU0x200
  24. INDEX_DMC_CHIP_1_CFGEQU0x204
  25. INDEX_DMC_CHIP_2_CFGEQU0x208
  26. INDEX_DMC_CHIP_3_CFGEQU0x20C
  27. INDEX_DMC_USER_STATUSEQU0x300
  28. INDEX_DMC_USER_CONFIGEQU0x304
  29. AREALOW_INIT,CODE,READONLY
  30. ENTRY
  31. EXPORTmem_init
  32. mem_init
  33. ldrr0,=MEM_SYS_CFG;Memorysussystemaddress0x7e00f120
  34. movr1,#0xd;Xm0CSn2=NFCONCS0设置NANDFlash为存储器
  35. strr1,[r0]
  36. ldrr0,=DMC1_BASE;DMC1baseaddress0x7e001000
  37. ;memc_cmd:010wakeup
  38. ;唤醒内存
  39. ldrr1,=0x04
  40. strr1,[r0,#INDEX_DMC_MEMC_CMD]
  41. ;Refreshperiod=((Startup_HCLK/1000*DDR_tREFRESH)-1)/1000000->DDR_tREFRESH7800ns
  42. ;HCLK=133MHz
  43. ;DDR内存标准规则,%&&&&&%的电荷存储上限时刻为64ms,而改写操作每次是针对
  44. ;一行进行的,即每一行的改写时刻为64ms,而内存芯片中必定数量的行
  45. ;以L-Bank一共(见内存作业原理与物理特性),每个L-Bank有8192行(见内存硬件手册)
  46. ;因而对L-Bank的改写操作应该在64ms/8192=7813us时刻内进行一次
  47. ;而MDDR作业在133MHz时,其一个时钟周期为1/133M,那么一次L-Bank改写
  48. ;时刻需求7.8us/1/133M个时钟周期,即有下面的公式:
  49. ;Refresh_Count=tREFRESH*HCLK(MHz)/1000
  50. ;tREFRESH=7813HCLK=133Refresh_Count=1039
  51. ldrr1,=1039;DMC_DDR_REFRESH_PRD
  52. strr1,[r0,#INDEX_DMC_REFRESH_PRD]
  53. ;CAS_Latency=DDR_CASL<<1->DDR_CASL3
  54. ldrr1,=6;DMC_DDR_CAS_LATENCY
  55. strr1,[r0,#INDEX_DMC_CAS_LATENCY]
  56. ;t_DQSS(clockcycles)
  57. ldrr1,=1;DMC_DDR_t_DQSS
  58. strr1,[r0,#INDEX_DMC_T_DQSS]
  59. ;T_MRD(clockcycles)
  60. ldrr1,=2;DMC_DDR_t_MRD
  61. strr1,[r0,#INDEX_DMC_T_MRD]
  62. ;T_RAS(clockcycles)
  63. ldrr1,=7;DMC_DDR_t_RAS
  64. strr1,[r0,#INDEX_DMC_T_RAS]
  65. ;T_RCActiveBankxtoActiveBankxdelay(clockcycles)
  66. ldrr1,=10;DMC_DDR_t_RC
  67. strr1,[r0,#INDEX_DMC_T_RC]
  68. ;T_RCDRAStoCADdelay(clockcycles)
  69. ldrr1,=4;DMC_DDR_t_RCD
  70. ldrr2,=8;DMC_DDR_schedule_RCD
  71. orrr1,r1,r2
  72. strr1,[r0,#INDEX_DMC_T_RCD]
  73. ;T_RFCAutoRefresh(clockcycles)
  74. ldrr1,=11;DMC_DDR_t_RFC
  75. ldrr2,=256;DMC_DDR_schedule_RFC
  76. orrr1,r1,r2
  77. strr1,[r0,#INDEX_DMC_T_RFC]
  78. ;T_RPPrechargetoRASdelay(clockcycles)
  79. ldrr1,=4;DMC_DDR_t_RP
  80. ldrr2,=8;DMC_DDR_schedule_RP
  81. orrr1,r1,r2
  82. strr1,[r0,#INDEX_DMC_T_RP]
  83. ;T_RRDActiveBankxtoActiveBankydelay(clockcycles)
  84. ldrr1,=3;DMC_DDR_t_RRD
  85. strr1,[r0,#INDEX_DMC_T_RRD]
  86. ;T_WRWritetoprechargedelay(clockcycles)
  87. ldrr1,=3;DMC_DDR_t_WR
  88. strr1,[r0,#INDEX_DMC_T_WR]
  89. ;T_WTRWritetoReaddelay(clockcycles)
  90. ldrr1,=2;DMC_DDR_t_WTR
  91. strr1,[r0,#INDEX_DMC_T_WTR]
  92. ;T_XPExitPowerdown(clockcycles)
  93. ldrr1,=2;DMC_DDR_t_XP
  94. strr1,[r0,#INDEX_DMC_T_XP]
  95. ;T_XSRExitselfrefresh(clockcycles)
  96. ldrr1,=17;DMC_DDR_t_XSR
  97. strr1,[r0,#INDEX_DMC_T_XSR]
  98. ;T_ESRSelfRefresh(clockcycles)
  99. ldrr1,=17;DMC_DDR_t_ESR
  100. strr1,[r0,#INDEX_DMC_T_ESR]
  101. ;MemoryConfigurationRegister
  102. ldrr1,=0x40010012;DMC1_MEM_CFG
  103. strr1,[r0,#INDEX_DMC_MEMORY_CFG]
  104. ldrr1,=0xb41;DMC1_MEM_CFG2
  105. strr1,[r0,#INDEX_DMC_MEMORY_CFG2]
  106. ldrr1,=0x150f8;DMC1_CHIP0_CFG
  107. strr1,[r0,#INDEX_DMC_CHIP_0_CFG]
  108. ldrr1,=0;DMC_DDR_32_CFG
  109. strr1,[r0,#INDEX_DMC_USER_CONFIG]
  110. ;ThefollowsisaccordingtotheDatasheetinitializationsequence
  111. ;DMC0DDRChip0configurationdirectcommandreg
  112. ldrr1,=0x0c0000;DMC_NOP0
  113. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  114. ;PrechargeAll
  115. ldrr1,=0;DMC_PA0
  116. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  117. ;AutoRefresh2time
  118. ldrr1,=0x40000;DMC_AR0
  119. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  120. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  121. ;MRS
  122. ldrr1,=0xa0000;DMC_mDDR_EMR0
  123. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  124. ;ModeReg
  125. ldrr1,=0x80032;DMC_mDDR_MR0
  126. strr1,[r0,#INDEX_DMC_DIRECT_CMD]
  127. ;EnableDMC1
  128. movr1,#0x0
  129. strr1,[r0,#INDEX_DMC_MEMC_CMD]
  130. check_dmc1_ready
  131. ldrr1,[r0,#INDEX_DMC_MEMC_STATUS]
  132. movr2,#0x3
  133. andr1,r1,r2
  134. cmpr1,#0x1
  135. bnecheck_dmc1_ready
  136. nop
  137. movpc,lr
  138. END

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/264686.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部