你好,游客 登录 注册 搜索
背景:
阅读新闻

S3C2440 SDRAM内存驱动

[日期:2011-09-02] 来源:Linux社区  作者:mr_raptor [字体: ]

1.1.7    SDRAM的刷新

SDRAM之所以成为DRAM就是因为它要不断进行刷新(Refresh)才能保留住数据,因此它是SDRAM最重要的操作。

刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有 L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些很长时间没经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不是一定是相同的。那么要隔多长时间重复一次刷新呢?目前公认的标准是,存储体中电容的数据有效保存期上限是64ms(毫秒,1/1000秒),也就是说每一行刷新的循环周期是64ms。这样刷新时间间隔就是: 64m/行数s。我们在看内存规格时,经常会看到4096 Refresh Cycles/64ms8192 Refresh Cycles/64ms的标识,这里的40968192就代表这个芯片中每个L-Bank的行数。刷新命令一次对一行有效,刷新间隔也是随总行数而变化,4096行时为 15.625μs(微秒,1/1000毫秒),8192行时就为 7.8125μs。刷新操作分为两种:Auto Refresh,简称ARSelf Refresh,简称SR。不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。对于 ARSDRAM内部有一个行地址生成器(也称刷新计数器)用来自动的依次生成行地址。由于刷新是针对一行中的所有存储体进行,所以无需列寻址,或者说CAS RAS之前有效。所以,AR又称CBRCAS Before RAS,列提前于行定位)式刷新。由于刷新涉及到所有L-Bank,因此在刷新过程中,所有 L-Bank都停止工作,而每次刷新所占用的时间为9个时钟周期(PC133标准),之后就可进入正常的工作状态,也就是说在这9个时钟期间内,所有工作指令只能等待而无法执行。64ms之后则再次对同一行进行刷新,如此周而复始进行循环刷新。显然,刷新操作肯定会对SDRAM的性能造成影响,但这是没办法的事情,也是DRAM相对于 SRAM(静态内存,无需刷新仍能保留数据)取得成本优势的同时所付出的代价。SR则主要用于休眠模式低功耗状态下的数据保存,这方面最著名的应用就是 STRSuspend to RAM,休眠挂起于内存)。在发出AR命令时,将CKE置于无效状态,就进入了SR模式,此时不再依靠系统时钟工作,而是根据内部的时钟进行刷新操作。在SR期间除了CKE之外的所有外部信号都是无效的(无需外部提供刷新指令),只有重新使CKE有效才能退出自刷新模式并进入正常操作状态。

SDRAM相关寄存器:

