本文分析S5PV210板的DDR初始化程序。
一、IO部分配置。从下图管脚定义表来看,Xm1管脚只有单个功能Func0,所以不用配置管脚复用功能。
memory.S文件,20行-40行
mem_init: //1、设置DMC0 Drive Strength (Setting 2X) ldr r0,=ELFIN_GPIO_BASE ldr r1,0x0000AAAA str r1,[r0,#MP1_0DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_1DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_2DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_3DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_4DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_5DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_6DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_7DRV_SR_OFFSET] ldr r1,0x0000AAAA str r1,[r0,#MP1_8DRV_SR_OFFSET]
其中,宏定义都在s5pv210.h文件中:
#defineELFIN_GPIO_BASE 0xE020_0000
#defineELFIN_GPIO_BASE 0x3CC
将DMC0的驱动能力设置为2X。
二、从此开始,按照手册的27步开始配置:
**step1:**To provide stable power for controller and memory device, the controller must assert and hold CKE to a logic high level. Then apply stable clock. Note: XDDR2SEL should be Low level to hold CKE to high.
为了提供稳定的电源给控制器和内存设备,控制器必须确保CKE维持低电平,提供一个稳定的时钟。
step2:Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to correct value according to clock frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to activate the PHY DLL.
此步配置DMC端DLL。
DMC端DLL的作用是将DQS信号相移90°,以消减从DDR数据总线有数据时到数据传送到CPU的延时(rd_fetch)。
rd_fetch计算公式如下:
配置代码:
//2、初始化PHY DLL ldr r0,=APB_DMC_0_BASE //step3:PhyControl0 parameter setting,manual 0x00101000 ldr r1,= 0x00101000 str r1,[r0,#DMC_PYHCONTROL0] //PhyControl1 parameter setting,LPDDR/LPDDR2 Case ldr r1,= 0x00000086 str r1,[r0,#DMC_PYHCONTROL1 ]
#define APB_DMC_0_BASE 0xF000000
#define DMC_PYHCONTROL0 0x18
#define DMC_PYHCONTROL1 0x1C
上图中:ctrl_inc,表示DLL从0到90°相移过程中,每次相移的度数。推荐值为0x10;
ctrl_start_point:表示DLL从0到90°相移过程中,起点位置,推荐值为0x10;
ctrl_dll_on:DLL总开关;此时先配置为0,在后面的步骤中再打开。
ctrl_start:DLL待机开关。先打开ctrl_dll_on,再打开ctrl_start。
ctrl_dfdqs:DQS差分或者单端选择信号;
ctrl_half:DLL低速或告诉选择信号。此处配置为0。
step3:DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to the correct value according to clock frequency and memory tAC parameters.
其中,ctrl_shiftc是DQS Cleaning 相移粗调,在DDR2@200MHz时推荐是0x6(T/2)。
ctrl_offsetc是DQS Cleaning相移精调。
DQS Cleaning示意图如下:
DQS Cleaning就是在DMC中将DQS的信号延时标记出来,如PCB布线、焊点等的延时。