首先遇到频率的问题。开发板的输入时钟频率是16.9344M,所以要将配置头文件中的CONFIG_SYS_CLK_FREQ改为16934400。Datasheet 中有一张表,MDIV=110,PDIV=3,SDIV=1,对应的MPLL=399.65M,那么计算出来的MPLLCON的值是0x6E031;MDIV=60,PDIV=4,SDIV=2,对应的UPLL=47.98M,计算出来的UPLLCON的值是0x3C042。(实际应该要用示波器去测量这两个频率的,但是这个我不是很专业,我也没有示波器)。在start.s中,需要设置CLKDIVN的值。根据MPLL的值,HCLK=FCLK/3(SDRAM的频率是100~133MHz),PCLK=HCLK/2 ,所以CLKDIVN=7。
lowlevel_init.s是用来初始化内存控制器的。这里要设置每一个BANK的值。我暂时直接使用开发板u-boot中的参数,但是发现有问题。使用JTAG调试,发现填充寄存器的时候有问题。再一分析,发现代码在计算数据基地址的时候有问题,现在简单分析一下,代码如下:
ldr r0, =SMRDATA // 将SMRDATA相对地址读入r0,注意是相对地址
ldr r1, _TEXT_BASE // _TEXT_BASE 是一个标号,
// 而TEXT_BASE是一个常量。此时r1=TEXT_BASE
sub r0, r0, r1 // r0 = r0 - r1 ???
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
这段代码似乎是准备求出一个偏移值,然后根据基地址计算寄存器数据所在的地址。但是实际上,ldr r0, =SMRDATA直接就载入了数据的基地址。这里用的是相对地址,这种用法在后面的从Flash中拷贝代码到RAM中去的时候还有用到。所以,这段代码有3条语句是多于的。另外,在今天看到Datasheet中介绍,当代码在SDRAM中运行时,绝不能重新配置MRSR的值。所以用JTAG调试的时候,不能执行lowlevel_init,否则会产生异常,导致2440重启。在Debug的时候,可以直接跳过,也可以加代码判断是否在RAM中运行。关于调试,另外撰文说明。lowlevel_init的功能是比较重要的,计划另外再做分析。