我在看U-BOOT的lowlevel_init.S文件时看到以下代码:
lowlevel_init:
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
mov pc, lr
这段代码实现了U-BOOT的内存控制器部分的寄存器初始化,一共13个寄存器,对U-BOOT来最重要的就是SDRAM的初始化,显然没有这部分代码,当U-BOOT从NAND FLASH中启动的时候,START.S文件是无法完成代码的relocate的。因为SDRAM没初始化,用不了。
要理解这段代码主要是搞清楚LDR的两种用法。
ldr r0, =SMRDATA的作用是
让r0等于U-BOOT编译时已经确定下来的SMRDATA这块内存缓冲池的起始地址。
ldr r1, _TEXT_BASE的作用则是让r1等于_TEXT_BASE这个标号所在的内存里面的内容,也就是 TEXT_BASE。对于MINI2440开发板来说这个值等于 TEXT_BASE = 0x33F80000(boardsamsungmini2440config.mk)这个地址是
由于TEXT_BASE实际的地址现在应该是FLASH的0地址(或者内部4KSRAM的0地址),所以第三条指令 sub r0, r0, r1 ,实现了计算SMRDATA当前在arm地址空间里的实际访问地址。
接下去就是通过
ldr r3, [r0], #4 ;从r0这个地址里取一个32bit的数据,放到r3,并将r0+4,指向下一个内存池里的数据。
str r3, [r1], #4 ;这条指令实现了把r3里的数据赋值给r1所标示的地址。r1的地址通过下面这几句实现。以此配置完从0x48000000开始的CPU内部寄存器的值。这样SDRAM就开始工作了。以后就是正常访问0x30000000开始的地址空间了。
#define BWSCON 0x48000000
ldr r1, =BWSCON /* Bus Width Status Controller */
上面的这个配置代码是无法在将U-BOOT直接用OPENJTAG下载到OPENJTAG中时工作的。因为当下载到内存中的时候,SDRAM的地址是随机的,至少不是从0开始的,这样得到的SMRDATA所在的地址按上面的方式是得不到的,所以需要一条在运行时地址与位置无关的指令。这就是 adr指令。下面代码就是改进后的:
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, =lowlevel_init /*编译时确定的地址*/
sub r0, r0, r1 /* r0 = r0 -r1 , r0 = SMRDATA相对于lowlevel_init的偏移值 */
adr r3, lowlevel_init /*位置无关*/
add r0,r0,r3 /*r0 = r0 +r3 ,r0存放的是当前SMRDATA的实际地址*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
上一篇:uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。
下一篇:移植u-boot-2010.09到S3C2440(三)——判断NAND还是NOR启动的汇编代码
推荐阅读






推荐帖子
- IV转换放大电路
- 图中APD-130TC7-7F是光敏二极管,理论上来说光敏二极管经过光照应该是产生电流信号,按照运放的理论知识来看,图中V2和V1的电压应该是相等吧,可实际上这两点的电压并不相等,这是为什么。 IV转换放大电路
-
zhangjun7758520
模拟电子
- 国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?
- 国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?TI杯2019年全国大学生电子设计竞赛参考选题来投个票吧! 国赛题目出来了,参赛的小伙伴们选择好你的题目了吗?
-
okhxyyo
电子竞赛
- F2812求助
- 小弟在做毕业设计,急需一些利用F2812进行伺服控制方面的资料,有这方面资料的老师请给小弟发一下哈,谢谢!我的邮箱是mikelxz@163.com 这方面的资料一般在哪些网站能找到啊? F2812求助
-
wwp
微控制器 MCU
- wince5.0 eboot下载内核问题
- 因为板商提供的bootloader没有源码,所以想自己改一个,修改的基本差不多了, 但是在下载内核的时候,每次下载到52%的时候就会停下来,然后下载进度窗口就消失了。 这时候超级终端好像死机了一样,再重启开发板也没有信息输出。需要重启超级终端,断开重链也不行。 有时会出现一下提示: ERROR:Checksumfailure(expected=0x169980computed=0x1770E8) *******Checksumfailureonrecord108,
-
chenjianyong
WindowsCE
- 菜鸟上路的第二个作品,三路PWM
- --三个通道的PWM,d1,d2,d3分别显示出不同的亮度 libraryieee; USEieee.std_logic_1164.ALL; USEieee.std_logic_arith.ALL; USEieee.std_logic_unsigned.ALL; ENTITYMyPWMIS GENERIC(n:integer:=256); PORT ( clk:INstd_logic;--系统时钟
-
吴下阿蒙
FPGA/CPLD
- 移植uClibc库
- 现在2.4.27的内核和RAMDISK可以正常运行在AT91RM9200中,我交叉编译了一个简单测试程序 放到RAMDISK中,但是执行时却提示:NotFound! eg:ash>./bin/Test ash>./bin/Test:NotFound 路径是没问题的,属性也具有可执行.原因可能是我动态交叉编译造成的. 所以现在我想移植glibc到ARM平台中.但是不太清楚具体怎么操作. --->是不是下载glibc源代码后,根据其下的IN
-
kendy630314511
嵌入式系统
设计资源 培训 开发板 精华推荐
最新视频课程更多
- 没有标准的Sources文件 怎么看这个MAKEFILE文件 是怎么样生成.sys文件的 ?
- STM32入门篇之通用定时器彻底研究附带程序
- 【EEWORLD第三十九届】2012年06月社区明星人物揭晓!
- SDL_mixer-1.2.8 问题: /usr/lib/libSDL.so: could not read symbol: File in wrong for
- AD summer 库元件界面中的列名如何设置,怎么只有元件名和footprint呢?
- WINCE6.0的补丁包要怎么打?2006/2007/2008/2009必须一个个对应去打吗?每个月的跟每年累积的是什么关系?
- 关于开发基于wince4.2+evc4.0的access数据库应用程序问题。。。
- STM32 使用了 ARM的内核,这个内核,意法半导体需不需要再进行设计,10和5纳米不一样
- 本人arm linux 系统高手,给大家讲课。(每周六晚上8-9点)
- 赚分...