u-boot启动代码start.S详解二

来源:百度文库 编辑:神马文学网 时间:2024/04/29 18:20:20
fff
 str     r1, [r0]

clear_bss:
        ldr       r0, _bss_start           //找到bss的起始地址
        add      r0, r0, #4              //从bss的第一个字开始
        ldr       r1, _bss_end           // bss末尾地址
        mov      r2, #0x00000000       //清零 

clbss_l:str        r2, [r0]                // bss段空间地址清零循环
        add     r0, r0, #4
        cmp     r0, r1
        bne      clbss_l

/***************** 关键的初始化子程序 ************************/
/ * cpu初始化关键寄存器
 * 设置重要寄存器
 * 设置内存时钟
* /
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

/******* 在重新定位前,我们要设置RAM的时间,因为内存时钟依赖开发板硬件的,你将会找到board目录底下的memsetup.S。**************/
 mov ip, lr
#ifndef CONFIG_S3C2440A_JTAG_BOOT
 bl memsetup        //调用memsetup子程序(在board/smdk2442memsetup.S)
#endif
 mov lr, ip
 mov pc, lr                        //子程序返回
 
memsetup:  
/**************** 初始化内存 **************/
        mov     r1, #MEM_CTL_BASE
        adrl    r2, mem_cfg_val
        add     r3, r1, #52
1:       ldr     r4, [r2], #4
        str     r4, [r1], #4
        cmp     r1, r3
        bne     1b

/*********** 跳转到原来进来的下一个指令(start.S文件里) ***************/ 
mov     pc, lr                 //子程序返回

/****************** 建立堆栈 *******************/
 ldr r0, _armboot_end               //armboot_end重定位
 add r0, r0, #CONFIG_STACKSIZE    //向下配置堆栈空间
 sub sp, r0, #12                  //为abort-stack预留个3字

/**************** 跳转到C代码去 **************/
 ldr pc, _start_armboot           //跳转到start_armboot函数入口,start_armboot
字保存函数入口指针
_start_armboot: .word start_armboot    //start_armboot函数在lib_arm/board.c中实现
从此进入第二阶段C语言代码部分

/**************** 异常处理程序 *******************/
 .align  5
undefined_instruction:               //未定义指令
 get_bad_stack
 bad_save_user_regs
 bl  do_undefined_instruction

 .align 5
software_interrupt:                   //软件中断
 get_bad_stack
 bad_save_user_regs
 bl  do_software_interrupt

 .align 5
prefetch_abort:                      //预取异常中止
 get_bad_stack
 bad_save_user_regs
 bl  do_prefetch_abort

 .align 5
data_abort:                          //数据异常中止
 get_bad_stack
 bad_save_user_regs
 bl  do_data_abort

 .align 5
not_used:                            //未利用
 get_bad_stack
 bad_save_user_regs
 bl  do_not_used

 .align 5
irq:                                   //中断请求
 get_irq_stack
 irq_save_user_regs
 bl  do_irq
 irq_restore_user_regs

 .align 5
fiq:                                   //快速中断请求
 get_fiq_stack
 /* someone ought to write a more effiction fiq_save_user_regs */
 irq_save_user_regs
 bl  do_fiq
 irq_restore_user_regs

sleep_setting:                           //休眠设置
@ prepare the SDRAM self-refresh mode
 ldr r0, =0x48000024 @ REFRESH Register
 ldr r1, [r0]
 orr r1, r1,#(1<<22) @ self-refresh bit set

@ prepare MISCCR[19:17]=111b to make SDRAM signals(SCLK0,SCLK1,SCKE) protected
 ldr r2,=0x56000080 @ MISCCR Register
 ldr r3,[r2]
 orr r3,r3,#((1<<17)|(1<<18)|(1<<19))
            
@ prepare the Power_Off mode bit in CLKCON Register
 ldr r4,=0x4c00000c @ CLKCON Register
 ldr r5,=(1<<3)
 b   set_sdram_refresh

 .align 5
set_sdram_refresh:
 str r1,[r0]             @ SDRAM self-refresh enable

@ wait until SDRAM into self-refresh
 mov r1, #64
1:  subs    r1, r1, #1
 bne 1b

@ set the MISCCR & CLKCON register for power off
 str r3,[r2]
 str r5,[r4]
 nop                 @ waiting for power off
 nop
 nop
 b   .
第二阶段进入lib_arm/board.c
start_armboot是U-Boot执行的第一个C语言函数,完成系统初始化工作,进入主循环,处理用户输入的命令。
进入start_armboot函数里,先对硬件资源进行初始化如下:
init_fnc_t *init_sequence[] = {
 cpu_init,  /*基本的处理器相关配置 –cpu/arm920t/cpu.c*/
 board_init,  /* 基本的开发板相关配置—board/smdk2442/smdk2442.c*/
 interrupt_init,  /* 初始化例外处理---cpu/arm920t/ interrupt.c */

1 2 3 ◆◇飞诺网社区版主正在招募中!
- 如果图片或页面不能正常显示请