首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

U-boot启动分析 -arm(3)

U-boot启动分析 -arm(3)

reset:
   
    mrs   r0,cpsr
    bic   r0,r0,#0x1f //r0=r0 AND(!0x1f),屏蔽所有中断,为中断提供服务通常是OS的设备驱动的责任,在bootloader执行中不需要中断
    orr   r0,r0,#0xd3 //逻辑或
    msr   cpsr,r0    //svcmode

*设置cpu运行在SVC32模式。ARM共有7种模式:
* 用户模式(usr): arm处理器正常的程序执行状态
* 快速中断模式(fiq): 用于高速数据传输或通道处理
* 外部中断模式(irq): 用于通用的中断处理
* 超级保护模式(svc): 操作系统使用的保护模式
* 数据访问终止模式(abt): 当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
* 系统模式(sys): 运行具有特权的操作系统任务
* 未定义指令中止模式(und): 当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真
* 通过设置ARM的CPSR寄存器,让CPU运行在操作系统保护模式,为后面进行其它操作作好准备了。
*************************************************************************/

#if defined(CONFIG_S3C2400)
# define pWTCON      0x15300000
# define INTMSK      0x14400008  
# define CLKDIVN   0x14800014   
#elif defined(CONFIG_S3C2410)
# define pWTCON      0x53000000
# define INTMSK      0x4A000008  
# define INTSUBMSK   0x4A00001C
# define CLKDIVN   0x4C000014   
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
    ldr    r0,=pWTCON
    mov    r1,#0x0
    str    r1,[r0]    //各个硬件还未就绪,关闭看门狗
   
    mov   r1, #0xffffffff
    ldr   r0, =INTMSK
    str   r1, [r0]
# if defined(CONFIG_S3C2410)
    ldr   r1, =0x3ff
    ldr   r0, =INTSUBMSK
    str   r1, [r0]
# endif
   //FCLK用于CPU,HCLK用于AHB,PCLK用于APB
   
    ldr   r0, =CLKDIVN
    mov   r1, #3
    str   r1, [r0]
#endif   
   
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl   cpu_init_crit  //初始化CPU
#endif
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate:            
    adr   r0, _start      
stack_setup:
    ldr   r0, _TEXT_BASE      
    sub   r0, r0, #CFG_MALLOC_LEN  
    sub   r0, r0, #CFG_GBL_DATA_SIZE
#ifdef CONFIG_USE_IRQ
    sub   r0, r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif               
    sub   sp, r0, #12      
                  
clear_bss:
    ldr   r0, _bss_start      
    ldr   r1, _bss_end      
    mov    r2,#0x00000000      
clbss_l:str    r2,[r0]      
    add   r0, r0, #4
    cmp   r0, r1
    ble   clbss_l            

* 已经准备好了堆栈,就可跳到C写的代码里了,也就是
* 跳到内存中的/u-boot-1.1.4/board.c -->start_armboot中运行了
* 把_start_armboot地址处的值也就是start_armboot绝对地址值移到pc
* 于是跳到C代码。

    ldr   pc, _start_armboot
_start_armboot:    .wordstart_armboot

cpu_init_crit:
   
    mov   r0, #0
    mcr   p15, 0, r0, c7, c7, 0  

    mcr   p15, 0, r0, c8, c7, 0  


   
    mrc   p15, 0, r0, c1, c0,0  //将c1、c0的值写入到r0中
    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  //将设置好的r0值写入到协处理器p15的c1、c0中
   
    mov   ip, lr  //保存前一个跳转地址,防止下一个跳转将前一个lr地址覆盖
    bl   lowlevel_init//board/smdk2410/lowlevel_init.S:用于完成芯片存储器的初始化
    mov   lr, ip
    mov   pc, lr  //返回cpu_init_crit函数
2.Stage2:lib_arm/board.c
    此文件是u-bootStage2部分,入口为Stage1最后调用的start_armboot函数。注意上面最后ldr到pc的是_start_armboot这个地址,而非start_armboot变量。
   start_armboot是U-Boot执行的第一个C语言函数,完成如下工作:
1. 初始化MMU
2.初始化外部端口
3. 中断处理程序表初始化
4. 串口初始化
5. 其它部分初始化(可选)
6. 主程序循环
继承事业,薪火相传
返回列表