三星uboot1.1.6源码分析——start.s(4)——从NAND复制源码到RAM(3)

通过上两篇博客终于把从NAND复制源码到RAM的c语言写的部分说完了,现在回到start.s中,接着分析余下的代码。

-----------------------------------------------------------------------------------------------------------------

/*
 * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)
 * r0: size to be compared
 * Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size
 */
.globl copy_from_nand
copy_from_nand:
mov r10, lr/* save return address */


mov r9, r0
/* get ready to call C functions */
ldr sp, _TEXT_PHY_BASE/* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0/* no previous frame, so fp=0 */
mov r9, #0x1000
blcopy_uboot_to_ram  上一篇,我们分析到了这里。

-------------------------------------------------------------------------------------------------------


3: tst r0, #0x0   根据下面的用法,这句汇编就没有任何用处了,根本就达不到检测目的。
bne copy_failed  

从上一篇的分析可以知道,copy_uboot_to_ram的返回值是0,即如果成功的话r0应该是0.这里就是进行判断,但我有一点不明的地方,我查了下tst指令,用法入下所示:

-------------------------------------------------------------------------------------------------------------

TST  测试指令
TST(Test)测试指令用于将一个寄存器的值和一个算术值进行比较,条件标志位
根据两个操作数做逻辑与后的结果设置。
1)指令的语法格式
TST{<cond>} <Rn>,<shifter_operand>
2)TST指令举例
TST 指令类似于CMP 指令,不产生放置到目的寄存器中的结果,而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用TST指令检查是否设置了特定的位。操作数1 是要测试的数据字,而操作数2是一个位掩码。经过测试后,如果匹配则设置Zero标志,否则清除它。与CMP指令一样,该指令不需要指定S后缀。
例子:
TST R0, #%1测试在R0 中是否设置了位0。

TST R1,#0x0F ;判断R1 的低4 位是否为0

TST 指令通常与EQ,NE条件码配合使用,当所有测试位均为0 时,EQ 有效,而只要有一个测试为不为0,则NE 有效.

------------------------------------------------------------------------------------------------------------


ldr r0, =0x0c000000
ldr r1, _TEXT_PHY_BASE

上面有定义:

_TEXT_PHY_BASE:
.word CFG_PHY_UBOOT_BASE

CFG_PHY_UBOOT_BASE为0x57e00000


1: ldr  r3, [r0], #4  
ldr r4, [r1], #4

--------------------------------------------------

可是这里的r0为什么是0x0c000000呢?这要从s3c6410的启动方式说起,当从NAND启动时,当从NAND启动时,会复制uboot源码前4K到内部RAM,内部SRAM 的地址范围是0x0C00_0000~0x0FFF_FFFF,但是实际存储仅4KB。该区域能被读和写,当NAND 闪存启动被选择时能映射。

------------------------------------------------------------------

LDR Rd,[Rn],#0x04 ; Rn的值用做传输数据的存储地址。在数据传送后,将偏移量0x04 与Rn相加,结果写回到Rn中。Rn不允许是R15

-----------------------------------------------------------------
teq r3, r4
bne compare_failed/* not matched */
subs r9, r9, #4    这里movr9, #0x1000这个是在上面被赋值的,即r9=4K,即这里要比较前4K的代码
bne 1b


4: mov  lr, r10 /* all is OK */
movpc, lr     成功就可以返回了


copy_failed:
nop /* copy from nand failed */
b copy_failed


compare_failed:
nop /* compare failed */
b compare_failed

到这里我们终于把从NAND赋值代码到RAM中的源码分析完了,从这里应该对从NAND启动,有了更加清晰的理解,而不再像以前那样,只是从理论上知道。

------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值