关于u-boot-1.1.6对S3C2440开发板内存初始化的研究(转)

来源:互联网 发布:网络营销推广群发软件 编辑:程序博客网 时间:2024/05/14 23:46

关于内存时序初始化的部分,我看了很长时间,这处卡着我的学习可能有一个多星期了,很郁闷。现在回想起来,自己卡在这块,主要的原因还是对S3C2440的手册研究得不够透彻,没有仔细看手册,导致好些个关键的地方都忽略过去了。

现在进入正题

首先说一说时钟频率,因为内存对时钟的频率也有要求,时钟频率对内存也有影响。

在对内存进行初始化之前,u-boot-1.1.6在start.S处对时钟频率进行了一个比例上的初始化,相关于语句如下:
 
 /* FCLK:HCLK:PCLK = 1:2:4 */

 /* default FCLK is 120 MHz ! */
 ldr r0, =CLKDIVN
 mov r1, #3

 str r1, [r0]

这个CLKDIVN寄存器就存放了FCLK,HCLK,PCLK三个不同时钟频率之间的关系。这个寄存器被设为了3,那么根据S3C2440手册的第7章的表,可以查到,UCLK=UPLL,HCLK=FCLK/2,PCLK=HCLK/2,即FCLK:HCLK:PCLK = 1:2:4。

那么这里有一个疑问,就是在被设置这个3值之前,这三个时钟的比例是什么呢?那么查一下CLKDIVN这个值的初始值表就知道,初始值是全0的,那么一查表,就是FCLK:HCLK:PCLK = 1:1:1。

还有一个问题,不知道大家注意了没有,就是上面的一个注释,default FCLK is 120 MHz。其实这句注释是有错误的。FCLK是提供给CPU使用的时钟,那么通过什么途径能确定这个FCLK在启动的时候,默认的频率就是120Mhz呢?

经过我对S3C2440手册第7章的仔细研究,发现手册中有这么一句话,翻译成中文大概的意思就是:大家都清楚,在开启电池与重起的过程中,PLL是不稳定的,所以这个时候,实际上是由Fin这个时钟代替了Mpll,给FCLK提供了时钟频率。一直到有软件重新设置PLLCON寄存器。

那么这里就很明白了,默认的FCLK是频率,是与Fin频率是一致的,直到有软件重新设置了PCCLON寄存器。如果这里Fin的频率是120Mhz,那么上面的这句注释就没有问题,那么这个Fin到底是多少呢?

我手里没有相应的设备来检测这个Fin的频率,但是我在第7章找到了一个名为PLL VALUE SELECTION TABLE的表。实际上,CPU的频率是由MPLL来生成的,那么MPLL又是由Fin、MDIV、PDIV、SDIV由一个公式算出来的。而且这里的值,又都有一个范围,并不是仅满足相应的公式就可以了的,为了减少大家计算的麻烦,所以这个表就给出了一个可供参考的,各个数值的大小的列表,也即推荐使用的值。

根据这个表,可以查到,当输出的时钟频率为405.00MHz的时候,Fin为12Mhz。我想这里的值,应该就是Fin的频率值,也即默认的FCLK的值。

支持我的猜测的就以下几个理由:

1.S3C2440的ARM920T核心,可以运行在200Mhz至533Mhz之间,但是400Mhz是其最稳定,又最快的一个结合点,所以一般就会把CPU的频率定到这个405Mhz的位置。

2.Fin的频率越低,所实现这个Fin的代价就最小,消耗的能量就最少。

根据这两个理由,没有理由不使用这组数值。

所以这里的默认的FCLK的值,应该为12Mhz,并不是120Mhz,可能是作者写错了。

