小乖 发表于 2014-9-11 20:08:47

u-boot 第一阶段启动流程

详细请看:http://m18271260665.blog.163.com/
一、u-boot启动流程

        第一步:
        S5pc100中IROM中的代码 自动将NAND FLASH的前16KB拷贝到SRAM的0x34000 ,然后bootload的第一部分开始执行,初始化DRAM。
       
        第二步:
        bootload将nandflash中所有的bootload拷贝到DRAM中。

        第三步:
        跳转到DRAM中开始执行bootload的第二部分代码。


二、第一阶段启动流程

裁剪之后的start.S文件如下:
.globl _start
_start: b        reset

/***********************************设置异常向量表***************************************/
        ldr        pc, _undefined_instruction
        ldr        pc, _software_interrupt
        ldr        pc, _prefetch_abort
        ldr        pc, _data_abort
        ldr        pc, _not_used
        ldr        pc, _irq
        ldr        pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:        .word software_interrupt
_prefetch_abort:        .word prefetch_abort
_data_abort:                .word data_abort
_not_used:                .word not_used
_irq:                        .word irq
_fiq:                        .word fiq
_pad:                        .word 0x12345678 /* now 16*4=64 */

.balignl 16,0xdeadbeef

/**************************************设置异常向量表************************************/






_TEXT_BASE:
        #TEXT_BASE 0x20f00000
        .word        TEXT_BASE

_armboot_start:
        #_start 0x20f00000
        .word _start

/*
* These are defined in the board-specific linker script.
*链接脚本指定:
*__bss_start bss段起始地址
*__end       bss段结束地址
*/
_bss_start:
        .word __bss_start

_bss_end:
        .word _end

/*
* the actual reset code
*/

/******************************设置ARM核为SVC管理模式********************************/
reset:
        /*
       * set the cpu to SVC32 mode
       * 切换ARM核到管理模式
       */
        mrs        r0, cpsr
        bic        r0, r0, #0x1f
        orr        r0, r0, #0xd3
        msr        cpsr,r0

/*****************************设置ARM核为SVC管理模式*********************************/
       







        bl        cpu_init_crit
       




/*********************************搬移u-boot到DRAM************************************/

#ifNOR FLASH 启动        
relocate:                                @ relocate U-Boot to RAM
        adr        r0, _start                @ r0 <- current position of code
        ldr        r1, _TEXT_BASE                @ test if we run from flash or RAM
        cmp        r0, r1                        @ don't reloc during debug
        beq        stack_setup

        ldr        r2, _armboot_start
        ldr        r3, _bss_start
        sub        r2, r3, r2                @ r2 <- size of armboot
        add        r2, r0, r2                @ r2 <- source end address

copy_loop:                                @ copy 32 bytes at a time
        ldmia        r0!, {r3 - r10}                @ copy from source address
        stmia        r1!, {r3 - r10}                @ copy to   target address
        cmp        r0, r2                        @ until source end addreee
        ble        copy_loop

#else NAND FLASH 启动
       
relocate:                                @ relocate U-Boot to RAM
        adr        r0, _start                @ r0 <- current position of code
        ldr        r1, _TEXT_BASE        @ test if we run from DRAM or SRAM
        cmp        r0, r1                        @ don't reloc during debug
        beq        stack_setup
       
        ldr sp,_TEXT_BASE
       
        ldr r0,_TEXT_BASE       
        mov r1,#0x0
        mov r2,#0x50000

        blcopy_uboot_to_dram

#endif

/**************************搬移u-boot到DRAM************************************/







/**********************************设置栈空间****************************************/






        /* Set up the stack */
stack_setup:
        ldr        r0, _TEXT_BASE                @ upper 128 KiB: relocated uboot
        sub        r0, r0, #CONFIG_SYS_MALLOC_LEN @ malloc area
        sub        r0, r0, #CONFIG_SYS_GBL_DATA_SIZE @ bdinfo   
        sub        sp, r0, #12                @ leave 3 words for abort-stack
        and        sp, sp, #~7                @ 8 byte alinged for (ldr/str)d


/*******************************设置栈空间********************************************/



/**********************************清除BSS段*******************************************/

        /* Clear BSS (if any). Is below tx (watch load addr - need space) */
clear_bss:
        ldr        r0, _bss_start                @ find start of bss segment
        ldr        r1, _bss_end                @ stop here
        mov        r2, #0x00000000                @ clear value
clbss_l:
        str        r2,                 @ clear BSS location
        cmp        r0, r1                        @ are we at the end yet
        add        r0, r0, #4                @ increment clear index pointer
        bne        clbss_l                        @ keep clearing till at end
       

/*********************************清除BSS段*******************************************/







/***************************调到内存中执行第二阶段****************************************/


        //跳到内存中执行第二阶段代码
        ldr        pc, _start_armboot        @ jump to C code

/************************调到内存中执行第二阶段*******************************************/

_start_armboot: .word start_armboot






cpu_init_crit:
        /*
       * Invalidate L1 I/D:使cache无效
       */
        mov        r0, #0                        @ set up for MCR
        mcr        p15, 0, r0, c8, c7, 0        @ invalidate TLBs
        mcr        p15, 0, r0, c7, c5, 0        @ invalidate icache

        /*
       * disable MMU stuff and caches:关MMU
       */
        mrc        p15, 0, r0, c1, c0, 0
        bic        r0, r0, #0x00002000        @ clear bits 13 (--V-)
        bic        r0, r0, #0x00000007        @ clear bits 2:0 (-CAM)
        orr        r0, r0, #0x00000002        @ set bit 1 (--A-) Align
        orr        r0, r0, #0x00000800        @ set bit 12 (Z---) BTB
        mcr        p15, 0, r0, c1, c0, 0

        /*
       * Jump to board specific initialization...
       * The Mask ROM will have already initialized
       * basic memory. Go here to bump up clock rate and handle
       * wake up conditions.
       */
        mov        ip, lr                        @ persevere link reg across call
        bl        lowlevel_init                @ go setup pll,mux,memory
        mov        lr, ip                        @ restore link
        mov        pc, lr                        @ back to my caller


