第四章之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语言是内置对多线程支持的. 为什么使用多线程: 首先线程是操作系统最小的调度单元,多核心.多个线 ...
随机推荐
- 你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池
你创建线程池最好分为两种线程池,io密集型线程池,或者cpu密集型线程池. 否则,如果只用一个线程池的话,不管是iO密集的线程,或者cpu消耗大的都放在同一个线程池的话,会发生线程池被撑满的情况
- 随机森林、gbdt算法
http://blog.csdn.net/songzitea/article/details/10035757 http://blog.csdn.net/holybin/article/details ...
- [转]用AOP改善javascript代码
有时候,不光要低头写代码,也要学着站在更高的角度,来思考代码怎么写,下面这篇文章,讲的关于代码设计的问题,脑洞大开. 原文: http://www.alloyteam.com/2013/08/yong ...
- CentOS 更改Apache默认网站目录
http://www.osyunwei.com/archives/789.html引言:Apache默认的网站目录是在/var/www/html, 现在要把网站目录更改到/home/wwwroot/w ...
- HDU3459:Rubik 2×2×2(IDA)
Problem Description Sonny is probably the only computer science Ph.D. student who cannot solve a Rub ...
- MySQL Study之--MySQL用户及权限管理
MySQL Study之--MySQL用户及权限管理 MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...
- 解决cell切割线不是全屏问题
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { [_tableView setSeparatorInset:U ...
- HDU 1017 A Mathematical Curiosity【看懂题意+穷举法】
//2014.10.17 01:19 //题意: //先输入一个数N,然后分块输入,每块输入每次2个数,n,m,直到n,m同一时候为零时 //结束,当a和b满足题目要求时那么这对a和b就是一组 ...
- 百万级PHP网站Poppen.de的架构分享心得
在了解过世界最大的PHP站点,Facebook的后台技术后, 今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flick ...
- VUEX action解除页面耦合
最近项目中需要用到vue+vuex来实现登出跳转功能,老大指派任务要用action解除页面耦合,刚从vue深渊晕晕乎乎爬出来的我是一脸懵逼啊...啥是解除耦合...网上vuex的资料太少了,vuex手 ...