第四章之S5PV210内存初始化
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内存初始化的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第四章:Direct 3D初始化 学习目标 对Direct 3D编程在 ...
- 三星S5-PV210内存初始化
一.S5PV210时钟系统 时钟:一定频率的电信号. 时钟系统:基于CMOS工艺的高性能处理器时钟系统,集成PLL可以从内部触发,比从外部触发更快且更准确,能有效地避免一些与信号完整性相关的问题. ...
- 第三章之S5PV210串口初始化
1,在start.S中执行373行b lowlevel_init跳转到/board/samsung/goni/lowlevel.S中,此代码中初始化一样硬件. 找到241行,此行执行URAT初始化,如 ...
- Linux内存初始化(四) 创建系统内存地址映射
一.前言 经过内存初始化代码分析(一)和内存初始化代码分析(二)的过渡,我们终于来到了内存初始化的核心部分:paging_init.当然本文不能全部解析完该函数(那需要的篇幅太长了),我们只关注创建系 ...
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [转]Windows Shell 编程 第四章 【来源 http://blog.csdn.net/wangqiulin123456/article/details/7987933】
第四章 文件的本质 以前,所有文件和目录都有一个确定的属性集:时间,日期,尺寸,以及表示‘只读的’,‘隐藏的,‘存档的’,或‘系统的’状态标志.然而,Windos95(及后来的WindowsNT4.0 ...
- JS复习:第三章&第四章
第三章 一.把一个值转换成字符串的两种方法: 1.使用每个值都有的toString( )方法.这个方法唯一要做的就是返回相应值的字符串表现.例如: var age = 11 ; var ageAsSt ...
- OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围
OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章) 所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符. ...
- java并发编程的艺术——第四章总结
第四章并发编程基础 4.1线程简介 4.2启动与终止线程 4.3线程间通信 4.4线程应用实例 java语言是内置对多线程支持的. 为什么使用多线程: 首先线程是操作系统最小的调度单元,多核心.多个线 ...
随机推荐
- java 基础 1 final关键字
1. final关键字 数据:声明数据为常量,对于基本类型final使数值不变,对于引用类型final使引用不变,但引用所指向的值是可以改变的,例如 final StringBuffer ...
- Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动、停止、重新启动
Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动.停止.重新启动 能够通过"netstat ...
- JS日历控件 灵活设置: 精确的时分秒.
在今年7月份时候 写了一篇关于 "JS日历控件" 的文章 , 当时仅仅支持 年月日 的日历控件,如今优化例如以下: 1. 在原基础上 支持 yyyy-mm-dd 的年月 ...
- 基于FFMPEG SDK流媒体开发1---解码媒体文件流信息
近期项目涉及到流媒体等开发,因为有过开发经验深知其难度所在,没办法仅仅能又一次拾起,最新版的SDK被改的一塌糊涂,只是大体的开发思路都是一样的,看多少书查多少资料都无用,一步一步的编写代码 才是学好的 ...
- Codevs 2006=BZOJ 2964 Boss单挑战
2964: Boss单挑战 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 266 Solved: 120[Submit][Status][Discu ...
- java8--IO工具类(java疯狂讲义3复习笔记)
Paths类 public static void pathTest(){ Path path = Paths.get("~"); System.out.println(path) ...
- caioj1271&&poj3071: 概率期望值2:足球
见到网上的大佬们都用了位运算..表示看不懂就自己想了,还挺好想的(然而我不会告诉你我因为p的数组问题卡了半小时顺便D了ZZZ大佬的数据) DP方程(伪)就是:第t轮第i个队晋级的可能=第t-1轮第i个 ...
- YTU 2914: xiaoping学构造函数
2914: xiaoping学构造函数 时间限制: 1 Sec 内存限制: 128 MB 提交: 148 解决: 90 题目描述 xiaoping刚接触类的构造和析构函数,对于构造函数的编写比较困 ...
- Java中去除字符串中的所有空格
JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); ...
- BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论
BZOJ_3105_[cqoi2013]新Nim游戏_线性基+博弈论 Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作 ...