本文由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控制器引脚接口如下:
注:
在复位时,必须软件初始化DRAM控制器和连接到此控制器的SDRAM。初始化SDRAM参考SDRAM的数据手册即可。在mini6410开发用的是mobile ddr sdram。
在mini6410中sdram的电路如下:
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