weiqi7777

cortex-a8裸机系列:第九章 DRAM控制器设置

0
阅读(2533)

 

DRAM的初始化,其实就是对cpu内部的DRAM控制器进行初始化,因为对外部DRAM的数据访问,是通过DRAM控制器来进行访问的。

而对DRAM控制器的初始化,其实就是初始化DRAM控制器的寄存器。

一、            设置ASYNC_CONFIG寄存器

clip_image002[4]

 

         该寄存器

clip_image004[4]

         作用:

clip_image006

         目前不知道配置这个寄存器有什么用,不过试了下,不用配置这个寄存器也可以。

二、            设置驱动强度

设置GPIO的驱动强度。

clip_image008

          MP1_0DRV_SR_OFFSET  =  0x3CC

 

         就是设置MP1_0组端口GPIO的驱动强度。

clip_image010

         将驱动强度都设置为2x


MP1_1DRV_SR_OFFSET = 0x3EC

clip_image012

设置MP1_1组端口GPIO的驱动强度为2x

clip_image014

设置驱动强度的意义

手册的92页,有说明,对于DRAM1使用的是MP1_0 – 8 端口。对于DRAM2使用的是MP2_0 - 8 端口。所以对于这些端口需要设置下驱动强度。

clip_image016

         不过测试下,把驱动强度设置为1x,也是可以工作的。不过,官方既然是设置了驱动强度时2x,那么就设置为2x好了。

 

 

         S5PV210,GPIO,分为了三个类型,A类型,B类型,C类型,每组类型的IO,用于不同的目的。

clip_image018

对于type C,用于DRAM的。驱动能力由下图所示。猜测DS0DS1就是配置驱动强度寄存器每一个port的低位和高位。

DS0 = 0, DS1 = 1 就表示驱动强度为2x

设置驱动的目的,是为了和外部设备的兼容。比如外部的DRAM的芯片,驱动电流最小是6mA,那么连接DRAM芯片的端口的驱动电流,就不能低于6mA,因此DS0DS1都不能设置为0,也就是驱动强度不能为1x

clip_image020

 

设置MP1的其他组GPIO的驱动强度为2x

clip_image022

以上的宏定义

clip_image024

寄存器的作用和上面的一样。

 

不过经过测试,这些寄存器不用设置也是可以的,因为这些寄存器的复位默认值是0xAAAA。所以上诉代码是可以删掉的。

clip_image026

三、            设置DLL

设置DLL的目的,是为了设置驱动给DRAM的时钟。

代码如下:

clip_image028

这里是210手册中规定的初始化顺序

clip_image030

 

PHY control0寄存器

clip_image032

l  操作PHY control0寄存器的ctrl_start_pointctrl_inc这几位,而这几位要写入0x10。所以对这个寄存器的写入值是0x00101000

l  操作PHY control0寄存器ctrl_dll_on这一位,要写入1,打开PHY DLL。所以对这个寄存器的写入值是0x00101002

l  操作PhyControl1寄存器的ctrl_shiftcctrl_offsetc位,这个和外部的DDR时序有关系,这里写入的值是0x00000086

clip_image034

l  设置PHY control0寄存器的ctrl_start位为1,这个是第0位。写入值是0x00101003

clip_image036

         以上的初始化时序和手册中的PHY DLL LOCK Procedure有关系(627页)

clip_image038

         保持ctrl_dll_on一直为高,写入ctrl_start_pointctrl_inc。等到DLL锁定后,ctrl_clock会为高,ctrl_flock也会为高,所以下一步就是判断锁定的时候就要判断ctrl_clockctrl_flock以及ctrl_lock信号是否都为1

         判断锁定后,就要将ctrl_lock_value读取,然后写入到ctrl_force中,就是之后的两步完成的事。

 

        

判断DLL是否锁定

通过读取PHY status寄存器判断。

clip_image040

clip_image042

判断PHY Status Register 寄存器的最低3位是否都为1。不是的话,就一直读取判断,直到DLL锁定

 

设置PHY control0寄存器的DLL force Delay

clip_image044

clip_image046

Ctrl_force的值是PHY Status Register寄存器ctrl_lock_value[9:2],读取PHY Status Register寄存器的值赋值给r1,然后取ctrl_lock_value[9:2]的值,其他位都清零。在将ctrl_inc ctrl_start_point的值给设置为0x10ctrl_dll_on ctrl_start都设置为1,赋值给 PHY control0寄存器。

 

