这次我们将从官网下载的最新uboot-2012-10移植到s5pv210开发板上,让其进入控制台,效果如下:

首先,我暂时没采用内核的SPL,这个将在后面给补上,这里的BL1是我自己参考资料写的,我用的是TQ210开发板,内存1G,对于不同的开发板,需要重新配置memory和修改uboot在内存里的地址,也就是CONFIG_SYS_TEXT_BASE。我的BL1代码在这里下载

一、添加smdkv210单板

1.cp -a board/samsung/smdkc100 board/samsung/smdkv210

2.cp include/configs/smdkc100.h include/configs/smdkv210.h

3.vim boards.cfg,在270行添加

  1. 270 smdkv210                     arm         armv7       smdkv210            samsung        s5pc1xx

4.make smdkv210_config可以生成u-boot.bin了

二、让u-boot.bin在内存里启动起来

1.分析我的BL1代码可以得知,只拷贝了u-boot.bin,并没有清除bss,在ls arch/arm/cpu/armv7/start.S +126中添加

  1. reset:
  2. //by ZheGao clear bss
  3. ldr r0, =__bss_start
  4. ldr r1, =__bss_end__
  5. mov r2, #0x0
  6. 1:
  7. str r2, [r0], #4
  8. cmp r0, r1
  9. bne 1b
  10. //end of clear bss
  11. bl  save_boot_params

