1,既然UART可以打印出信息来,那我们可以打印内存中的值。在506行添加如下代码:

     /***UART transmit function by xu ***/
display_addr_dat: ldr r0,[r0] ldr r1,=0xE2900020 ldr r2,=0x30
str r2,[r1] @UTXH0='' ldr r2,=0x78
str r2,[r1] @UTXH0='x' ldr r3,= display_loop_count:
lsr r2,r0,r3 @logical shift right bit
and r2,r2,#0xF cmp r2,# @cmp r2 is mi or pl
addmi r2,r2,#0x30 @r2 is ----
addpl r2,r2,#0x37 @r2 is A----F
str r2,[r1] sub r3,r3,#
cmp r3,#
bpl display_loop_count ldr r2,=0xa
str r2,[r1] @UTXH0='\r' ldr r2,=0xd
str r2,[r1] @UTXH0='\n' mov pc, lr

如图:

2,这样我们可以进行测试,在216行,进行添加执行代码,如图:

我们通过手册查询可以得知内存地址oxE000_0000的值为0x43110020。那么重新编译和烧写一下u-boot.bin,看看串口输

出的信息与我们查询的值是否相同。

3,接一下来,我们来自己编写板子的内存初始化代码,可以根据厂家的光盘中裸机代码/src/cdram/memory.S中的代码做相应的

更改。代码如下:

 /*** ddrmem initialze by xu***/
