u-boot分析2

10 篇文章 0 订阅

转载自:http://blog.csdn.net/toraloo/article/details/7820992


Step3

U-Boot源码分析:

第一阶段: 

硬件设备初始化

为加载Bootloader第二阶段代码准备RAM空间

复制Bootloader第二阶段代码到RAM准备好空间中

设置栈

跳转到第二阶段的C代码;

第二阶段:

初始化本阶段使用到的硬件设备;

检测系统内存映射;

将内核映像和根文件系统映像从Flash上读到RAM中;

为内核设置启动参数;

调用内核;

第一阶段由:start.slowlevel_init.s两个汇编文件完成,下面进行分析:

Start.s主要执行代码:

[cpp]  view plain copy
  1. #include <config.h>  
  2. #include <version.h>  
  3. .globl _start  
  4. _start: b       reset  
  5. reset:  
  6. /* 
  7.  * set the cpu to SVC32 mode 
  8.  */  
  9. mrs r0,cpsr  
  10. bic r0,r0,#0x1f  
  11. orr r0,r0,#0xd3  
  12. msr cpsr,r0  
  13. #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)  
  14. ldr     r0, =pWTCON  
  15. mov     r1, #0x0  
  16. str     r1, [r0]  
  17. /* 
  18.  * mask all IRQs by setting all bits in the INTMR - default 
  19.  */  
  20. mov r1, #0xffffffff  
  21. ldr r0, =INTMSK  
  22. str r1, [r0]  
  23. # if defined(CONFIG_S3C2410)  
  24. ldr r1, =0x3ff  
  25. ldr r0, =INTSUBMSK  
  26. str r1, [r0]  
  27. # endif  
  28. #endif  /* CONFIG_S3C2400 || CONFIG_S3C2410 */  
  29. #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  30. bl  cpu_init_crit  
  31. #endif  
  32. /* Set up the stack      */  
  33. stack_setup:  
  34. ldr r0, _TEXT_BASE   /* upper 128 KiB: relocated uboot   */  
  35. sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */  
  36. sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */  
  37. #ifdef CONFIG_USE_IRQ  
  38. sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)  
  39. #endif  
  40. sub sp, r0, #12  /* leave 3 words for abort-stack    */  
  41. bl clock_init    /*系统时钟配置C函数     */  
  42. #ifndef CONFIG_SKIP_RELOCATE_UBOOT  
  43. relocate:    /* relocate U-Boot to RAM      */  
  44. adr r0, _start   /* r0 <- current position of code   */  
  45. ldr r1, _TEXT_BASE   /* test if we run from flash or RAM */  
  46. cmp     r0, r1                  /* don't reloc during debug         */  
  47. beq     clear_bss  
  48. ldr r2, _armboot_start  
  49. ldr r3, _bss_start  
  50. sub r2, r3, r2   /* r2 <- size of armboot            */  
  51. #if 1  
  52. bl  CopyCode2Ram    /* r0: source, r1: dest, r2: size 这是一个C函数 */  
  53. #endif  
  54. #endif  /* CONFIG_SKIP_RELOCATE_UBOOT */  
  55. clear_bss:  
  56. ldr r0, _bss_start   /* find start of bss segment        */  
  57. ldr r1, _bss_end     /* stop here                        */  
  58. mov     r2, #0x00000000  /* clear                            */  
  59. clbss_l:str r2, [r0]     /* clear loop...                    */  
  60. add r0, r0, #4  
  61. cmp r0, r1  
  62. ble clbss_l  
  63. /*  转入第二阶段C函数入口  */  
  64. ldr pc, _start_armboot  
  65. _start_armboot: .word start_armboot  
  66. #ifndef CONFIG_SKIP_LOWLEVEL_INIT  
  67. cpu_init_crit:  
  68. /* 
  69.  * flush v4 I/D caches 
  70.  */  
  71. mov r0, #0  
  72. mcr p15, 0, r0, c7, c7, 0   /* flush v3/v4 cache */  
  73. mcr p15, 0, r0, c8, c7, 0   /* flush v4 TLB */  
  74. /* 
  75.  * disable MMU stuff and caches 
  76.  */  
  77. mrc p15, 0, r0, c1, c0, 0  
  78. bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)  
  79. bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)  
  80. orr r0, r0, #0x00000002 @ set bit 2 (A) Align  
  81. orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache  
  82. mcr p15, 0, r0, c1, c0, 0  
  83. /* 
  84.  * before relocating, we have to setup RAM timing 
  85.  * because memory timing is board-dependend, you will 
  86.  * find a lowlevel_init.S in your board directory. 
  87.  */  
  88. mov ip, lr  
  89. bl  lowlevel_init  
  90. mov lr, ip  
  91. mov pc, lr  
  92. #endif /* CONFIG_SKIP_LOWLEVEL_INIT */  

start.s中未使用到的代码裁去后可得上述较为简易的代码,大部分代码均加有注释阅读也较为容易。

start.s中通过bl  lowlevel_init调用lowlevel_init.s

lowlevel_init.s只要执行代码如下:

[cpp]  view plain copy
  1. /*上面还有部分代码进行定义用于各个bank的设置用的用在此不列出*/  
  2. .globl lowlevel_init  
  3. lowlevel_init:  
  4. /* memory control configuration */  
  5. /* make r0 relative the current location so that it */  
  6. /* reads SMRDATA out of FLASH rather than memory ! */  
  7. ldr     r0, =SMRDATA  
  8. ldr r1, _TEXT_BASE  
  9. sub r0, r0, r1  
  10. ldr r1, =BWSCON /* Bus Width Status Controller */  
  11. add     r2, r0, #13*4  
  12. 0:  
  13. ldr     r3, [r0], #4  
  14. str     r3, [r1], #4  
  15. cmp     r2, r0  
  16. bne     0b  
  17. /* everything is fine now */  
  18. mov pc, lr  
  19. .ltorg  
  20. /* the literal pools origin */  
  21. SMRDATA:  
  22.     .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))  
  23.     .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))  
  24.     .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))  
  25.     .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))  
  26.     .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))  
  27.     .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))  
  28.     .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))  
  29.     .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))  
  30.     .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))  
  31. #if CONFIG_133MHZ_SDRAM  
  32.     .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+REFCNT)  
  33.     .word 0xB2  
  34.     .word 0xB0  
  35.     .word 0xB0  
  36. #else  
  37.     .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)  
  38.     .word 0x32  
  39.     .word 0x30  
  40.     .word 0x30  
  41. #endif  

lowlevel_init.s主要功能为使能外接的SDRAM,代码也有较为详细的说明。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值