uboot移植之修改支持SDRAM篇4

uboot移植之前期准备篇1

uboot移植之init_sequence_f函数数组分析(番外篇)

uboot移植之Makefile分析概述篇2

uboot移植之源码流程分析篇3(超详细!)

uboot移植之修改支持NorFlash篇5

uboot移植之修改支持NandFlash识别篇6(超详细)


查看电路图,不难看出SDRAM、Nor Flash、DM9000都是内存类的接口,即芯片引脚即连接数据DATA线,也连接地址ADDR线。当CPU发出地址访问时,内存控制器会根据地址范围,拉低对应bank设备的片选引脚,从而与该芯片通信,地址就可以直接发到对应的内存接口类芯片(通过ADDR线),或者对应的控制器中。所以,若要支持SDRAM,正确无误地设置好内存控制器中的寄存器是必不可少的。

由于2016.07版本编译出来的uboot有500多Kb,单单用oflash烧写很慢,为了提高烧写速度,先把U-Boot 1.1.6 (194kb)拷贝到开发板的SDRAM中,然后在uboot菜单中通过命令把SDRAM中新版的uboot烧入Nor Flash的0地址。再复位测试。(因为当进入uboot菜单功能的时候,程序已经重定位成功,并且绝对跳转到sdram中执行了,而sdram底端存放的gd_t结构体也重定位好了,所以此时修改nor并不会影响程序执行)。下面我们按着这个思路来先去测试官网未经修改的uboot是否能够使用:

①window cmd:oflash u-boot.bin (将旧版U-Boot 1.1.6烧到Nor,Nor大小为2M)

②因为新版uboot大小为532906 byte,为了方便,擦除0x90000的大小足够了,在U-Boot 1.1.6的启动菜单中执行命令:

③复位后,运行新版uboot发现并没有任何输出,打开用OPENJTAG软件封装好的gdb调试工具,测试一下现在的情况:

在bl  _main (0x744)之前,根据源码的意思SDRAM应该已经在 lowlevel_init 里初始化完毕了,但是实际上SDRAM并不能写入,至少可以确定sdram初始化失败了。而且,结合在 uboot移植之源码流程分析篇3(超详细!) 中的源码分析,可以知道,主要是时钟方面和sdram的相关寄存器配置出了问题。先屏蔽掉在init_sequence_f数组中调用board_early_init_f来初始化MPLL的部分代码:

再修改arch\arm\cpu\arm920t\start.S初始化时钟代码如下:

mrc,mcr指令用于协处理器寄存器和ARM寄存器的数据传输指令,mcr    p15, 0, r1, c1, c0, 0  是将ARM处理寄存器r1中的数据传送给协处理器p15的寄存器的c1,c0中。0代表协处理器操作码,表示协处理器将要执行的操作。根据芯片手册意思,我们应该判断HDIVN是否为0。如果HDIVN不是0,则必须使用以下指令将CPU总线模式从快速总线模式更改为异步总线模式(s3c2440不支持同步总线模式)。如果不HDIVN是0并且CPU总线模式是快速总线模式,则CPU时钟将改为HCLK提供。此功能可用于在不影响HCLK和PCLK的情况下将CPU频率更改为一半或更多。
 

MPLL的计算方式亦可以通过翻译手册得知:

MPLL(Fclk) = 2*(MDIV+8)*(Fin) / ((PDIV+2) * 2^SDIV) 

                    = 2*(92+8)*(12) / ((1+2) * 2^1)  

                    = 400

之所以设置Fclk时钟为400Mhz,分频系数为FCLK:HCLK:PCLK = 1:4:8。只是因为刚好有100Mhz(HCLK)时候SDRAM的refresh寄存器的设置方式,该寄存器 bit[10:0] 的设置依赖于sdram的时钟频率。

刷新周期可以在对应的sdram手册中找到并计算出为7.8125us,所以:

Refresh count = 2^11 + 1 - SDRAM时钟频率(MHz) * SDRAM刷新周期(us)

除此之外,还要设置:BWSCON、BANKCONn(n:0~7)、REFRESH、BANKSIZE、MPSRBn(n:6~7)。关于更详细的设置情况可以翻阅参考资料中的文献。最后修改board\samsung\smdk2440\lowlevel_init.S的代码,这些值最终会通过代码,写到对应的SDRAM寄存器中。

做好了以上几点之后,将修改过的文件start.S、lowlevel_init.S、smdk2440.c传到ubuntu的对应目录覆盖文件。重新make,再次测试是否SDRAM可读可写:

运行新版uboot,已经可以自动进入菜单,并且处理输入的命令,并且FCLK:HCLK:PCLK = 1:4:8,正好符合我们的分析,但是从输出信息也可以看出Flash相关的代码存在问题,识别出来的大小为0。

参考资料:

《ARM9嵌入式系统设计与应用开发》 熊茂华 杨震伦 主编

《汇编语言程序设计——基于ARM体系结构》 文全刚 赫志刚 主编

《嵌入式Linux应用开发完全手册》 韦东山著

《S3C2440A_UserManual_Rev13》

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值