深入理解ARM体系架构(S3C6410)---DRAM控制器初始化实例

本文由muge0913编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7428118


作者:张同浩,邮箱:[email protected]


S3C6410内存控制器是采用的PL340内存控制芯片。AMBA APB3.0接口协议规定,可以通过编程将AXI从总线接口和APB主总线接口进行桥接,实现二者总线上的数据的传输。DRAM控制器可以直接从SDRAM或DRAM接收一个控制命令。通过将操作命令写入direct_cmd寄存器,操作SDRAM进行对应操作。通过向memc_cmd寄存器写入状态模式命令,使DRAM控制器进入对应的工作模式。例如:向direct_cmd寄存器写入:Prechargeall’,‘Autorefresh’,‘NOP’,and ‘MRS’ 等命令,可以让SDRAM芯片分别执行不同操作,向memc_cmd寄存器写入一些状态命令可以让SDRAM芯片进入’Config’, ‘Ready’, and ‘Low_power’等工作模式。

 

DRAM控制器支持两种节能模式。当SDRAM处于不活动状态并且持续一定的时钟周期时,DRAM控制器会自动将SDRAM进入预充电节能模式或正常节能模式下以降低系统功耗。当驱动操作DRAM控制器进入对应的STOP(停止),Deep Stop(深度睡眠),Sleep Mode(睡眠)等模式时,SDRAM芯片进入自刷新的节能模式。

DRAM控制器支持两个同类型的chip,同时能为每个chip最大分配256M的地址空间。除了时钟时钟信号和片选信号,其他的引脚chip都是共享的。



dram控制器引脚接口如下:

深入理解ARM体系架构(S3C6410)---DRAM控制器初始化实例_第1张图片


注:

在复位时,必须软件初始化DRAM控制器和连接到此控制器的SDRAM。初始化SDRAM参考SDRAM的数据手册即可。在mini6410开发用的是mobile ddr sdram。


在mini6410中sdram的电路如下:

深入理解ARM体系架构(S3C6410)---DRAM控制器初始化实例_第2张图片



DRAM控制器初始化程序如下:


