入口
~/linux/uboot/u-boot-2013.04-rc1/arch/arm/cpu/arm1176$
start.S (汇编语言)
1,复位
.globl _start
_start: b reset
b是跳转指令 32M的空间
bl是带返回的跳转指令
bx带状态切换的跳转指令
blx带返回带状态切换
/*
* the actual reset code
*/
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0, cpsr
bic r0, r0, #0x3f
orr r0, r0, #0xd3
msr cpsr, r0
一上电先复位
mrs : 将cpsr状态寄存器的值取出来,给r0
bic : 清除需要的位为0 0011 1111,清除第六位为0
orr (或) : 1101 0011
msr : 将r0的值给cpsr(低8位) = 1101 0011
cpsr,当前程序状态寄存器 Current Program Status Register
7 6 5 4 3 2 1 0
I F T M4 M3 M2 M1 M0
I = 1,禁止IRQ中断
F = 1,禁止FIQ中断
T = 1,则是执行ARM指令;如果T = 0,Thumb指令
M[4:0] = 0x13 管理模式
2,cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0/* flush v3/v4 cache */ 将v3/v4cache失效
mcr p15, 0, r0, c8, c7, 0/* flush v4 TLB */
mcr
从ARM寄存器中将数据传送到协处理器p15中。
r0 c7,c7
3,外设基地址的初始化
#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
4,返回跳跃
bl lowlevel_init/* go setup pll,mux,memory */
~/linux/uboot/u-boot-2013.04-rc1/board/samsung/smdk6400$ lowlevel_init.S
lowlevel_init:
mov r12, lr
a)gpio 配置led
/* LED on only #8 */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x55540000
str r1, [r0, #GPNCON_OFFSET]
ldr r1, =0x55555555
str r1, [r0, #GPNPUD_OFFSET]
ldr r1, =0xf000
str r1, [r0, #GPNDAT_OFFSET]
OK6410 GPM0——GPM3这4个GPIO作为LED
#define ELFIN_GPIO_BASE 0x7f008000
#define GPMCON_OFFSET 0x820
r0 = 0x7f008000 + 0x820 = 0x7f00 8820
r1 = 0x 0000 1111 (hex进位)
#define GPMPUD_OFFSET 0x828
r0 = 0x7f008000 + 0x820 = 0x7f00 8828
0101 0101
r0 = 0x0000 0055
b) 配置watchdog
/* Disable Watchdog */
ldr r0, =0x7e000000 @0x7e004000
orr r0, r0, #0x4000 r0 = 0x7e00_4000
mov r1, #0
str r1, [r0]
1:看门狗定时器超时,发出复位信号
0:禁止看门狗定时器的复位功能
c) 系统中断
d) bl system_clock_init
system_clock_init 系统时钟初始化
//6400
#if 0
ldr r1, =0x200203
#endif
//6410
ldr r1, = 0x80200203
PLL(锁相环)APLL、MPLL、EPLL
APLL : cpu
MPLL : 外围ddr
EPLL : 外围uart
e) bl uart_asm_init
#ifndef CONFIG_NAND_SPL
/* for UART */
bl uart_asm_init
#endif
#ifndef CONFIG_NAND_SPL
/*
* uart_asm_init: Initialize UART's pins
*/
uart_asm_init:
/* set GPIO to enable UART */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x220022
str r1, [r0, #GPACON_OFFSET]
mov pc, lr
#endif
f)bl nand_asm_init
#ifdef CONFIG_BOOT_NAND
/* simple init for NAND */
bl nand_asm_init
#endif
#ifdef CONFIG_BOOT_NAND
/*
* NAND Interface init for SMDK6400
*/
nand_asm_init:
ldr r0, =ELFIN_NAND_BASE
ldr r1, [r0, #NFCONF_OFFSET]
orr r1, r1, #0x70
orr r1, r1, #0x7700
str r1, [r0, #NFCONF_OFFSET]
ldr r1, [r0, #NFCONT_OFFSET]
orr r1, r1, #0x07
str r1, [r0, #NFCONT_OFFSET]
mov pc, lr
#endif
g)内存初始化
mem_ctrl_asm_init
《嵌入式Linux学习手册》P65
bl mem_ctrl_asm_init
~/linux/uboot/u-boot-2013.04-rc1/arch/arm/cpu/arm1176/s3c64xx$ cpu_init.S
#include <config.h>
#include <asm/arch/s3c6400.h>
.globl mem_ctrl_asm_init
mem_ctrl_asm_init:
/* DMC1 base address 0x7e001000 */
h)复位操作
ldr r0, =(ELFIN_CLOCK_POWER_BASE + RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfffffff7
cmp r1, #0x8
beq wakeup_reset
/* Wakeup support. Don't know if it's going to be used, untested. */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + RST_STAT_OFFSET)
ldr r1, [r0]
bic r1, r1, #0xfffffff7
cmp r1, #0x8
beq wakeup_reset
lowlevel_init.S 结束,返回到
5.bl _main
main函数
~/linux/uboot/u-boot-2013.04-rc1/arch/arm/lib$ crt0.S
crt0.S
堆栈初始化
board_init_f()函数
清空gd指向的结构体、填充结构体
board_init_r()函数 《嵌入式Linux学习手册》P66
main_loop()函数 U-boot启动管理函数
但是