.globl ddrmem_init
ddrmem_init: #define ELFIN_GPIO_BASE 0xE0200000
#define APB_DMC_0_BASE 0xF0000000
#define DMC_CONCONTROL 0x00
#define DMC_MEMCONTROL 0x04
#define DMC_MEMCONFIG0 0x08
#define DMC_DIRECTCMD 0x10
#define DMC_PRECHCONFIG 0x14
#define DMC_PHYCONTROL0 0x18
#define DMC_PHYCONTROL1 0x1C
#define DMC_RESERVED 0x20
#define DMC_PWRDNCONFIG 0x28
#define DMC_TIMINGAREF 0x30
#define DMC_TIMINGROW 0x34
#define DMC_TIMINGDATA 0x38
#define DMC_TIMINGPOWER 0x3C
#define DMC_PHYSTATUS 0x40
#define DMC_CHIP0STATUS 0x48
#define DMC_AREFSTATUS 0x50
#define DMC_MRSTATUS 0x54
#define DMC_PHYTEST0 0x58
//初始化PHY DLL
ldr r0, =APB_DMC_0_BASE
//step 2 set PhyControl0.ctrl_start_point PhyControl0.ctrl_inc PhyControl0.ctrl_dll_on bit field to 1
ldr r1, =0x0010100A
str r1, [r0,#DMC_PHYCONTROL0] //step 3 set PhyControl1.ctrl_shiftc PhyControl1.ctrl_ctrl_offsetc
ldr r1, =0x00000086
str r1, [r0,#DMC_PHYCONTROL1] //step 4 set PhyControl0.ctrl_start bit-field to 1 DLL on
ldr r1, =0x0010100B
str r1, [r0,#DMC_PHYCONTROL0] find_lock_val:
//step 11 loop until DLL is locked
ldr r1, [r0,#DMC_PHYSTATUS]
and r2, r1,#0x7
cmp r2, #0x7
bne find_lock_val //setp 12 Force value looking
and r1, #0x3fc0
mov r2, r1, LSL #
orr r2, r2, #0x100000
orr r2, r2, #0x1000
orr r1, r2, #0xB
str r1, [r0,#DMC_PHYCONTROL0] //初始化DMC0
//step 5 set ConControl
ldr r1, =0x0FFF1010
str r1, [r0,#DMC_CONCONTROL] //step 6 set MemControl
ldr r1, =0x00202400
str r1, [r0,#DMC_MEMCONTROL] //step 7 set MemConfig0 512M config,8 banks
ldr r1, =0x20E00323
str r1, [r0,#DMC_MEMCONFIG0] //step 8/1 set PrechConfig
ldr r1, =0xFF000000
str r1, [r0,#DMC_PRECHCONFIG] //step 9/1 set TimingAref t_refi=7.5us * 133MHz=1038(0x40E)
ldr r1, =0x0000040E
str r1, [r0,#DMC_TIMINGAREF]
//step 9/2 set TimingRow tRAS=45ns tRC=60ns tRCD=15ns tRP=15ns tRRD=7.5ns tRFC=127.5ns
ldr r1, =0x11122206
str r1, [r0,#DMC_TIMINGROW]
//step 9/3 set TimingData tWTR=7.5ns tWR=15ns tRTP=7.5ns cl=4
ldr r1, =0x12140000
str r1, [r0,#DMC_TIMINGDATA]
//step 9/4 set TimingPower t_mrd>=tMRD=2nCK t_cke<=tCKE=3nCK t_xp>=tXP=2nCK tXSRD=200ns tFAW=35ns
ldr r1, =0x05DC0343
str r1, [r0,#DMC_TIMINGPOWER] //初始化DDR2 DRAM
//step 14 lssue a "NOP" for DirectCmd and hold CKE to high level
ldr r1, =0x07000000
str r1, [r0,#DMC_DIRECTCMD] //step 16 lssue a "PALL" for DirectCmd
ldr r1, =0x01000000
str r1, [r0,#DMC_DIRECTCMD] //step 17 lssue an "EMRS2" for DirectCmd
ldr r1, =0x00020000
str r1, [r0,#DMC_DIRECTCMD] //step 18 lssue an "EMRS3" for DirectCmd
ldr r1, =0x00030000
str r1, [r0,#DMC_DIRECTCMD] //step 19 lssue an "EMRS" for DirectCmd and enable DLLs enable DQS
ldr r1, =0x00010000
str r1, [r0,#DMC_DIRECTCMD] //step 20 lssue a "MRS" for DirectCmd and reset DLL
ldr r1, =0x00000542
str r1, [r0,#DMC_DIRECTCMD] //step 21 lssue a "PALL" for DirectCmd
ldr r1, =0x01000000
str r1, [r0,#DMC_DIRECTCMD] //step 22 lssue two "Auto Refresh" for DirectCmd
ldr r1, =0x05000000
str r1,[r0,#DMC_DIRECTCMD] ldr r1, =0x05000000
str r1,[r0,#DMC_DIRECTCMD] //step 23 lssue a "MRS" for DirectCmd and without reseting DLL
ldr r1, =0x00000442
str r1, [r0,#DMC_DIRECTCMD] //step 25 lssue an "EMRS" for DirectCmd set OCD Calibration Default and exit OCD Calibration
ldr r1, =0x00010380
str r1, [r0,#DMC_DIRECTCMD] ldr r1, =0x00010000
str r1, [r0,#DMC_DIRECTCMD] //step 27 set ConControl and turn on "auot refresh"
ldr r1, =0x0FF01030
str r1, [r0,#DMC_CONCONTROL] //step 8/2 set PwrdnConfig
ldr r1, =0xFFFF00FF
str r1, [r0,#DMC_PWRDNCONFIG] //step 28 IF power down modes is required set MemControl
ldr r1, =0x00202400
str r1, [r0,#DMC_MEMCONTROL] //putout URAT char "DDR IS OK!"
ldr r0, =0xE2900020
ldr r1, =0x44 @UTH='D'
str r1, [r0] ldr r1, =0x44
str r1, [r0] @UTH='D' ldr r1, =0x52
str r1, [r0] @UTH='R' ldr r1, =0x20
str r1, [r0] @UTH=' ' ldr r1, =0x49
str r1, [r0] @UTH='I' ldr r1, =0x53
str r1, [r0] @UTH='S' ldr r1, =0x20
str r1, [r0] @UTH=' ' ldr r1, =0x4f
str r1, [r0] @UTH='O' ldr r1, =0x4b
str r1, [r0] @UTH='K' ldr r1, =0x21
str r1, [r0] @UTH='!' ldr r1, =0xa
str r1, [r0] @UTXH0='\r' ldr r1, =0xd
str r1, [r0] @UTXH0='\n' mov pc, lr

4,在UART执行代码下面添加内存初始化执行代码220-221行。如图:

5,内存初始化完成,但是我们不知道内存初始化是否正确,这就需要验证。通过内存读取数据代码来进行验证222行-225行。如图所示:

6,然后,进行make,烧写u-boot.bin.然后可以看到串口输出信息中,输出与我们输入相同的内存地址的值

最新文章

  1. ABP模块化
  2. ANDROID 系统提示对话框(ALERTDIALOG)的使用
  3. 优秀的 HTML5 实战教程,提升你的综合开发能力
  4. jQuery实现长按按钮触发事件的方法
  5. HMTL—表单
  6. Linux系统编程(8)—— 进程之进程控制函数fork
  7. 使用ownCloud在Linux安装你的个人云服务
  8. 【转】Android实现推送方式解决方案
  9. QTP知识总结(一)
  10. python语言中的AOP利器:装饰器
  11. Fragment与Activity的接口回调
  12. enex 转 md 格式的几种方式(免费版/氪金版)
  13. PS绘制飘逸彩色丝带教程
  14. VNPY 文件目录结构
  15. Layer弹出层销毁问题
  16. ERROR 1044 (42000): Access denied for user 'root'@'localhost'
  17. Android中使用第三方jar包
  18. 源码安装svn 1.8.9
  19. awk调用shell
  20. adb命令查看app的日志

热门文章

  1. [Bzoj2039]小Z的袜子 (莫队算法模板题)
  2. django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务
  3. ffm算法
  4. vue :src 文件路径错误
  5. Android开发——本地验证码的简易实现
  6. RGB中的颜色的设置
  7. 配置pydot环境
  8. MySQL InnoDB类型数据库的恢复
  9. 实现@using{}代码块
  10. hibernate could not resolve property