我在看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启动的汇编代码
推荐阅读最新更新时间:2024-11-11 13:15
推荐帖子
- 意法半导体发布全新STM32超值系列微控制器,32美分的价格及32位的性能
- 基于ARM®Cortex™-M0的STM32F030超值系列微控制器让成本敏感型应用受益于32位优势意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)发布最新的STM32F030超值系列微控制器。批量订货最低价仅为0.32美元,STM32F030是低预算项目的理想选择,同时还让设计人员有机会使用型号齐全且软硬件兼容的32位微控制器产品组合,从而提升应用性能,扩大产品系列。全新STM32F030超值
- wstt stm32/stm8
- 零点漂移现象及其产生的原因
- 一、零点漂移现象及其产生的原因零点漂移是指当放大电路输入信号为零时,由于受温度变化,电源电压不稳等因素的影响,使静态工作点发生变化,并被逐级放大和传输,导致电路输出端电压偏离原固定值而上下漂动的现象。显然,放大电路级数愈多、放大倍数愈大,输出端的漂移现象愈严重。严重时,有可能使输入的微弱信号湮没在漂移之中,无法分辩,从而达不到预期的传输效果,因此,提高放大倍数、降低零点漂移是直接耦合放大电路的主要矛盾。产生零点漂移的原因很多,如电源电压不稳、元器件参数变值、环境温度变化等。其中
- Jacktang 模拟与混合信号
- 新手请教pic单片机spi接口程序执行过程
- voidSPIEXCHANGE(count)//启动SPI传送intcount;{if(count0){//有数据可送?i=0;RE2=0;//片选位置低电平SSPBUF=a;//送数}else;//否则,空操作,并返回return;}//等待SPI传送完成
- csfcsf Microchip MCU
- 为什么LCD数据线上要加排阻?
- 如题为什么LCD数据线上要加排阻?加排阻有2个作用:滤波和防护ESD以前我的LCD数据线加的ESD+EMI器件,后来为了降低成本,我直接排阻。我的LCD和主板之间加了一段FPC,当把LCD直接接到主板上,不要那段fpc时,效果很不好,有很多像素颜色变了,加上FPC后反而会好很多,请问这是为什么呢?加排阻可以使信号上升时间变长,可以减小反射和高次谐波分量,对减小串扰和辐射有帮助引用3楼guetcw的回复:加排阻可以使信号上升时间变长,可以减小反射和高次谐波分量
- zpfst 嵌入式系统
- stm32最大败笔,未使用前有感--个人见解,欢迎拍砖
- 目前stm32得益于cortexm3内核,速度功耗比确实有质的飞跃,目前市场成品cortexm3方面属于速度最高(72MHz),性价比高,零售价格公道实惠。其外设功能几乎可以认为是积木化,同一样功能资源几乎都是独立的,在各大芯片制造商里可以说独树一帜。所以,只要一册参考资料在手,连芯片型号都不用就可动手了。可以说,stm32已经非常完美,TIMx是明显的遗憾,或许它更注重MOTOR应用,如果这样我无话可说。TIMx化很大力气,32位跟32位计数器及联,很大墓的就是为了实现6st
- 6666666 stm32/stm8
- 欢迎RF/无线版主
- 欢迎RF/无线版主欢迎RF/无线版主多谢站长的礼物,希望我们的社区红红火火。Re:欢迎RF/无线版主呵呵,共同努力Re:欢迎RF/无线版主
- yanmei RF/无线