u-boot启动代码start.S详解二
来源:百度文库 编辑:神马文学网 时间:2024/04/29 18:20:20
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 */
- 如果图片或页面不能正常显示请点