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.然后可以看到串口输出信息中,输出与我们输入相同的内存地址的值

第四章之S5PV210内存初始化的更多相关文章

  1. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...

  2. 三星S5-PV210内存初始化

    一.S5PV210时钟系统 时钟:一定频率的电信号.   时钟系统:基于CMOS工艺的高性能处理器时钟系统,集成PLL可以从内部触发,比从外部触发更快且更准确,能有效地避免一些与信号完整性相关的问题. ...

  3. 第三章之S5PV210串口初始化

    1,在start.S中执行373行b lowlevel_init跳转到/board/samsung/goni/lowlevel.S中,此代码中初始化一样硬件. 找到241行,此行执行URAT初始化,如 ...

  4. Linux内存初始化(四) 创建系统内存地址映射

    一.前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init.当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系 ...

  5. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】

    第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...

  7. JS复习:第三章&第四章

    第三章 一.把一个值转换成字符串的两种方法: 1.使用每个值都有的toString( )方法.这个方法唯一要做的就是返回相应值的字符串表现.例如: var age = 11 ; var ageAsSt ...

  8. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围

    OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)   所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符. ...

  9. java并发编程的艺术——第四章总结

    第四章并发编程基础 4.1线程简介 4.2启动与终止线程 4.3线程间通信 4.4线程应用实例 java语言是内置对多线程支持的. 为什么使用多线程: 首先线程是操作系统最小的调度单元,多核心.多个线 ...

随机推荐

  1. Linux查看日志三种命令(转载)

    第一种:查看实时变化的日志(比较吃内存) 最常用的: tail -f filename (默认最后10行,相当于增加参数 -n 10) Ctrl+c 是退出tail命令 其他情况: tail -n 2 ...

  2. Spring实战Day2

    创建对象之后如何体现对象之间的依赖? Spring容器负责创建Bean和依赖注入,那么Spring是怎么将Bean装配在一起的呢? Spring提供了三种方式装配机制 1.隐式的bean发现机制和自动 ...

  3. Maven查看依赖树

    1.命令行,但是只能查看一层的引用 mvn dependency:tree 如图所示: 2.使用Eclipse的Dependency Hierarchy查看,这个就比较深层次的查看,如图所示: 3.使 ...

  4. xml解析工具mashaller javaee自带解析类

    1.怎样去掉Marshaller的格式化? : JAXBContext context = JAXBContext.newInstance(Entity.class); Marshaller mars ...

  5. Exchanger使用

    Exchanger使用

  6. Solr 文章集成

    Solr 文章集成 solr原理 solr wiki: http://wiki.apache.org/solr/ 分布式全文检索系统SolrCloud简单介绍 http://my.oschina.ne ...

  7. struts2 java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

    xxx-validation.xml 文件里  java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-valid ...

  8. javascript闭包的应用

    我印象中,javascript的闭包属于进阶的范畴,无非是用来在面试中装装逼而已.你看我身边的一个小伙子,有一天我装逼地问他什么是javascript的闭包,他居然连听都没听说过.但他做起前端的东西来 ...

  9. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM(转载)

    http://www.cnblogs.com/indream/p/3602348.html 刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code ...

  10. 黑客常用WinAPI函数整理

    之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程.为了使读者对黑客常用的Windows API有个更全面的了解以及方便日后使用API方法的查询,特 ...