mem_ctrl_asm_init

	 ldr r0, =ELFIN_MEM_SYS_CFG    ;Memory sussystem address 0x7e00f120
	 mov r1, #0xd      ;Xm0CSn2 = NFCON CS0 设置NAND Flash为存储器
	 str r1, [r0]
	 ldr r0, =ELFIN_DMC1_BASE     ;DMC1 base address 0x7e001000
	 
	 ; memc_cmd : 010 wake up
	 ldr r1, =0x04
	 str r1, [r0, #INDEX_DMC_MEMC_CMD]
	 
	 ; Refresh period = ((Startup_HCLK / 1000 * DDR_tREFRESH) - 1) / 1000000  -> DDR_tREFRESH 7800 ns
	 ldr r1, = 1308        ; DMC_DDR_REFRESH_PRD
	 str r1, [r0, #INDEX_DMC_REFRESH_PRD]
	 
	 ; CAS_Latency = DDR_CASL<<1    -> DDR_CASL 3
	 ldr r1, = 6         ; DMC_DDR_CAS_LATENCY
	 str r1, [r0, #INDEX_DMC_CAS_LATENCY]
	 
	 ; t_DQSS (clock cycles)
	 ldr r1, = 1         ; DMC_DDR_t_DQSS
	 str r1, [r0, #INDEX_DMC_T_DQSS]
	 ; T_MRD  (clock cycles)
	 ldr r1, = 2         ; DMC_DDR_t_MRD
	 str r1, [r0, #INDEX_DMC_T_MRD]
	 ; T_RAS (clock cycles)
	 ldr r1, = 7         ; DMC_DDR_t_RAS
	 str r1, [r0, #INDEX_DMC_T_RAS]
	 ; T_RC Active Bank x to Active Bank x delay(clock cycles)
	 ldr r1, = 10        ; DMC_DDR_t_RC
	 str r1, [r0, #INDEX_DMC_T_RC]
	 ; T_RCD RAS to CAD delay(clock cycles)
	 ldr r1, = 4         ; DMC_DDR_t_RCD
	 ldr r2, = 8         ; DMC_DDR_schedule_RCD
	 orr r1, r1, r2
	 str r1, [r0, #INDEX_DMC_T_RCD]
	 ; T_RFC AutoRefresh(clock cycles)
	 ldr r1, = 11         ; DMC_DDR_t_RFC
	 ldr r2, = 256        ; DMC_DDR_schedule_RFC
	 orr r1, r1, r2
	 str r1, [r0, #INDEX_DMC_T_RFC]
	 ; T_RP Precharge to RAS delay(clock cycles)
	 ldr r1, = 4         ; DMC_DDR_t_RP
	 ldr r2, = 8         ; DMC_DDR_schedule_RP
	 orr r1, r1, r2
	 str r1, [r0, #INDEX_DMC_T_RP]
	 ; T_RRD Active Bank x to Active Bank y delay(clock cycles)
	 ldr r1, = 3         ; DMC_DDR_t_RRD
	 str r1, [r0, #INDEX_DMC_T_RRD]
	 ; T_WR Write to precharge delay(clock cycles)
	 ldr r1, =3         ; DMC_DDR_t_WR
	 str r1, [r0, #INDEX_DMC_T_WR]
	 ; T_WTR Write to Read delay(clock cycles)
	 ldr r1, = 2         ;DMC_DDR_t_WTR
	 str r1, [r0, #INDEX_DMC_T_WTR]
	 ; T_XP Exit Power down(clock cycles)
	 ldr r1, = 2         ; DMC_DDR_t_XP
	 str r1, [r0, #INDEX_DMC_T_XP]
	 ; T_XSR Exit self refresh(clock cycles)
	 ldr r1, = 17        ; DMC_DDR_t_XSR
	 str r1, [r0, #INDEX_DMC_T_XSR]
	 ; T_ESR SelfRefresh(clock cycles)
	 ldr r1, = 17        ; DMC_DDR_t_ESR
	 str r1, [r0, #INDEX_DMC_T_ESR]
	 ; Memory Configuration Register
	 ldr r1, = 0x40010012      ; DMC1_MEM_CFG
	 str r1, [r0, #INDEX_DMC_MEMORY_CFG]
	 ldr r1, = 0xb41        ; DMC1_MEM_CFG2
	 str r1, [r0, #INDEX_DMC_MEMORY_CFG2]
	 ldr r1, = 0x150f8       ; DMC1_CHIP0_CFG
	 str r1, [r0, #INDEX_DMC_CHIP_0_CFG]
	 ldr r1, = 0         ; DMC_DDR_32_CFG
	 str r1, [r0, #INDEX_DMC_USER_CONFIG]
	 ; The follows is according to the Datasheet initialization sequence
	 ;DMC0 DDR Chip 0 configuration direct command reg
	 ldr r1, = 0x0c0000       ; DMC_NOP0
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 ;Precharge All
	 ldr r1, = 0         ; DMC_PA0
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 ;Auto Refresh 2 time
	 ldr r1, = 0x40000       ; DMC_AR0
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 ;MRS
	 ldr r1, = 0xa0000       ; DMC_mDDR_EMR0
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 ;Mode Reg
	 ldr r1, = 0x80032       ; DMC_mDDR_MR0
	 str r1, [r0, #INDEX_DMC_DIRECT_CMD]
	 ;Enable DMC1
	 mov r1, #0x0
	 str r1, [r0, #INDEX_DMC_MEMC_CMD]
check_dmc1_ready
	 ldr r1, [r0, #INDEX_DMC_MEMC_STATUS]
	 mov r2, #0x3
	 and r1, r1, r2
	 cmp r1, #0x1
	 bne check_dmc1_ready
	 nop

	mov	pc, lr	

最后把生成的.bin文件,放到sd卡中,在配置文件当中设置运行.bin文件即可。



程序下载地址:http://download.csdn.net/detail/muge0913/4200810










你可能感兴趣的:(c,cmd,XP,command,initialization,delay)