搜索
bottom↓
回复: 25

u-boot 第一阶段启动流程

[复制链接]

出0入0汤圆

发表于 2014-9-11 20:08:47 | 显示全部楼层 |阅读模式
详细请看:http://m18271260665.blog.163.com/
一、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]

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-9-11 20:19:31 | 显示全部楼层
学习,讲的很详细

出0入0汤圆

发表于 2014-9-11 23:03:29 | 显示全部楼层
学习了,说的不错

出0入4汤圆

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

出0入0汤圆

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

有什么问题吗

出0入4汤圆

发表于 2014-9-11 23:13:12 | 显示全部楼层
呵呵,不好意思,忘了写“Mark” 了

出0入0汤圆

发表于 2014-9-12 15:25:35 | 显示全部楼层
学习,讲的很详细

出0入0汤圆

发表于 2014-9-14 14:53:16 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-9-16 09:38:06 | 显示全部楼层
很好!!!!!!!!!!  也很详细1

出0入0汤圆

 楼主| 发表于 2014-9-16 11:39:10 | 显示全部楼层
zky26 发表于 2014-9-16 09:38
很好!!!!!!!!!!  也很详细1

等会传第二阶段的

出0入0汤圆

发表于 2014-9-16 13:35:54 | 显示全部楼层
小乖 发表于 2014-9-16 11:39
等会传第二阶段的

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

出0入0汤圆

 楼主| 发表于 2014-9-16 13:49:02 | 显示全部楼层
zky26 发表于 2014-9-16 13:35
楼主  目前是做什么工作的呀?

我还是学生

出0入0汤圆

发表于 2014-9-30 14:32:28 | 显示全部楼层
Mark

出0入0汤圆

发表于 2014-9-30 20:24:18 | 显示全部楼层
mark. 等看第二阶段.

出0入0汤圆

发表于 2014-11-18 18:09:01 | 显示全部楼层
学习!!

出0入0汤圆

发表于 2014-11-18 18:51:07 来自手机 | 显示全部楼层
等着第二阶段

出0入0汤圆

发表于 2014-12-6 14:43:43 | 显示全部楼层
顶                     

出0入0汤圆

发表于 2014-12-7 19:55:29 来自手机 | 显示全部楼层
marK   。

出0入0汤圆

发表于 2014-12-7 22:46:03 | 显示全部楼层

marK   。
marK   。

出0入0汤圆

发表于 2014-12-9 14:18:48 | 显示全部楼层
我就是来学习一下

出0入0汤圆

发表于 2014-12-9 15:32:20 | 显示全部楼层
这个学习了

出0入4汤圆

发表于 2014-12-9 15:48:06 | 显示全部楼层
楼主好人啊,讲得不错

出0入0汤圆

发表于 2014-12-10 21:47:55 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2014-12-15 16:24:59 | 显示全部楼层
请问LZ有移植好的demo吗?

出0入0汤圆

发表于 2018-2-28 14:57:26 | 显示全部楼层
讲的很详细……

出0入0汤圆

发表于 2018-2-28 15:22:18 | 显示全部楼层
赞一个,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 09:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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