start.s

uboot 启动流程:

 

设置cpu--》关闭看门狗--》屏蔽中断--》设置时钟频率--》设置堆栈--》清除bss段--》

 

设置cpu为svc32模式:

 

mrs r0,cpsr    //mrs:将cpsr中的内容读进r0中
bic r0,r0,#0x1f   //bic:bit clear,位清除命令,将r0与0x1f的反码相与,然后将结果读进r0中
orr r0,r0,#0xd3  //逻辑或操作,我本人理解为置1指令
msr cpsr,r0

 

该段指令通过设置cpsr中的cpu工作模式位来设定其工作模式,svc32是超级保护模式

关闭看门狗,中断,设置时钟频率

 

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)//注意一些符号:=,#,[]
ldr     r0, =pWTCON
mov     r1, #0x0                                        //mov:传送指令,将八位立即数或是寄存器中内容传进r1中
str     r1, [r0]                                             //将r1中的内容写到r0地址处

/*
  * mask all IRQs by setting all bits in the INTMR - default
  */
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif

/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */

 

如果是重启,执行下边部分,正常启动,则不执行

 

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif

跳转到下边部分,执行:清零cache,关闭mmu及caches,

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*
  * flush v4 I/D caches
  */
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */

/*
  * disable MMU stuff and caches
  */
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0

/*
  * before relocating, we have to setup RAM timing
  * because memory timing is board-dependend, you will
  * find a lowlevel_init.S in your board directory.
  */
mov ip, lr
bl lowlevel_init
mov lr, ip
mov pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

 

判断是否要重新加载uboot:判断r0与r1中的值是否相等,相等执行stack_setup,不等,执行下边的直到相等

 

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:    /* relocate U-Boot to RAM     */
adr r0, _start  /* r0 <- current position of code   */
ldr r1, _TEXT_BASE  /* test if we run from flash or RAM */
cmp     r0, r1                  /* don't reloc during debug         */
beq     stack_setup

ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2  /* r2 <- size of armboot            */
add r2, r0, r2  /* r2 <- source end address         */

copy_loop:
ldmia r0!, {r3-r10}  /* copy from source address [r0]    */
stmia r1!, {r3-r10}  /* copy to   target address [r1]    */
cmp r0, r2   /* until source end addreee [r2]    */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

 

设置堆栈

/* Set up the stack          */
stack_setup:
ldr r0, _TEXT_BASE  /* upper 128 KiB: relocated uboot   */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12  /* leave 3 words for abort-stack    */

clear_bss:
ldr r0, _bss_start  /* find start of bss segment        */
ldr r1, _bss_end  /* stop here                        */
mov  r2, #0x00000000  /* clear                            */

clbss_l:str r2, [r0]  /* clear loop...                    */
add r0, r0, #4
cmp r0, r1
ble clbss_l

 

进入step2:board.c

 

ldr pc, _start_armboot

_start_armboot: .word start_armboot

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值