uboot的分析

来源:互联网 发布:rpm e mysql 编辑:程序博客网 时间:2024/05/21 16:54

入口

~/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启动管理函数


但是



原创粉丝点击