官方标准uboot2013移植7之DDR初始化

1.分析

1)cpu_init_crit函数成功初始化串口、时钟后,转入_main函数,函数在arch/arm/lib/crt0.S文件中。

2)在crt0.S中首先设置栈,将sp指向DDR中的栈地址;然后调用board_init_f函数进行板级初始化。函数在arch/arm/lib/board.c中。

3)在这个版本的uboot中,把以前uboot的第二阶段start_armboot函数分成了2部分:board_init_f和board_init_r。所以在这里就和以前版本的uboot接轨上了,推测board_init_f中肯定是做了板级初始化,board_init_r中进入了uboot的命令行。

4)分析到这里,在uboot2013.10版本中思路已经很清晰了:uboot的第二阶段就在crt0.S文件中,第二阶段的入口就是_main函数。第一阶段工作主要就是cpu_init_crit函数,所以我们要在cpu_init_crit函数中添加DDR初始化和uboot的重定位。

5)分析到这里,下一步工作方向就确定了。我们要先在cpu_init_crit函数中添加DDR初始化,然后在start.S中bl _main之前添加uboot的重定位,然后将bl _main改成ldr pc, __main(__main: .word _main)长跳转。然后在crt0.S中board_init_f后删除那些重定位代码,至此uboot的第二阶段就应该能启动起来了。后续的移植就是第二阶段了。

2.分析DDR初始化代码移植思路

1)如果本来uboot中有DDR初始化代码,那我们可以就着这些代码来修改。但是问题是这个uboot2013.10中根本没有DDR初始化,所以我们需要完全从头去另外添加DDR初始化代码。

2)我们的思路就是从三星版本的uboot中直接移植DDR初始化代码过来即可。三星版本的uboot中DDR初始化函数在cpu/s5pc11x/s5pc110/cpu_init.S文件中,直接将这个文件移植过来即可。复制到board/samsung/goni/目录中。

3.动手移植

1)添加cpu_init.S文件到uboot2013.10中。注意,这里的代码必须保证在前8kb内,所以必须和lowlevel_init.S文件一样的链接处理。主要是在board/samsung/goni/Makefile中和arch/arm/cpu/u-boot.lds文件中做修改添加。

 

2)添加头文件s5pc110.h到include目录下。

3)对cpu_init.S文件代码进行修整,把一些无用的代码去掉,把一些相关的条件编译人工处理一下。

#ifdef CONFIG_MCP_SINGLE  定义了,把没定义部分去掉。

#ifndef CONFIG_EVT1 定义了,把这段代码拿掉。

4)在SourceInsigt工程中添加入这两个文件。然后重新解析一遍。然后对新添加的代码进行分析修整,把里面一些明显的宏定义缺失给补上。

4.移植必要的宏定义

1)DDR配置参数,从三星版本的smdkv210single.h中复制到s5p_goni.h中。

2)s5pc110.h中进行修整。

#define DMC0_MEMCONFIG_0 0x20E01323     // MemConfig0      256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed

#define DMC0_MEMCONFIG_1 0x40F01323     // MemConfig1

#define DMC0_TIMINGA_REF    0x00000618     // TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4E)

#define DMC0_TIMING_ROW              0x28233287     // TimingRow for @200MHz

#define DMC0_TIMING_DATA   0x23240304     // TimingData CL=3

#define   DMC0_TIMING_PWR             0x09C80232    // TimingPower

#define   DMC1_MEMCONTROL          0x00202400     // MemControl      BL=4, 2 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off

#define DMC1_MEMCONFIG_0 0x40C01323    // MemConfig0      512MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed

#define DMC1_MEMCONFIG_1 0x00E01323     // MemConfig1

#define DMC1_TIMINGA_REF    0x00000618     // TimingAref 7.8us*133MHz=1038(0x40E), 100MHz=780(0x30C), 20MHz=156(0x9C), 10MHz=78(0x4

#define DMC1_TIMING_ROW              0x28233289     // TimingRow for @200MHz

#define DMC1_TIMING_DATA   0x23240304     // TimingData CL=3

#define   DMC1_TIMING_PWR             0x08280232     // TimingPower

5.代码同步、编译、再修整

6.添加调试信息,验证DDR初始化完成。

1)调试信息有LED点亮和串口输出两种。优先选用串口调试的方法。

2)在DDR初始化完成后,添加串口输出字符"K",这样启动时如果看到了"OK"就说明DDR已经被成功初始化了。

3)结果:看到了"OK"标志,说明DDR添加实验成功。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值