单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:5593|回复: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]
沙发
ID:837593发表于 2020-11-8 05:04|只看该作者
51黑学,学习让我快乐!!!!

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

Powered by 单片机教程网