第四章之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语言是内置对多线程支持的. 为什么使用多线程: 首先线程是操作系统最小的调度单元,多核心.多个线 ...
随机推荐
- mysql查询今天,昨天,近7天,近30天,本月,上一月数据的SQL
原文:http://www.open-open.com/code/view/1423207309170 select * from ad_proTrack_t where to_days(crt_ti ...
- Jupyter Notebook 基本使用
Jupyter 官网 IPython Interactive Computing IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果.在浏览器的界面中 ...
- Angular团队公布路线图,并演示怎样与React Native集成
本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/06/angular-2-react-native-roadmap 前不久在旧 ...
- poj2481 Cows
Description Farmer John's cows have discovered that the clover growing along the ridge of the hill ( ...
- BC一周年B
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- ART虚拟机之Trace原理(转)
一.概述 Android 6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(Application Not Response,其中最终的一个环节便是向目标进程发送信 ...
- OUTPUT 子句
除了修改数据以外,一般不会希望修改语句后再做其他事情.也就是说,一般不会希望修改语句能够返回任何输出.然而,在有些场合下,能够从修改过的行中返回数据,这个功能可能也有一定的用处. 例如,考虑UPDAT ...
- HDU 1824 Let's go home (2-SAT判定)
Let's go home Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Redis和Memcache性能测试对比
Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache全面胜出,当然Redis也有自己的优点:比如数据持久化.支持更多的数据结构(Set List ZS ...
- 论持久战之PHPStorm Xdebug Remote 调试环境搭建(不依赖本地环境)
最近公司自己搭建了一个资源管理平台,哈哈,当然是我在github上找的,后台用PHP开发.个人觉得写得非常nice,web页面几乎模拟了真实OS,有兴趣的朋友下载部署体验https://github. ...