四、            设置寄存器

按照初始化步骤

clip_image048

代码

clip_image050

对于concontrol寄存器,这个寄存器比较复杂,目前不清楚功能。

 

对于memctrol寄存器,这个寄存器比较重要,根据外部存储器设置。

clip_image052

根据数据手册,得知,突发长度设置为41chip32位数据,存储器类型为DDR2

clip_image054

 

对于memconfig0寄存器,设置chip0的信息。这个要根据所用的存储器来确定。

clip_image056

设置下来,chip_base0x20chip_mask0xf0,表示对于DRAM0的有效地址空间是0x2000_0000 – 0x27ff_ffff。使用线性映射,row地址14位,col地址10位。

clip_image058

 

        因为没有接chip1,因此用不到chip1,所以memconfig1不用设置。

 

       对于preconfig寄存器

clip_image060

 

       对于pwrdnconfig寄存器。设置若n个周期后没有对DRAM操作,就进入自刷新和预充电休眠状态。

clip_image062

五、            设置时序

以下设置的时序信息,就和外部的DRAM芯片时序有关的。这里的时序参数,一定要设置正确,和外部的DRAM芯片的时序匹配,否则DRAM控制器是不能正常的驱动外部的DRAM芯片的。

手册上,有说明设置时序的步骤:

clip_image064

代码

clip_image066

设置刷新时间,我们设置的系统mclk时钟为200M,所以设置的值为7.8 us * 200 = 1560(0x618)

clip_image068

clip_image070

 

对于timingRow寄存器,关于行地址的时序

clip_image072

 

对于TimingData,设置数据的时序

clip_image074

 

对于TimingPower,设置存储器的电源模式

clip_image076

六、            判断锁定

时序设置完毕后,需要判断DLL是否锁定,并要设置PhyControl0.ctrl_force。但是这个在之前的DLL锁定已经做了,而且实验,在之前判断锁定和在这里判断锁定,都是可以工作的。

clip_image078

七、            发送命令

DRAM控制器设置完毕后,下面就要利用DRAM控制器,对外部的DRAM芯片进行初始化。

手册提供了初始化顺序,需要发送各种命令。

clip_image080

clip_image082

 

发送命令,通过控制DirectCmd寄存器,[24:24]表示发送的命令,[20]表示对DRAM的哪个chip进行操作进行操作。

clip_image084

clip_image086

代码

clip_image088

 

对于EMRS命令。Cmd_type部分是0x9。但是怎么区分MRS,EMSR1,EMSR2,EMSR3了。就要靠cmd_bank来确定

cmd_bank

命令

000

MRS

001

EMSR1

010

EMSR2

011

EMSR3

 

根据外接的DDR2的数据手册,可以看出EMRS命令是可以带参数的,参数就是由cmd_addr来决定的。

对于DDR2芯片来说,EMRS的格式都是

clip_image090

前面3BA2,BA1,BA0是去确定哪一个命令。因为该DDR2芯片没有用到BA2,所以BA2的值要为0

clip_image092

 

后面的A13-A0就是该命令对应的参数,在不同的命令下,该参数对应的功能也不一样。

clip_image094

 

 

对于MRS命令

clip_image096

在代码中,是如下写的,通过上表对应,可知,设置CL4BL4ModenormalDLL ResetYES,对DLL进行复位。

clip_image098

不过在随后的代码,将A8置为0,取消复位。

clip_image100

 

对于EMSR1命令

clip_image102

clip_image104

A101——DQS功能取消。

clip_image106  A10-A7都是为1——DQS功能取消。 OCD calibration default * 4

clip_image108

         A101A9-A70 OCD calibration mode exit

        

对于EMSR2

clip_image110

clip_image112

         高温下自刷新功能关闭,自刷新的阵列是全阵列。

 

EMRS3命令,目前在DDR2芯片中没有使用。要使用的话,参数要设置为全0.

clip_image114

八、            初始化最后两步

最后两部,设置两个寄存器:

clip_image116

代码

clip_image118

         对于CONCONTROL寄存器

clip_image120

 

 

         通过以上的操作,就将DRAM控制器和外部的DRAM芯片进行初始化了,此时CPU就可以访问外部的DRAM芯片了。