CONFIG_SYS_CLK_FREQ

首先遇到频率的问题。开发板的输入时钟频率是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的功能是比较重要的,计划另外再做分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值