MPC5125初始化DDR2 SDRAM那些事儿

 

       产品升级将DDR一代的SDRAM换成DDR2代的SDRAM,在核心频率都为200MHZ的情况下,带宽可以增加一倍,对于其驱动的分析改写过程记录如下:

(1)对于MPC5125 DDR控制的初始化:

       MPC5125 DDR控制器的特点:

       The DRAM controller is a multi-port controller that listens to incoming requests on the four incoming buses and decides on each rising clock edge what command needs to be sent to the DRAM.

      • Bus 0: the DIU
      • Bus 1: the Power Architecture e300 core
      • Bus 2: NFC nand flash controller
      • Bus 3: DMA, USB, FEC

     因为4条总线共同访问SDRAM控制器,为了使每条总线的请求都能得到响应处理,或者某条总线的数据量明显多于另外的总线,就要设置一个竞争机制,判断某一时刻到底处理来自什么地方的数据。MPC5125有一套复杂的优先级产生机制。 

       MPC5125 DDR优先级产生机制:

       在优先级仲裁器中有两张表:main look-up table以及alternate look-up table,设置Priority Manager Configuration 1 Register可以选择查表的方式。

       查表的机制是,在每个通道接受到设定的N个ACK时开始查表,假如处于总线上的Bus 0: DIU以及Bus 1: Power architecture e300处理的信息量最多,需要频繁的访问SDRAM,可以设定当产生了32个ACK的时候开始查main look-up table或alternate look-up table,如果此时Bus 0和Bus 1上的ACK都是32个,那么他们就都属于最高优先级即优先级15,这时再看PRIO15[3:0]中的值是谁大一些,就先运行谁先访问总线。比如Bus0访问结束后,优先级变低,因为Bus1仍是最高优先级,接下来就允许访问SDRAM控制器。

      对于没有请求使用SDRAM的总线,Priority Manager Configuration 2 Register可以设置其优先级的变化方式,如果该总线根本没有外设请求,可以设置为自动降低优先级的方式,如果该总线接到了一个不常用但是比较重要的外设,可以自动调高其优先级,这也是默认的方式。

一下是对MPC5125 优先级控制器的设置:

writemem.l 0x80009080 0x000777aa //五条总线都使用main look-up table,BUS0-1 48个ACK时开始查表,BUS2-4有16ACK时开始查表
writemem.l 0x80009084 0x00000055 //BUS0、BUS2无请求时优先级自动下降,其他为上升                                           
writemem.l 0x80009088 0x00000000 //Average number of high priority requests to DRAM,不设置竞争机制
writemem.l 0x8000908C 0x11111117//优先级表
writemem.l 0x800090a0 0x7777777a
writemem.l 0x80009090 0x444eeeee
writemem.l 0x800090a4 0xeeeeeeee
writemem.l 0x80009094 0x44444444
writemem.l 0x800090a8 0x44444444
writemem.l 0x80009098 0x55555555
writemem.l 0x800090ac 0x55555558
writemem.l 0x8000909c 0x11111111
writemem.l 0x800090b0 0x1111117c
writemem.l 0x800090b4 0x33333377
writemem.l 0x800090c8 0x7777eeee
writemem.l 0x800090b8 0x11111111
writemem.l 0x800090cc 0x11111111
writemem.l 0x800090bc 0x11111111
writemem.l 0x800090d0 0x11111111
writemem.l 0x800090c0 0x11111111
writemem.l 0x800090d4 0x11111111
writemem.l 0x800090c4 0x11111111
writemem.l 0x800090d8 0x11111111

可以看出设置main look-up table以及alternate look-up table的时候是很麻烦的,在对外设服务顺序没有特殊要求的时候可以使用默认设置。

(2)对于DDR SDRAM工作方式的设置:

      先看cron MT47H64M16LFCK-3数据手册定义的各个指令的含义:

      COMMAND:

      NO OPERATION (NOP) NOP指令是一个空操作指令,为了在空闲时间防止意外指令访问寄存器,并不影响正在运行的操作。 

      PRECHARGE :预充电指令用于对某个bank中的开放的列或对所有开放的bank充电,充电完毕后的bank会进入空闲状态,当被激活后可以执行读写命令。

     SELF REFRESH:刷新用于保存SDRAM中的数据,不需要外部时钟的情况下可由内部电路完成,有低速和高速模式。

     Mode Register (MR):模式寄存器,可以选择如突发长度,操作方式,DLL reset,写恢复,掉电模式等,由Load Mode command 来设置。

     Extended Mode Register (EMR):拓展寄存器1,主要用于控制DLL使能,驱动强度,ODT,OCD,输出是使能等。

     Extended Mode Register 2 (EMR2):拓展模式寄存器2,主要用于高温操作,可以使能高速刷新模式。

     Extended Mode Register 3 (EMR3):JEDEC规定拓展寄存器,在所选用的MT47H64M16没有定义,全为0。

    再看MPC5125DDR命令寄存器的含义:

    MPC5125 DRAM Command (DDR_COMMAND) Register (32bit)

    DRAM_COMMAND[23:16]

