U-boot中对SDRAM初始化
项目中遇到需要把64M SDRAM升级到128M的情况,我们板子上是两片32M的K4S561632C,而K4S511632C是64M的,直接更换不需要重新画PCB。原理图参见TQ2440—V2核心板,将对应电阻重焊后,就可将原来接到A24,A25引脚上的地址线换到A25,A26上。
u-boot中board/samsung/hfrk2440/lowlevel_init.S中:
#define BWSCON 0x48000000
/* BWSCON */
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)
#define B6_BWSCON (DW32) //两片16位SDRAM并成32位
#define B7_BWSCON (DW32)
#define B6_MT 0x3 /* SDRAM */
/* Determine the memory type for bank6 and bank7. 00 = ROM or SRAM 01 = Reserved (Do not use) 10 = Reserved (Do not use) 11 = Sync. DRAM */
#define B6_Trcd 0x1 /* 3clk */
/*在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定 的延迟.S3C2440的FCLK最大的频率值为400Mhz,HCLK最大为133Mhz,PCLK最大为67Mhz。再查一下关于这些个时钟频率的使用就可以知道,内存方面,是由HCLK来控制的。那么经过简单的计算就可以知道,内存的一个时钟周期,最短为7.519ns(1s/133M)。再看一下K4S561632E-UC75的数据手册,关于Trcd的值的描述,K4S561632E-UC75的内存,这个值,最少需要20ns。如果 Trcd为2clk,则时间不够,差一点儿,所以只能填3clk。如果最短的时间都能满足,那么当内存工作在比133Mhz低的情况下,就更能满足了,所以这里的Trcd为3clk。
*/
#define B6_SCAN 0x1 /* 9bit */
/* K4S561632H的内存地址的Column Address为(CA0 ~ CA8),即9bit,所以值为0x1,对应64M SDRAM。
K4S511632H的内存地址的Column Address为(CA0 ~ CA9),即10bit,所以值为0x2,对应128M SDRAM。*/
#define B7_MT 0x3 /* SDRAM */
#define B7_Trcd 0x1 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */
/* REFRESH parameter */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
/* SDRAM Refresh Mode 0 = CBR/Auto Refresh 1 = Self Refresh In self-refresh time, the SDRAM control signals are driven to the appropriate level. */
#define Trc 0x3 /* 7clk */
#define Tchr 0x2 /* 3clk */
#if defined(CONFIG_S3C2440)
#define Trp 0x2 /* 4clk */
#define REFCNT 1012
#else
#define Trp 0x0 /* 2clk */
#define REFCNT 1269
/* 根据HCLK设置SDRAM的刷新参数,主要有REFCNT寄存器。由于我所用的开发板的HCLK设置为100Mhz,根据SDRAM芯片(K4S561632数据手册上注:64ms refresh period (8K Cycle))的参数计算REFCNT寄存器的值。计算公式如下:R_CNT=2^11+1-SDRAM时钟频率(MHz)*SDRAM刷新周期(us)*/
#endif
u-boot的include/configs/hfrk2440.h
/*-----------------------------------------------------------------------
* Physical Memory Map
*/
#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
/* 它是由nGCS确定,两片SDRAM的CS都接到了nGCS0上 */
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
/* SDRAM的物理基地址,blank6的地址就是0x30000000 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
/* SDRAM的大小,根据板子硬件配置,如果是128M,则应该是0x08000000 */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
/*-----------------------------------------------------------------------*/
相关参考http://hi.baidu.com/%B6%C5%BD%F0%CA%F7/blog/item/9fae0b2f68175b2b359bf733.html
http://blog.csdn.net/atower_boy/article/details/6290817
posted on 2012-07-16 16:45 crazy_code1990 阅读(1811) 评论(0) 编辑 收藏 举报