以下流程基本为简单翻译(原文参考s5pv210的数据手册1.2.1.3章节)
1. DMC及DDR2颗粒上电, 且电压稳定
2. DMC保持CKE为低电平
3. SOC提供时钟(XDDR2SEL保持高电平以保持CKE为低)
4. 根据实际工作时钟频率设置phyControl0.ctrl_start_point和PhyControl0.ctrl_inc
ldr r0, =APB_DMC_0_BASE
@ 0xF000_0000
ldr r1, =0x00101000
@ ctrl_start_point: bit[15:8], ctrl_inc: bit[23:16], 按手册建议,这两位都设置为0x10
str r1, [r0, #DMC_PHYCONTROL0]
@ 0xF000_0018
5. 设置PhyControl0.ctrl_dll_on为”1”, 以使能PHY DLL
ldr r1, =0x00101002
@ctrl_dll_on: bit[1]
str r1, [r0, #DMC_PHYCONTROL0]
@ 0xF000_0018
6. DQS Cleaning: 根据实际工作时钟频率和tAC设置PhyControl1.ctrl_shiftc和PhyControl1.ctrl_offsetc (可以和第7步互换顺序)
ldr r1, =0x00000086
@ ctrl_shiftc: bit[2:0], 手册建议设置为6 (DDR2); ctrl_offsetc: bit[14:8], 这里设置为”0”, ctrl_ref: bit[7:4], 默认值为0x4; 所以, 这里应该设置为0x00000046系统也能工作, 设置为”86”可能是原代码作者的错误
str r1, [r0, #DMC_PHYCONTROL1]
@ 0xF000_001C
7. 置位PhyControl0.ctrl_start以启动DLL
ldr r1, =0x00101003
@ ctrl_start: bit[0]
str r1, [r0, #DMC_PHYCONTROL0]
@ 0xF000_0018
8. 设置ConControl, 注意此时需要保证auto refresh counter off
ldr r1, =0x0FFF2010
@ default time out cycles: FFF; Read data fetch cycles: 2 (CL后再过2个周期latch数据), disable adaptive QoS, disable DQ swap, disable PHY driving (bi-directional pin拉低以省电, enable是不是更好?), disable read cycle gap for 2 different chips (应该是enable),auto refresh counter off, enable out of order scheduling, revise后的设置为(待测试):0x0FFF23D0
str r1, [r0, #DMC_CONCONTROL]
@ 0xF000_0000
9. 设置MemControl, 所有power down mode要关掉
ldr r1, =0x00202400
@ MemControl BL=4, 2 chip, 位宽x32 (是指通道位宽), DDR2 type, no additional latency for PALL, disable dynamic self refresh, disable timeout p
DDR2初始化代码分析[s5pv210, K4T1G164QQ]
最新推荐文章于 2024-01-07 16:28:45 发布