• DRAM_BA[2:0] = DRAM_COMMAND[18:16]
• DRAM_WEB = DRAM_COMMAND[19]
• DRAM_CAS = DRAM_COMMAND[20]
• DRAM_RAS = DRAM_COMMAND[21]
• DRAM_CS0 = DRAM_COMMAND[22]
• DRAM_CS1 = DRAM_COMMAND[23]

   DRAM_COMMAND[15:0] 可以写mode register

   在上述指令看出,高16位用于产生时序,低16位用于设置模式寄存器的值。

   参考手册中的初始化顺序写出对于Micron MT47H64M16LFCK 初始化指令序列:

##############################
# echo Init. Micron MT47H64M16LFCK-3 for 200 MHz
#############################

首先配置工作方式和关键时间参数:

# DDR_SYS_CONFIG - CMDmode=1, row_sel=5, bank_sel=4, SelfRefEn=0, (rdly=2, 1/2=0, 1/4=1)=2.75, wdly=2
writemem.l 0x80009000 0xFA804A00

# DDR_TIME_CONFIG0 - refresh=0, cmd=61, bank_pre=46
# writemem.l 0x80009004 0x00003D2E
writemem.l 0x80009004 0x00003c2d

# DDR_TIME_CONFIG1, rfc=26, wr1=7, wrt1=6 ,rrd=2, rc=11, ras=8
writemem.l 0x80009008 0x68EC1168
writemem.l 0x80009008 0x68ec1189

# DDR_TIME_CONFIG2, rcd=3, faw=10, rtw1=4, ccd=2, rtp=2, rp=3, rpa=4
writemem.l 0x8000900c 0x35310864

    对于关键时序参数DDR_TIME_CONFIG1以及DDR_TIME_CONFIG2是如何设置的呢?

    其实当SDRAM核心频率工作在200MHZ的时候,一个CBS时钟周期为5ns,再根据数据手册中提供的Electrical Specifications参数根据芯片的不同尾缀可以得到以上设置,此后,进入指令模式,对DDR2 SDRAM进行指令设置

#NOP

writemem.l 0x80009010 0x01380000 

# Precharge All
 writemem.l 0x80009010 0x01100400

# Load Mode to EMR2 to select Self Refresh x1
writemem.l 0x80009010 0x01020000

# Lode Mode to EMR3, Load with all zeros. Does nothing
 writemem.l 0x80009010 0x01030000

# Load Mode to EMR to enable DLL.
 writemem.l 0x80009010 0x01010000

# Load Mode to MR for DLL Reset.
writemem.l 0x80009010 0x01000100

# Precharge All
writemem.l 0x80009010 0x01100400

# Auto Refresh
writemem.l 0x80009010 0x01080000

# Auto Refresh
writemem.l 0x80009010 0x01080000

# Load Mode to MR. DLL Reset=0, WR=3, TM=0, CAS=3, BT=Seq, BL=4
writemem.l 0x80009010 0x01000432

# Load Mode to EMR to enable OCD default. OCD=7
writemem.l 0x80009010 0x01010400  //0x01010380

# Load Mode to EMR to enable OCD exit. OCD=0.
writemem.l 0x80009010 0x01010000

     写到这里,开始一直纳闷为什么使能OCD的时候设置EMR的时候是错误的,看到下面这段话才知道,micron DDR2chip并不支持OCD功能。

The OFF-CHIP DRIVER function is an optional DDR2 JEDEC feature not supported by Micron and thereby must be set to the default state. Enabling OCD beyond the default settings will alter the I/O drive characteristics and the timing and output I/O specifications will no longer bevalid (see Initialization (page 86) for proper setting of OCD defaults).

##################
# echo Start MDDRC
##################

# DDR_TIME_CONFIG0, refresh=1560, cmd=61, bank_pre=46
# writemem.l 0x80009004 0x06183D2E
writemem.l 0x80009004 0x06083c2d

# DDR_SYS_CONFIG - CMDmode=0, row_sel=5, bank_sel=4, SelfRefEn=0, (rdly=2, 1/2=0, 1/4=1)=2.75, wdly=2
writemem.l 0x80009000 0xEA804A00

      这样重新回到数据读写模式,就可以正常对DDR2 SDRAM进行读写了。

总结:

     当核心频率相同时,DDR2 SDARM比DDR SDRAM具有高一倍的带宽;如果当两者带宽相同时,DDR2具有一半的核心时钟频率,比DDR 具有更大的时钟延迟。在设置MPC5125 DDR控制器时根据不同总线访问频率的不同根据性能均衡设置相应的优先级,再按照SDRAM芯片手册上的初始化顺序和时间参数使用相应的命令进行设置。

 

 

你可能感兴趣的:(MPC5125_uboot移植)