在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印。

在上节。我们看到调用 relocate_code 重定位。在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明。

u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定:

当使用-pie 选项后。链接器会生成一个修正表(fixup  tables)。在终于的二进制文件 u-boot.bin 中表现为多了 2 个段  .rel.dyn 和  .dynsym。还须要在链接脚本文件里添加这 2 个段,u-boot.bin 的链接脚本文件为 u-boot-2014.04/arch/arm/cpu/u-boot.lds。有了这 2 个段,u-boot 能够依据这 2 个段的信息将重定位后的代码的链接地址修正为其执行地址。这样
u-boot 就能够重定位到不论什么地址。

在 crt0.S 中调用 relocate_code 完毕重定位,并进行地址修正,返回后进行清 BSS 操作,然后跳转到 board.c 中的 board_init_r 函数。进行更进一步的初始化。比方网卡,然后进入 main_loop 循环。重定位后的 u-boot 内存布局例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

如今运行  make all  编译 u-boot.bin 和 u-boot-spl.bin,可是编译错误:

在clock.c的 s5pv210_get_arm-clk中使用了samsung_get_base_clock这个宏和相关的寄存器,由于之前我们的时钟代码是用汇编实现的。所以我们在arch/arm/include/asm/arch-s5pc1xx/clock.h来定义这些寄存器:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

终于生成了 u-boot.bin 和 spl/tiny210-spl.bin。查看一下 u-boot.bin 的大小:

有201588B,换成块大小201588/512 =393 我们须要改动 u-boot-spl.bin 中的 BL2 拷贝函数copy_bl2_to_ram,其定义在 u-boot-2014.04/board/samsung/tiny210/tiny210.c 将拷贝大小改为 400,拷贝 400 块,保存后再次运行  make all.使用dd命令烧写到sd卡中:

打开串口终端。选择从sd卡启动,令人兴奋的事情发生了:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

可是却卡在这里不走了。通过跟踪代码发现,在 board.c 中的 board_init_r 函数调用了 enable_caches。如今已经能够使用 puts、 printf等函数了,我们能够通过信息打印来推断程序卡在哪里了。

一路调试下去。终于发现程序卡在

onenand_init 里:

这个宏 CONFIG_CMD_ONENAND 在 tiny210.h 中定义。我们的 tiny210 开发板没有 onenand,所以将这个宏屏蔽掉:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

另外,另一些和单板相关的信息,我们能够改动一下,改动 tiny210.h

与 onenand 相关的,我们查看 u-boot-2014.04/common/Makefile,看下 env_onenand.c 是怎么被编译进u-boot.bin 的是因为定义了 CONFIG_ENV_IS_IN_ONENAND 这个宏,这个宏在 tiny210.h 中定义,我们将它屏蔽掉:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

可是编译,还是出错:

我们查看 u-boot-2014.04/common/cmd_nvedit.c说明必须指定环境变量保存位置。我们能够将环境变量保存到 SD 卡或 NAND,可是如今还没移植好,所以先临时将 CONFIG_CMD_ONENAND 和 CONFIG_ENV_IS_IN_ONENAND 这 2 个宏打开,然后在 board.c 中屏蔽 onenand 初始化代码。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2loYWlsaW4xOTkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

再次编译,成功。

因为这次的改动仅仅针对 u-boot.bin。对 u-boot-spl.bin 没有影响。因此能够仅仅烧写 u-boot.bin 到 SD 卡的扇

区 32。

好了,移植了这么久。控制台最终能够看到效果了。试试主要的u-boot命令可不能够用:

弄了这么多天,最终有了效果,之后的事情就是在这基础上进行完好了。我把这个版本号的代码放在这:tiny210_u-boot_201404_v1.1.tar.bz2有兴趣的朋友能够看看。帮忙一起完好。

tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)的更多相关文章

  1. tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 启动

    我们知道 s5pv210启动方式有非常多种,sd卡和nand flash 启动就是当中的两种,前面我们实现的都是基于sd卡启动,这节我们開始实现从nand flash 启动: 从 NAND 启动 u- ...

  2. tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC

    这节我们实现nand的ecc,保存环境变量到nand flash 中.然后把我们之前的led灯烧写到nand flash 中.开机启动.在 tiny210.h 中定义宏 CONFIG_S5PV210_ ...

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

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

  4. [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)

    建议参考文档: S5PV210-iROM-ApplicationNote-Preliminary-20091126 S5PV210_UM_REV1.1 项目介绍参考 [project X] tiny2 ...

  5. [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...

  6. Spring boot 基于Spring MVC的Web应用和REST服务开发

    Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...

  7. 基于FPGA的DW8051移植(三)

    总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了ida ...

  8. 基于STM32的uCOS-II移植详解

    百度:基于STM32的uCOS-II移植详解 源:基于STM32的uCOS-II移植详解

  9. 基于Groovy应用程序的spring boot

    spring boot CLI 它是使用Spring Boot的最简单的和快速的的方法.他是一个基于Groovy脚本的命令工具.可以按照以下步骤安装次工具: 1.去spring官网下载 http:// ...

随机推荐

  1. codevs 5790 素数序数

    5790 素数序数(筛素数版) 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold       题目描述 Description 给定一个整数n,保证n为正整数且在int范 ...

  2. 【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

    最近刷水太多标注一下防止它淹没在silver的水题中……我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班. ...

  3. Linux 下安装软件包的方法

    Linux应用软件的安装包有三种: 1) tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. 2) rpm包,如software-1.2.3-1. ...

  4. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  5. C#高级编程9-第7章 运算符和类型强制转换

    运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...

  6. String对象池的作用

    我们知道得到String对象有两种办法:String str1="hello";String str2=new String("hello");     这两种 ...

  7. 在使用完全拷贝过来的类文件(带xib文件)时,要及时修改 File's Owner

  8. ios的一些知识点

    ios的一些知识点 一 非ARC的内存管理情况 1-autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段落,开 ...

  9. Nginx和Tomcat负载均衡实现session共享

    以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ...

  10. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...