lowlevel_init:
        mov        r9, lr

        /* r5 has always zero */
        mov        r5, #0

        ldr        r8, =S5PC100_GPIO_BASE

        /* Disable Watchdog :关开门狗 */
        ldr        r0, =S5PC100_WATCHDOG_BASE                @0xEA200000
        orr        r0, r0, #0x0
        str        r5,

        /* setting SRAM */
        ldr        r0, =S5PC100_SROMC_BASE
        ldr        r1, =0x9
        str        r1,


        /* S5PC100 has 3 groups of interrupt sources */
        ldr        r0, =S5PC100_VIC0_BASE                        @0xE4000000
        ldr        r1, =S5PC100_VIC1_BASE                        @0xE4000000
        ldr        r2, =S5PC100_VIC2_BASE                        @0xE4000000

        /* Disable all interrupts (VIC0, VIC1 and VIC2) : 禁用中断 */
        mvn        r3, #0x0
        str        r3,                                 @INTENCLEAR
        str        r3,                                 @INTENCLEAR
        str        r3,                                 @INTENCLEAR

        /* Set all interrupts as IRQ */
        str        r5,                                 @INTSELECT
        str        r5,                                 @INTSELECT
        str        r5,                                 @INTSELECT

        /* Pending Interrupt Clear :清除基地址寄存器的值*/
        str        r5,                         @INTADDRESS
        str        r5,                         @INTADDRESS
        str        r5,                         @INTADDRESS

        /* for UART */
        bl uart_asm_init

        /* for TZPC */
        bl tzpc_asm_init

       
        /* 系统时钟初始化 */
        bl        system_clock_init

        /*内存控制器初始化*/
        bl        mem_ctrl_asm_init


1:
        mov        lr, r9
        mov        pc, lr

总结:
        <1>设置异常向量表
        <2>设置ARM核为管理模式
        <3>使cache无效,关闭MMU
        <4>关闭看门狗
        <5>设置向量中断控制器
                   禁用所有的中断
                   设置所有的中断都为IRQ异常
                   清除向量地址寄存器

        <6>初始化串口引脚
        <7>系统时钟初始化
        <8>初始化内存控制器
        <9>将u_boot搬移到内存
        <10>设置栈空间
        <11>清除BSS段
        <12>跳到内存中执行第二阶段代码

详细请看:http://m18271260665.blog.163.com/

wjjsl 发表于 2014-9-11 20:19:31

学习,讲的很详细

brwang1983 发表于 2014-9-11 23:03:29

学习了,说的不错

sunliezhi 发表于 2014-9-11 23:09:56

S5pc100中IROM中的代码 自动将NAND FLASH的前16KB拷贝到SRAM的0x34000 ,然后bootload的第一部分开始执行

小乖 发表于 2014-9-11 23:11:48

sunliezhi 发表于 2014-9-11 23:09
S5pc100中IROM中的代码 自动将NAND FLASH的前16KB拷贝到SRAM的0x34000 ,然后bootload的第一部分开始执行 ...

有什么问题吗

sunliezhi 发表于 2014-9-11 23:13:12

呵呵,不好意思,忘了写“Mark” 了

rayman_ppx 发表于 2014-9-12 15:25:35

学习,讲的很详细

jzhang123 发表于 2014-9-14 14:53:16

mark            

zky26 发表于 2014-9-16 09:38:06

很好!!!!!!!!!!也很详细1

小乖 发表于 2014-9-16 11:39:10

zky26 发表于 2014-9-16 09:38
很好!!!!!!!!!!也很详细1

等会传第二阶段的

zky26 发表于 2014-9-16 13:35:54

小乖 发表于 2014-9-16 11:39
等会传第二阶段的

楼主目前是做什么工作的呀?

小乖 发表于 2014-9-16 13:49:02

zky26 发表于 2014-9-16 13:35
楼主目前是做什么工作的呀?

我还是学生{:mad:}

qqqqsa 发表于 2014-9-30 14:32:28

Mark{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

halfmoon 发表于 2014-9-30 20:24:18

mark. 等看第二阶段.

shenzhen_apeng 发表于 2014-11-18 18:09:01

学习!!

老赵 发表于 2014-11-18 18:51:07

等着第二阶段

sj1125055001 发表于 2014-12-6 14:43:43

顶                     

zhangzhika 发表于 2014-12-7 19:55:29

marK   。

四川李工 发表于 2014-12-7 22:46:03


marK   。
marK   。

374533905 发表于 2014-12-9 14:18:48

我就是来学习一下

sch2013 发表于 2014-12-9 15:32:20

这个学习了

jiulong855@.163 发表于 2014-12-9 15:48:06

楼主好人啊,讲得不错

dj1981812 发表于 2014-12-10 21:47:55

mark一下

chenaiguo0503 发表于 2014-12-15 16:24:59

请问LZ有移植好的demo吗?

远去的记忆 发表于 2018-2-28 14:57:26

讲的很详细……

天荒 发表于 2018-2-28 15:22:18

赞一个,
页: [1]
查看完整版本: u-boot 第一阶段启动流程