2.在BL0已经关了看门狗,在BL1里已经初始化了memory和串口,修改board/samsung/smdkv210/lowlevel_init.S +39中给屏蔽

  1. .globl lowlevel_init
  2. lowlevel_init:
  3. mov r9, lr
  4. #if 0
  5. /* r5 has always zero */
  6. mov r5, #0
  7. ldr r8, =S5PC100_GPIO_BASE
  8. /* Disable Watchdog */
  9. ldr r0, =S5PC100_WATCHDOG_BASE      @0xEA200000
  10. orr r0, r0, #0x0
  11. str r5, [r0]
  12. /* setting SRAM */
  13. ldr r0, =S5PC100_SROMC_BASE
  14. ldr r1, =0x9
  15. str r1, [r0]
  16. /* S5PC100 has 3 groups of interrupt sources */
  17. ldr r0, =S5PC100_VIC0_BASE          @0xE4000000
  18. ldr r1, =S5PC100_VIC1_BASE          @0xE4000000
  19. ldr r2, =S5PC100_VIC2_BASE          @0xE4000000
  20. /* Disable all interrupts (VIC0, VIC1 and VIC2) */
  21. mvn r3, #0x0
  22. str r3, [r0, #0x14]             @INTENCLEAR
  23. str r3, [r1, #0x14]             @INTENCLEAR
  24. str r3, [r2, #0x14]             @INTENCLEAR
  25. /* Set all interrupts as IRQ */
  26. str r5, [r0, #0xc]              @INTSELECT
  27. str r5, [r1, #0xc]              @INTSELECT
  28. str r5, [r2, #0xc]              @INTSELECT
  29. /* Pending Interrupt Clear */
  30. str r5, [r0, #0xf00]            @INTADDRESS
  31. str r5, [r1, #0xf00]            @INTADDRESS
  32. str r5, [r2, #0xf00]            @INTADDRESS
  33. /* for UART */
  34. bl uart_asm_init
  35. /* for TZPC */
  36. bl tzpc_asm_init
  37. 1:
  38. #endif
  39. mov lr, r9
  40. mov pc, lr

3.修改第一步的sp指针,在include/configs/smdkv210.h +228修改

  1. //#define CONFIG_SYS_INIT_SP_ADDR   (CONFIG_SYS_LOAD_ADDR - 0x1000000)
  2. #define CONFIG_SYS_INIT_SP_ADDR (0x30000000)

4.修改board/samsung/smdkv210/smdkc100.c +80

  1. int checkboard(void)
  2. {
  3. printf("Board:\tSMDKv210\n");
  4. return 0;
  5. }

5.修改include/configs/smdkv210.h +51

  1. //#define CONFIG_SYS_SDRAM_BASE     0x30000000
  2. #define CONFIG_SYS_SDRAM_BASE       0x20000000

6.修改include/configs/smdkv210.h +189

  1. //#define PHYS_SDRAM_1_SIZE (128 << 20)   /* 0x8000000, 128 MB Bank #1 */
  2. #define PHYS_SDRAM_1_SIZE   (0x40000000)    /* 0x8000000, 128 MB Bank #1 */

7.修改board/samsung/smdkv210/config.mk +16

  1. CONFIG_SYS_TEXT_BASE = 0x5ff00000

8.修改 arch/arm/config.mk +88

  1. #LDFLAGS_u-boot += -pie

9.修改include/configs/smdkv210.h +216

  1. //#define CONFIG_ENV_IS_IN_ONENAND  1
  2. #define CONFIG_ENV_IS_NOWHERE

10.修改arch/arm/lib/board.c +384

  1. //addr -= gd->mon_len;
  2. addr = 0x5ff00000;

11.因为bl1已经复制程序到指定的地址就不需要重新定位代码了,但还是需要重新设置栈,所以修改了上面的第8步,修改arch/arm/cpu/armv7/start.S +192

  1. ENTRY(relocate_code)
  2. mov r4, r0  /* save addr_sp */
  3. mov r5, r1  /* save addr of gd */
  4. mov r6, r2  /* save addr of destination */
  5. #if 0
  6. //debug
  7. ldr r0, =0xE0200C00
  8. ldr r1, =0x1111
  9. str r1, [r0]
  10. ldr r0, =0xE0200C04
  11. ldr r1, =(7)
  12. str r1, [r0]
  13. #endif
  14. mov sp, r4
  15. mov r0, r5
  16. mov r1, r6
  17. bl board_init_r
  18. #if 0
  19. /* Set up the stack                         */
  20. stack_setup:
  21. mov sp, r4
  22. adr r0, _start
  23. cmp r0, r6
  24. moveq   r9, #0      /* no relocation. relocation offset(r9) = 0 */
  25. beq clear_bss       /* skip relocation */
  26. mov r1, r6          /* r1 <- scratch for copy_loop */
  27. ldr r3, _image_copy_end_ofs
  28. add r2, r0, r3      /* r2 <- source end address      */
  29. copy_loop:
  30. ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */
  31. stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */
  32. cmp r0, r2          /* until source end address [r2]    */
  33. blo copy_loop
  34. /*
  35. * fix .rel.dyn relocations
  36. */
  37. ldr r0, _TEXT_BASE      /* r0 <- Text base */
  38. sub r9, r6, r0      /* r9 <- relocation offset */
  39. ldr r10, _dynsym_start_ofs  /* r10 <- sym table ofs */
  40. add r10, r10, r0        /* r10 <- sym table in FLASH */
  41. ldr r2, _rel_dyn_start_ofs  /* r2 <- rel dyn start ofs */
  42. add r2, r2, r0      /* r2 <- rel dyn start in FLASH */
  43. ldr r3, _rel_dyn_end_ofs    /* r3 <- rel dyn end ofs */
  44. add r3, r3, r0      /* r3 <- rel dyn end in FLASH */
  45. fixloop:
  46. ldr r0, [r2]        /* r0 <- location to fix up, IN FLASH! */
  47. add r0, r0, r9      /* r0 <- location to fix up in RAM */
  48. ldr r1, [r2, #4]
  49. and r7, r1, #0xff
  50. cmp r7, #23         /* relative fixup? */
  51. beq fixrel
  52. cmp r7, #2          /* absolute fixup? */
  53. beq fixabs
  54. /* ignore unknown type of fixup */
  55. b   fixnext
  56. fixabs:
  57. /* absolute fix: set location to (offset) symbol value */
  58. mov r1, r1, LSR #4      /* r1 <- symbol index in .dynsym */
  59. add r1, r10, r1     /* r1 <- address of symbol in table */
  60. ldr r1, [r1, #4]        /* r1 <- symbol value */
  61. add r1, r1, r9      /* r1 <- relocated sym addr */
  62. b   fixnext
  63. fixrel:
  64. /* relative fix: increase location by offset */
  65. ldr r1, [r0]
  66. add r1, r1, r9
  67. fixnext:
  68. str r1, [r0]
  69. add r2, r2, #8      /* each rel.dyn entry is 8 bytes */
  70. cmp r2, r3
  71. blo fixloop
  72. b   clear_bss
  73. _rel_dyn_start_ofs:
  74. .word __rel_dyn_start - _start
  75. _rel_dyn_end_ofs:
  76. .word __rel_dyn_end - _start
  77. _dynsym_start_ofs:
  78. .word __dynsym_start - _start
  79. clear_bss:
  80. ldr r0, _bss_start_ofs
  81. ldr r1, _bss_end_ofs
  82. mov r4, r6          /* reloc addr */
  83. add r0, r0, r4
  84. add r1, r1, r4
  85. mov r2, #0x00000000     /* clear                */
  86. clbss_l:cmp r0, r1          /* clear loop... */
  87. bhs clbss_e         /* if reached end of bss, exit */
  88. str r2, [r0]
  89. add r0, r0, #4
  90. b   clbss_l
  91. clbss_e:
  92. /*
  93. * We are done. Do not return, instead branch to second part of board
  94. * initialization, now running from RAM.
  95. */
  96. jump_2_ram:
  97. /*
  98. * If I-cache is enabled invalidate it
  99. */
  100. #ifndef CONFIG_SYS_ICACHE_OFF
  101. mcr p15, 0, r0, c7, c5, 0   @ invalidate icache
  102. mcr     p15, 0, r0, c7, c10, 4  @ DSB
  103. mcr     p15, 0, r0, c7, c5, 4   @ ISB
  104. #endif
  105. /*
  106. * Move vector table
  107. */
  108. #if !defined(CONFIG_TEGRA20)
  109. /* Set vector address in CP15 VBAR register */
  110. ldr     r0, =_start
  111. add     r0, r0, r9
  112. mcr     p15, 0, r0, c12, c0, 0  @Set VBAR
  113. #endif /* !Tegra20 */
  114. ldr r0, _board_init_r_ofs
  115. adr r1, _start
  116. add lr, r0, r1
  117. add lr, lr, r9
  118. /* setup parameters for board_init_r */
  119. mov r0, r5      /* gd_t */
  120. mov r1, r6      /* dest_addr */
  121. /* jump to it ... */
  122. mov pc, lr
  123. _board_init_r_ofs:
  124. .word board_init_r - _start
  125. #endif
  126. ENDPROC(relocate_code)
  127. #endif

重新make一下,使用下面命令烧写到sd卡里,插入开发板启动即可,看看上面的启动信息,还有很多很多地方要完善~

    1. dd iflag=dsync oflag=dsync if=blSD.bin of=/dev/sdb seek=1
    2. dd iflag=dsync oflag=dsync if=u-boot.b

最新文章

  1. [Hadoop大数据]——Hive连接JOIN用例详解
  2. SPFA(负环) LightOJ 1074 Extended Traffic
  3. Android Studio系列教程一--下载和安装
  4. Sql server之路 (二)登录本地服务器
  5. RAR暴破
  6. JS 在open打开的子窗口页面中调用父窗口页面的JS方法
  7. POJ 1363 Rails(栈)
  8. Reset / Validate Buffer
  9. 蓝桥杯之K好数问题
  10. a标签中调用js的几种方法
  11. Pycharm:书签的使用
  12. eclipse java formater 配置详解
  13. Confluence 6 安装补丁类文件
  14. Codeforces Beta Round #19C. Deletion of Repeats
  15. Nordic Collegiate Programming Contest NCPC 2017-Problem G Galactic Collegiate Programming Contest
  16. 神啊!PS是你这样用的吗?
  17. [AX2012]在SSRS报表中获取从Menuitem传入的记录
  18. [BZOJ 4591] 超能粒子炮-改
  19. HDUOJ-----(1072)Nightmare(bfs)
  20. com.sun.awt.AWTUtilities.setWindowOpacity相关说明

热门文章

  1. keepalived安装实现nginx主备高可用
  2. nmon分析文件各sheet含义
  3. POJ 2157 How many ways??
  4. idea debug打得断点第一次可以进入,第二次不能进入
  5. muduo库源码剖析(二) 服务端
  6. [Preference] How to avoid Forced Synchronous Layout or FSL to improve site preference
  7. VC与JavaScript交互(一) ———— 怎样实现
  8. h5-news_index
  9. Android::开机自启动C程序【转】
  10. WEBSERVICE之JDK开发webservice