这次我们将从官网下载的最新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

s5pv210 uboot-2012-10移植(二) 之能够启动进入控制台的更多相关文章

  1. u-boot-2012.10移植到AT91RM9200(包括NAND FLASH)

    基于中嵌SRM9204 目  录 1 配置 1.1修改顶层Makefile(可选) 1.2配置 1.3下载.运行.测试 2 修改内存配置参数(根据芯片手册修改) 2.1 修改配置参数 2.2 编译 2 ...

  2. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  3. [学习资料] Tiny210(S5PV210) u-boot移植

    Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...

  4. ok6410 u-boot-2012.04.01移植二修改源码支持单板

    继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...

  5. Linux之uboot分析与移植20160601

    说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...

  6. SQLServer 2012异常问题(二)--由安装介质引发性能问题

    原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后 ...

  7. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...

  8. table-cell http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html

    http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html

  9. u-boot分析1:Nandflash、Norflash启动

    了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Univ ...

随机推荐

  1. C# try-catch-return

    正常执行try后才能执行finally,catch中的语句可能会影响finally的执行 使用 finally 块,可以清理在 Try 中分配的任何资源,而且,即使在 try 块中发生异常,您也可以运 ...

  2. [Linux]第二部分-linux文件磁盘格式

    账户信息在/etc/passwd中,密码在/etc/shadow中,组信息在etc/group中 (d/-)rwxrwxrwx 1 root 293 Oct 19 21:24 test 文件属性 连接 ...

  3. oracle 有个xe版本

    oracle 有个xe版本 学习了:http://blog.csdn.net/angiexia/article/details/8615771

  4. 【SSH2框架(理论篇)】--SSH2 Vs 经典三层

     这几天一直在学习使用SSH2框架.对于框架本身的使用并非非常困难.相信经过多锻炼就行熟练的掌握框架的使用,让我匪夷所思的是在使用框架的时候感觉非常熟悉,好像在哪里用过似得. 就在某次查看代码的时 ...

  5. Web前端开发实战2:二级下拉式菜单之JS实现

    上一篇博文提到了二级下拉式菜单是用HTML和CSS实现的.我们这一篇来用JavaScript脚本实现下拉菜单的显 示和隐藏. 使用 JavaScript方法实现我们须要用的知识有: 1)JS事件:on ...

  6. Photon + Unity3D 线上游戏开发 学习笔记(一)

    大家好. 我也是学习Photon + unity3D 的新手 有什么说错的地方大家见谅哈. 我的开发环境是 unity3D 4.1.3  ,   Visual Studio 是2010 版本号的  p ...

  7. SVN打tag

          SVN打tag是一个非经常常使用的功能,要谈打tag,还得从SVN官方推荐的文件夹结构说起.SVN官方推荐在一个版本号库的根文件夹下先建立trunk.branches.tags这三个文件夹 ...

  8. Leetcode--easy系列2

    #14 Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...

  9. 【剑指Offer学习】【面试题26:复杂链表的复制】

    题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...

  10. 【转】iOS 设置APP的名称(浅述APP版本国际化与本地化)

    原文网址:http://www.jianshu.com/p/a3a70f0398c4 前言 App的名字设置方式有很多种,如果在App打包上线时不做修改,最终App的名字就是Xcode在建立工程时的名 ...