在这里,我还要鄙视卖我开发板的这个公司,这个公司在国内做得也比较大,技术人员老全国各地到处跑,但当我问到他们板子上相关技术问题的时候,从来没有给我满意的答复,这次也是。关于这个Fin的频率,我查过不少资料,终于发现这个频率,应该是在S3C2440板子上的那个钮扣电池及其相应的电路来提供的。当我咨询他们的技术支持QQ关于此电池提供时钟的具体值与作用时,告诉我给他们发邮件询问此事,技术人员出差了。然而,我的邮件,他们一个星期都没有回。然后我又咨询他们的QQ,他们只说这是提供实时时钟的,别无其它用处,但当我问其具体的频率值时,则不回答我仍何问题了,这个态度跟我当时买开发板的时,那简直是一个天上,一个地下。我也活该,谁叫我当时一点儿也不懂呢。

现在想想国内这些个公司啊,很可能这些个硬件都是超葫芦画瓢,直接抄的国外的板子,自己根本就没有相应的技术开发与储备,唉。

这是关于FCLK、HCLK、PCLK的相关的说明,下面说说内存的时序

在u-boot-1.1.6里面,内存的时序设置,是在lowlevel_init.S中来进行的。我的板子提供的内存型号是K4S561632H-UC75,这里再鄙视一下这个公司,给我提供的文档里,告诉我内存的型号是K4S561632E-UC75,搞得我一开始找内存的数据手册都找错了。

根据S3C2440手册中第5章内存控制的说明,可以看出,咱们的内存是被映射在了0x30000000-0x40000000的位置,即bank6与bank7。那么在内存时序设置的时候,主要关心的,就是bank6与bank7。当然,bank0也是需要关注的,因为它是启动时,启动程序存放的位置。但是bank0是由OM[1:0],即板子上的那几个小开关中的两个来控制的,所以这里程序上是不用管它的。

这里有一点需要说明一下,因为我还没有看到u-boot-1.1.6后面的内容,所以不知道对bank1-bank5的初始化,对板子有什么样的影响,所以这一块暂时不做说明,主要说明一下对bank6与bank7的时序初始化。

在S3C2440手册上,对bank6与bank7的描述,当MT的值为0x3(11bin)的时候,表示使用的是SDRAM,所以B6_MT与B7_MT的值为0x3。

当bank6与bank7为SDRAM的时候,那么就只需要设置Trcd与SCAN的值。

那么Trcd的0x1,即3clk是怎么来的呢?

咱们先看一下S3C2440的手册的第27章,FCLK最大的频率值为400Mhz,HCLK最大为133Mhz,PCLK最大为67Mhz。再查一下关于这些个时钟频率的使用就可以知道,内存方面,是由HCLK来控制的。那么经过简单的计算就可以知道,内存的一个时钟周期,最短为7.519ns。再看一下K4S561632E-UC75的数据手册,关于Trcd的值的描述,K4S561632E-UC75的内存,这个值,最少需要20ns。如果Trcd为2clk,则时间不够,差一点儿,所以只能填3clk。如果最短的时间都能满足,那么当内存工作在比133Mhz低的情况下,就更能满足了,所以这里的Trcd为3clk。

另外插一句,当FCLK工作在400Mhz的时候,HCLK工作在133Mhz的时候,它们之间的比例,绝对不会是1:2(如果是1:2,我不知道是烧板子呢,还是工作不稳定,没有试过,也不敢试)。所以我想,在u-boot-1.1.6的后面,肯定还有地方对CLKDIVN进行重新设置,如果不设置成合适的比例,很可能会出现问题。

还有一个值,SCAN怎么确定的呢?

我们查一下关于K4S561632E-UC75的手册就知道,这个型号的内存,地址组织形式为16M x 16,再查一下PIN FUNCTION DESCRIPTION这个表就可以知道,这个形式的内存地址的Column Address为(CA0 ~ CA8),即9bit,所以值为0x1。

到此为止,SDRAM的内存就被正确初始化了。

因为我在这里,花了非常多的时间,为了后面的人能减少研究的时间,特意把这块提前写出来,将来我把所有的u-boot-1.1.6的源码都分析完了,在详细源码分析里,这些内容,也都会在相应的代码注释里体现出来。现在时间越来越紧,

不知道什么时候能完成这个工作。

原创粉丝点击