s5pv210 uboot-2012-10移植(二) 之能够启动进入控制台
这次我们将从官网下载的最新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行添加
- 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中添加
- reset:
- //by ZheGao clear bss
- ldr r0, =__bss_start
- ldr r1, =__bss_end__
- mov r2, #0x0
- 1:
- str r2, [r0], #4
- cmp r0, r1
- bne 1b
- //end of clear bss
- bl save_boot_params
2.在BL0已经关了看门狗,在BL1里已经初始化了memory和串口,修改board/samsung/smdkv210/lowlevel_init.S +39中给屏蔽
- .globl lowlevel_init
- lowlevel_init:
- mov r9, lr
- #if 0
- /* r5 has always zero */
- mov r5, #0
- ldr r8, =S5PC100_GPIO_BASE
- /* Disable Watchdog */
- ldr r0, =S5PC100_WATCHDOG_BASE @0xEA200000
- orr r0, r0, #0x0
- str r5, [r0]
- /* setting SRAM */
- ldr r0, =S5PC100_SROMC_BASE
- ldr r1, =0x9
- str r1, [r0]
- /* S5PC100 has 3 groups of interrupt sources */
- ldr r0, =S5PC100_VIC0_BASE @0xE4000000
- ldr r1, =S5PC100_VIC1_BASE @0xE4000000
- ldr r2, =S5PC100_VIC2_BASE @0xE4000000
- /* Disable all interrupts (VIC0, VIC1 and VIC2) */
- mvn r3, #0x0
- str r3, [r0, #0x14] @INTENCLEAR
- str r3, [r1, #0x14] @INTENCLEAR
- str r3, [r2, #0x14] @INTENCLEAR
- /* Set all interrupts as IRQ */
- str r5, [r0, #0xc] @INTSELECT
- str r5, [r1, #0xc] @INTSELECT
- str r5, [r2, #0xc] @INTSELECT
- /* Pending Interrupt Clear */
- str r5, [r0, #0xf00] @INTADDRESS
- str r5, [r1, #0xf00] @INTADDRESS
- str r5, [r2, #0xf00] @INTADDRESS
- /* for UART */
- bl uart_asm_init
- /* for TZPC */
- bl tzpc_asm_init
- 1:
- #endif
- mov lr, r9
- mov pc, lr
3.修改第一步的sp指针,在include/configs/smdkv210.h +228修改
- //#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - 0x1000000)
- #define CONFIG_SYS_INIT_SP_ADDR (0x30000000)
4.修改board/samsung/smdkv210/smdkc100.c +80
- int checkboard(void)
- {
- printf("Board:\tSMDKv210\n");
- return 0;
- }
5.修改include/configs/smdkv210.h +51
- //#define CONFIG_SYS_SDRAM_BASE 0x30000000
- #define CONFIG_SYS_SDRAM_BASE 0x20000000
6.修改include/configs/smdkv210.h +189
- //#define PHYS_SDRAM_1_SIZE (128 << 20) /* 0x8000000, 128 MB Bank #1 */
- #define PHYS_SDRAM_1_SIZE (0x40000000) /* 0x8000000, 128 MB Bank #1 */
7.修改board/samsung/smdkv210/config.mk +16
- CONFIG_SYS_TEXT_BASE = 0x5ff00000
8.修改 arch/arm/config.mk +88
- #LDFLAGS_u-boot += -pie
9.修改include/configs/smdkv210.h +216
- //#define CONFIG_ENV_IS_IN_ONENAND 1
- #define CONFIG_ENV_IS_NOWHERE
10.修改arch/arm/lib/board.c +384
- //addr -= gd->mon_len;
- addr = 0x5ff00000;
11.因为bl1已经复制程序到指定的地址就不需要重新定位代码了,但还是需要重新设置栈,所以修改了上面的第8步,修改arch/arm/cpu/armv7/start.S +192
- ENTRY(relocate_code)
- mov r4, r0 /* save addr_sp */
- mov r5, r1 /* save addr of gd */
- mov r6, r2 /* save addr of destination */
- #if 0
- //debug
- ldr r0, =0xE0200C00
- ldr r1, =0x1111
- str r1, [r0]
- ldr r0, =0xE0200C04
- ldr r1, =(7)
- str r1, [r0]
- #endif
- mov sp, r4
- mov r0, r5
- mov r1, r6
- bl board_init_r
- #if 0
- /* Set up the stack */
- stack_setup:
- mov sp, r4
- adr r0, _start
- cmp r0, r6
- moveq r9, #0 /* no relocation. relocation offset(r9) = 0 */
- beq clear_bss /* skip relocation */
- mov r1, r6 /* r1 <- scratch for copy_loop */
- ldr r3, _image_copy_end_ofs
- add r2, r0, r3 /* r2 <- source end address */
- copy_loop:
- ldmia r0!, {r9-r10} /* copy from source address [r0] */
- stmia r1!, {r9-r10} /* copy to target address [r1] */
- cmp r0, r2 /* until source end address [r2] */
- blo copy_loop
- /*
- * fix .rel.dyn relocations
- */
- ldr r0, _TEXT_BASE /* r0 <- Text base */
- sub r9, r6, r0 /* r9 <- relocation offset */
- ldr r10, _dynsym_start_ofs /* r10 <- sym table ofs */
- add r10, r10, r0 /* r10 <- sym table in FLASH */
- ldr r2, _rel_dyn_start_ofs /* r2 <- rel dyn start ofs */
- add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
- ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
- add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
- fixloop:
- ldr r0, [r2] /* r0 <- location to fix up, IN FLASH! */
- add r0, r0, r9 /* r0 <- location to fix up in RAM */
- ldr r1, [r2, #4]
- and r7, r1, #0xff
- cmp r7, #23 /* relative fixup? */
- beq fixrel
- cmp r7, #2 /* absolute fixup? */
- beq fixabs
- /* ignore unknown type of fixup */
- b fixnext
- fixabs:
- /* absolute fix: set location to (offset) symbol value */
- mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */
- add r1, r10, r1 /* r1 <- address of symbol in table */
- ldr r1, [r1, #4] /* r1 <- symbol value */
- add r1, r1, r9 /* r1 <- relocated sym addr */
- b fixnext
- fixrel:
- /* relative fix: increase location by offset */
- ldr r1, [r0]
- add r1, r1, r9
- fixnext:
- str r1, [r0]
- add r2, r2, #8 /* each rel.dyn entry is 8 bytes */
- cmp r2, r3
- blo fixloop
- b clear_bss
- _rel_dyn_start_ofs:
- .word __rel_dyn_start - _start
- _rel_dyn_end_ofs:
- .word __rel_dyn_end - _start
- _dynsym_start_ofs:
- .word __dynsym_start - _start
- clear_bss:
- ldr r0, _bss_start_ofs
- ldr r1, _bss_end_ofs
- mov r4, r6 /* reloc addr */
- add r0, r0, r4
- add r1, r1, r4
- mov r2, #0x00000000 /* clear */
- clbss_l:cmp r0, r1 /* clear loop... */
- bhs clbss_e /* if reached end of bss, exit */
- str r2, [r0]
- add r0, r0, #4
- b clbss_l
- clbss_e:
- /*
- * We are done. Do not return, instead branch to second part of board
- * initialization, now running from RAM.
- */
- jump_2_ram:
- /*
- * If I-cache is enabled invalidate it
- */
- #ifndef CONFIG_SYS_ICACHE_OFF
- mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
- mcr p15, 0, r0, c7, c10, 4 @ DSB
- mcr p15, 0, r0, c7, c5, 4 @ ISB
- #endif
- /*
- * Move vector table
- */
- #if !defined(CONFIG_TEGRA20)
- /* Set vector address in CP15 VBAR register */
- ldr r0, =_start
- add r0, r0, r9
- mcr p15, 0, r0, c12, c0, 0 @Set VBAR
- #endif /* !Tegra20 */
- ldr r0, _board_init_r_ofs
- adr r1, _start
- add lr, r0, r1
- add lr, lr, r9
- /* setup parameters for board_init_r */
- mov r0, r5 /* gd_t */
- mov r1, r6 /* dest_addr */
- /* jump to it ... */
- mov pc, lr
- _board_init_r_ofs:
- .word board_init_r - _start
- #endif
- ENDPROC(relocate_code)
- #endif
重新make一下,使用下面命令烧写到sd卡里,插入开发板启动即可,看看上面的启动信息,还有很多很多地方要完善~
- dd iflag=dsync oflag=dsync if=blSD.bin of=/dev/sdb seek=1
- dd iflag=dsync oflag=dsync if=u-boot.b
s5pv210 uboot-2012-10移植(二) 之能够启动进入控制台的更多相关文章
- u-boot-2012.10移植到AT91RM9200(包括NAND FLASH)
基于中嵌SRM9204 目 录 1 配置 1.1修改顶层Makefile(可选) 1.2配置 1.3下载.运行.测试 2 修改内存配置参数(根据芯片手册修改) 2.1 修改配置参数 2.2 编译 2 ...
- 移植u-boot.2012.04.01
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
- [学习资料] Tiny210(S5PV210) u-boot移植
Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...
- ok6410 u-boot-2012.04.01移植二修改源码支持单板
继ok6410 u-boot-2012.04.01移植一后修改代码,对ok6410单板初始化,主要包括时钟.串口.NAND.DDR等初始化.这些工作在以前的裸板程序都写了,直接拿来用.我觉得先写裸板程 ...
- Linux之uboot分析与移植20160601
说一下uboot分析与移植: 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因 tar xjf u-boot-2012.04.01.tar.bz2 cd u-boot-2 ...
- SQLServer 2012异常问题(二)--由安装介质引发性能问题
原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后 ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...
- table-cell http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html
http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html
- u-boot分析1:Nandflash、Norflash启动
了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Univ ...
随机推荐
- [USACO17JAN]Promotion Counting
线段树合并. 正解好像不是线段树合并,但是出于练手的目的写了线段树合并. 大概就是对于左右子树,如果有一个为空,返回非空的,如果都不为空,就把这两个整合到一起就行了. #include <ios ...
- join()与os.path.join()的用法
join:连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串 os.path.join(): 将多个路径组合后返回 一.函数说明 1.join()函数 语法:‘ ...
- 参数化取值策略Sequential
1.Sequential+Each iteration(顺序方式+每次迭代更新取值),设置Run—Logic中action循环迭代11次,并运行以上脚本,结果如下: 2.Sequential+ ...
- Android之怎样给ListView加入过滤器
给ListView加入文字过滤器: //this.getListView().setTextFilterEnabled(true);//可能报错用以下的 listView.setTextFilterE ...
- Hdu 4280 Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- java 微信server录音下载到自己server
/** * @author why * */ public class VoiceDownload { /** * * 依据文件id下载文件 * * * * @param mediaId * * 媒体 ...
- Linux多线程实践(一)线程基本概念和理论
线程概念 在一个程序里的一个运行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每一个进程至少有一个运行线程; 进程 VS. 线 ...
- Android学习笔记(十二)——使用意图传递数据的几种方式
使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...
- 英语发音规则---S字母
英语发音规则---S字母 一.总结 一句话总结: 1.S 在音节开头或清辅音前 /s/? sit /sɪt/ vt.& vi.坐 seat /si:t/ n.席位 sell /sel/ vt. ...
- Oracle多表连接效率,性能优化
Oracle多表连接,提高效率,性能优化 (转) 执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只 ...