1BWSCON寄存器(BUS WIDTH & WAIT CONTROL REGISTER

2-17 SDRAM控制寄存器(BWSCON

 

 

 

根据开发板的存储器配置和芯片型号,设置每个BANK焊接芯片的位宽和等待状态

BWSCON,每4位对应一个BANK,这4位分别表示:

l  STx:启动/禁止SDRAM的数据掩码引脚(UB/LB),SDRAM没有高低位掩码引脚,此位为0SRAM连接有UB/LB管脚,设置为1

l  注:UB/LB数据掩码引脚用来控制芯片读取/写入的高字节和低字节(对比硬件手册SDRAMSRAM的接线图)

l  WSx:是否使用存储器的WAIT信号,通常设为0

l  DWx:设置焊接存储器芯片的位宽,笔者开发板使用两片容量为32M,位宽为16SDRAM组成64M32位存储器,因此DW7DW6位设置为0b10,其它BANK不用设置采用默认值即可。

l  BANK0对应的是系统引导BANK,这4位比较特殊,它的设置是由硬件跳线决定的,因此不用设置

l  BWSCON设置结果:0x22000000

2BANKCON0~BANKCON5 (BANK CONTROL REGISTER)

2-18 BANKCON0~BANKCON5控制寄存器(BANKCON0~BANKCON5

 

6个寄存器用来设置对应BANK0~BANK5的访问时序,采用默认值0x700即可

3BANKCON6~BANKCON7 (BANK CONTROL REGISTER)

2-19 BANKCON6~BANKCON7控制寄存器(BANKCON6~BANKCON7

 

 

 

由于内存都焊接在这两个BANK上,因此内存驱动主要是对这两个寄存器进行设置

l  MT:设置BANK6~BANK7的存储器类型,

00=ROM or SRAM 01=保留

10=保留         11=SDRAM

内存为SDRAM,设置为0b11,对应的应该设置TrcdSCAN位,其它位和SDRAM无关

l  TrcdRAS to CAS Delay行地址选通到列地址选通延迟,这个参数请看后面的内存工作原理扩展部分解释,笔者内存芯片为HY57V561620,由其芯片手册可知其Trcd为最少20ns,如果内存工作在100MHz,则该值至少要为2个时钟周期,通常设置为3个时钟周期,因此设置为0b01

l  SCANSDRAM Column Address Number SDRAM的列地址数,笔者内存芯片为HY57V561620,列地址数为9,设置为0b01

l  BANK6BANK7设置结果为:0x18005

4REFRESH (REFRESH CONTROL REGISTER)

2-20刷新频率设置寄存器(REFRESH

 

 

 

SDRAM的刷新有效,刷新频率设置寄存器(刷新)

l  REFEN:开启/关闭刷新功能,设置为1,开启刷新

l  TREFMDSDRAM刷新模式,0=CBR/AutoRefresh,  1=Self Refresh,设置为0,自动刷新

l  Trp:行地址选通预充电时间,一般设置为0b00即可

l  Tsrc:单行刷新时间,设置为0b11即可。

l  Refresh Counter:内存存储单元刷新数,它通过下面公式计算出:

Refresh Counter = 2^11 + 1 – SDRAM时钟频率(MHz* SDRAM刷新周期(uS

SDRAM的刷新周期,也就是内存存储单元间隔需要多久进行一次刷新,前面内存工作原理分析可知电容数据保存上限为64ms,笔者使用内存芯片每个L-Bank共有8192行,因此每次刷新最大间隔为:64ms/8192 = 7.8125uS,如果内存工作在外部晶振频率12MHz下,Refresh Counter = 1955,如果内存工作在100MHz下,那么Refresh Counter = 1269(取大整数)

l  REFRESH寄存器设置为:

0x8e0000 + 1269 = 0x008e04f5HCLK = 100MHz

0x8e0000 + 1955 = 0x008e07a3HCLK = 12MHz

5BANKSIZE寄存器(BANKSIZE REGISTER

2-21 BANKSIZE寄存器(BANKSIZE

 

 

设置内存的突发传输模式,省电模式和内存容量。

l  BURST_EN:是否开启突发模式, 0 = ARM内核禁止突发传输 1 = 开启突发传输,设置为1,开启突发传输

l  SCKE_EN:是否使用SCKE信号作为省电模式控制信号, 0 = 不使用SCKE信号作为省电模式控制信号 1 = 使用SCKE信号作为省电模式控制信号,通常设置为1

l  SCLK_EN: 设置向存储器输入工作频率,0 = 一直输入SCLK频率,即使没有内存操作也会输入, 1 = 仅当进行内存数据操作时才输入SCLK频率,通常设置为1

l  BK76MAP:设置Bank6/7的内存容量,笔者使用开发板内存为两片32M内存芯片并联成64M,它们全部都外接到Bank6上,因此选择0b001

l  BANKSIZE寄存器设置为:0xb1

6SDRAM模式设置寄存器MRSRx (SDRAM MODE REGISTER SET REGISTER)

2-22 SDRAM模式设置寄存器(MRSRx

 

 

 

该寄存器用于设置CAS潜伏周期,可以手动设置的位只有CL[6:4]位,通过前面内存工作原理可知,笔者使用开发板CL=3,即0b011

l  MRSR6MRSR7设置为:0x00000030

linux
相关资讯       S3C2440 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款