1.找到入口:cd arch/arm/cpu/arm1176 vim start.S _start就是开始
b 跳转指令
bl 带返回跳转
bx 带状态切换的跳转指令
blx 带返回跳转和状态切换的跳转指令
2.复位:设置CPU 为SVC32模式
mrs r0, cpsr cpsr状态寄存器的值取出保存在r0
bic r0, r0, #0x3f 将r0的 0x3f(为1的位)清0 xx000000
orr r0, r0, #0xd3 或运算 11010011
msr cpsr, r0 将r0的值付给cpsr cpsr=11010011
cpsr 7 6 5 4 3 2 1 0
I F T M4 M3 M2 M1 M0
I=1,禁止IRQ中断
F=1,禁止FIQ中断
T=1,执行Thumb指令;T=0,执行ARM指令
M[4:0]=0X13 管理模式
3.caches初始化
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ cache失效
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ TLB失效
关闭mmu
4.外设基地址初始化
#ifdef CONFIG_PERIPORT_REMAP
/* Peri port setup */
ldr r0, =CONFIG_PERIPORT_BASE
orr r0, r0, #CONFIG_PERIPORT_SIZE
mcr p15,0,r0,c15,c2,4
#endif
5.单板初始化 bl lowlevel_init cd board/samsung/smdk6410 vim lowlevel_init.S(这里贴出的仅仅是修改后的代码,只贴了代码开始的解释的表示没有修改)
/* LED on only #8 */ LED初始化
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x00001111
str r1, [r0, #GPMCON_OFFSET]
ldr r1, =0x00000055
str r1, [r0, #GPMPUD_OFFSET]
ldr r1, =0x000f
str r1, [r0, #GPMDAT_OFFSET]
134行:
/* LED test */ LED测试
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x0003 亮2个灯
str r1, [r0, #GPNDAT_OFFSET]
/* Disable Watchdog */不使能看门狗
/* External interrupt pending clear */ 清除外部中断标志位
/* Disable all interrupts (VIC0 and VIC1) */不使能所有中断
/* Set all interrupts as IRQ */ 设置所有中断为IRQ
/* Pending Interrupt Clear */ 清除中断
/* init system clock */ 初始化系统时钟
bl system_clock_init 151行
225行修改:
/* FOUT of EPLL is 96MHz */
ldr r1, =0x80200203
/* for UART */ 初始化串口
bl uart_asm_init
/* simple init for NAND */初始化NANDflash
bl nand_asm_init
/* Memory subsystem address 0x7e00f120 */ 内存初始化
bl mem_ctrl_asm_init cd /arch/arm/cpu/arm1176/s3c64xx vim cpu_init.S
/* Wakeup support. Don't know if it's going to be used, untested. */ 唤醒复位初始化
/* Jump to kernel (sleep-s3c6400.S) */ 进入main函数
mov pc, r1 cd arch/arm/lib/ vim crt0.S _main
bl board_init_f 功能:
清空gd_t指向的结构体、填充结构体、
board_init_r
最后进入main_loop() U-boot 启动管理函数
红色标注的函数都是c语言写的,很重要。