找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5537|回复: 1
打印 上一主题 下一主题
收起左侧

u-boot 第一阶段启动流程

[复制链接]
跳转到指定楼层
楼主
ID:72519 发表于 2015-1-23 01:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、u-boot启动流程

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

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


二、第一阶段启动流程

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

  3.     /***********************************设置异常向量表***************************************/
  4.             ldr        pc, _undefined_instruction
  5.             ldr        pc, _software_interrupt
  6.             ldr        pc, _prefetch_abort
  7.             ldr        pc, _data_abort
  8.             ldr        pc, _not_used
  9.             ldr        pc, _irq
  10.             ldr        pc, _fiq

  11.     _undefined_instruction: .word undefined_instruction
  12.     _software_interrupt:        .word software_interrupt
  13.     _prefetch_abort:        .word prefetch_abort
  14.     _data_abort:                .word data_abort
  15.     _not_used:                .word not_used
  16.     _irq:                        .word irq
  17.     _fiq:                        .word fiq
  18.     _pad:                        .word 0x12345678 /* now 16*4=64 */

  19.     .balignl 16,0xdeadbeef

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






  21.     _TEXT_BASE:
  22.             #TEXT_BASE 0x20f00000
  23.             .word        TEXT_BASE

  24.     _armboot_start:
  25.             #_start 0x20f00000
  26.             .word _start

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

  35.     _bss_end:
  36.             .word _end

  37.     /*
  38.     * the actual reset code
  39.     */

  40.     /******************************设置ARM核为SVC管理模式********************************/
  41.     reset:
  42.             /*
  43.              * set the cpu to SVC32 mode
  44.              * 切换ARM核到管理模式
  45.              */
  46.             mrs        r0, cpsr
  47.             bic        r0, r0, #0x1f
  48.             orr        r0, r0, #0xd3
  49.             msr        cpsr,r0

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







  52.             bl        cpu_init_crit
  53.             




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

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

  61.             ldr        r2, _armboot_start
  62.             ldr        r3, _bss_start
  63.             sub        r2, r3, r2                @ r2 <- size of armboot
  64.             add        r2, r0, r2                @ r2 <- source end address

  65.     copy_loop:                                @ copy 32 bytes at a time
  66.             ldmia        r0!, {r3 - r10}                @ copy from source address [r0]
  67.             stmia        r1!, {r3 - r10}                @ copy to   target address [r1]
  68.             cmp        r0, r2                        @ until source end addreee [r2]
  69.             ble        copy_loop

  70.     #else NAND FLASH 启动
  71.             
  72.     relocate:                                @ relocate U-Boot to RAM
  73.             adr        r0, _start                @ r0 <- current position of code
  74.             ldr        r1, _TEXT_BASE        @ test if we run from DRAM or SRAM
  75.             cmp        r0, r1                        @ don't reloc during debug
  76.             beq        stack_setup
  77.             
  78.             ldr sp,_TEXT_BASE
  79.             
  80.             ldr r0,_TEXT_BASE        
  81.             mov r1,#0x0
  82.             mov r2,#0x50000

  83.             bl  copy_uboot_to_dram

  84.     #endif

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







  86.     /**********************************设置栈空间****************************************/






  87.             /* Set up the stack */
  88.     stack_setup:
  89.             ldr        r0, _TEXT_BASE                @ upper 128 KiB: relocated uboot
  90.             sub        r0, r0, #CONFIG_SYS_MALLOC_LEN @ malloc area [1M + 128KB]
  91.             sub        r0, r0, #CONFIG_SYS_GBL_DATA_SIZE @ bdinfo   [128字节]
  92.             sub        sp, r0, #12                @ leave 3 words for abort-stack
  93.             and        sp, sp, #~7                @ 8 byte alinged for (ldr/str)d


  94.     /*******************************设置栈空间********************************************/



  95.     /**********************************清除BSS段*******************************************/

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

  107.     /*********************************清除BSS段*******************************************/







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


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

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

  112.     _start_armboot: .word start_armboot






  113.     cpu_init_crit:
  114.             /*
  115.              * Invalidate L1 I/D:使cache无效
  116.              */
  117.             mov        r0, #0                        @ set up for MCR
  118.             mcr        p15, 0, r0, c8, c7, 0        @ invalidate TLBs
  119.             mcr        p15, 0, r0, c7, c5, 0        @ invalidate icache

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

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


  139.     lowlevel_init:
  140.             mov        r9, lr

  141.             /* r5 has always zero */
  142.             mov        r5, #0

  143.             ldr        r8, =S5PC100_GPIO_BASE

  144.             /* Disable Watchdog :关开门狗 */
  145.             ldr        r0, =S5PC100_WATCHDOG_BASE                @0xEA200000
  146.             orr        r0, r0, #0x0
  147.             str        r5, [r0]

  148.             /* setting SRAM */
  149.             ldr        r0, =S5PC100_SROMC_BASE
  150.             ldr        r1, =0x9
  151.             str        r1, [r0]


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

  156.             /* Disable all interrupts (VIC0, VIC1 and VIC2) : 禁用中断 */
  157.             mvn        r3, #0x0
  158.             str        r3, [r0, #0x14]                                @INTENCLEAR
  159.             str        r3, [r1, #0x14]                                @INTENCLEAR
  160.             str        r3, [r2, #0x14]                                @INTENCLEAR

  161.             /* Set all interrupts as IRQ */
  162.             str        r5, [r0, #0xc]                                @INTSELECT
  163.             str        r5, [r1, #0xc]                                @INTSELECT
  164.             str        r5, [r2, #0xc]                                @INTSELECT

  165.             /* Pending Interrupt Clear :清除基地址寄存器的值*/
  166.             str        r5, [r0, #0xf00]                        @INTADDRESS
  167.             str        r5, [r1, #0xf00]                        @INTADDRESS
  168.             str        r5, [r2, #0xf00]                        @INTADDRESS

  169.             /* for UART */
  170.             bl uart_asm_init

  171.             /* for TZPC */
  172.             bl tzpc_asm_init

  173.             
  174.             /* 系统时钟初始化 */
  175.             bl        system_clock_init

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


  178.     1:
  179.             mov        lr, r9
  180.             mov        pc, lr
复制代码



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

        <6>初始化串口引脚
        <7>系统时钟初始化
        <8>初始化内存控制器
        <9>将u_boot搬移到内存
        <10>设置栈空间
        <11>清除BSS段
        <12>跳到内存中执行第二阶段代码[start_armboot]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:837593 发表于 2020-11-8 05:04 | 只看该作者
51黑学,学习让我快乐!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表