tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot.bin(打印串口控制台)

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

在上节,我们看到调用 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 内存布局如下图:

现在执行  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来定义这些寄存器:

最终生成了 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卡启动,令人兴奋的事情发生了:

但是却卡在这里不走了,通过跟踪代码发现,在 board.c 中的 board_init_r 函数调用了 enable_caches。现在已经可以使用 puts、 printf等函数了,我们可以通过打印信息来判断程序卡在哪里了。 一路调试下去,最终发现程序卡在

onenand_init 里:

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

另外,还有一些和单板相关的信息,我们可以修改一下,修改 tiny210.h

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

但是编译,还是出错:

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

再次编译,成功。

由于这次的修改只针对 u-boot.bin,对 u-boot-spl.bin 没有影响,因此可以只烧写 u-boot.bin 到 SD 卡的扇

区 32。

好了,移植了这么久,控制台终于可以看到效果了。试试基本的u-boot命令可不可以用:

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

时间: 2024-10-03 07:15:01

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

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

这节我们开始移植nand flash:通过查看帮助文档 doc/README.nand,要支持 NAND,需要配置CONFIG_CMD_NAND我们修改 tiny210.h,把 CONFIG_CMD_ONENAND 屏蔽掉,同时加上CONFIG_CMD_NAND: 编译出错 ,没有定义 CONFIG_SYS_MAX_NAND_DEVICE,最大 NAND 设备数,我们的板子只有 1 个 NAND,将其 定义为 1 再次编译,出错:未定义 NAND 的基地址,查看 S5PV210 手册, NAND

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

我们知道 s5pv210启动方式有很多种,sd卡和nand flash 启动就是其中的两种,前面我们实现的都是基于sd卡启动,这节我们开始实现从nand flash 启动: 从 NAND 启动 u-boot,需要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存.这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin.在 u-boot.bin 中的 NAND 驱动比较大,它包含了很多功能,而 u-boot-spl.b

tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)

在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印. 在上节.我们看到调用 relocate_code 重定位.在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明. u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定: 当使用-pie 选项后.链接器会生成一个修正表(fixup  tables).在终于的二进制文件 u-boot

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——NAND添加分区

这里的分区只是为了操作的方便.假设有个分区 kernel,其地址区间为 0x20000~0x320000,其大小为 0x300000 在没有分区的情况下,对这块区间的操作如下: nand erase 20000 300000        擦除操作 nand write 20000000 20000 300000    写操作 nand read 20000000 20000 300000    读操作 而有了分区的情况下,操作将变得非常简单,如下(其中 kernel 为分区名) nand er

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

这节我们实现nand的ecc,保存环境变量到nand flash 中.然后把我们之前的led灯烧写到nand flash 中,开机启动,在 tiny210.h 中定义宏 CONFIG_S5PV210_NAND_HWECC.CONFIG_SYS_NAND_ECCSIZE.CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定义了消息长度,即每多少字节进行 1 次 ECC 校验 CONFIG_SYS_NAND_ECCBYTES 定义为 13Byte,将

基于mini2440的Qt移植

花了很长时间,终于把Qt移植到mini2440开发板上了,不能说完全成功,总算是完成一大步,各中过程心酸,废话不多说,下面正式讲解移植过程. 移植环境: win7系统,虚拟机是ubuntu12.04 友善之臂mini2440开发板 Qt版本:4.8.6   交叉编译器版本:4.4.3 一.虚拟机Qt开发环境的搭建 1.上Qt的官网下载Qt的源码包:http://qt-project.org/downloads,下载版本是4.8.6,也可以下载其他的版本 2.安装Qt所需要支持的文件 sudo a

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

Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: 1 package org.windwant.spring.servlet; 2 3 import javax.servlet.Servlet; 4 import javax.servlet.ServletConfig; 5 import javax.servlet.ServletException; 6 import j

基于FPGA的DW8051移植(三)

总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了idata区间初始化循环中跳转不出来,没有进入用户程序这一块. 2) http://www.cnblogs.com/sepeng/p/4141072.html 基于FPGA的DW8051移植(二)里面将idata区间初始化去掉,程序进入了用户程序却发现在执行DelayMs 函数的时候,循环执行完毕,在最后

如何进行基于am335的boa移植?

基于am335进行boa移植,一共需要五步,下面是详细的步骤,对这方面知识比较陌生的小伙伴,可以学起来啦. 1.准备开发环境: (1)VMware 10.0 (2)Ubuntu 14.04 64bit (3)Sail335开发板 (4)交叉编译器:gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux 2.源码: (1)Boa源码:boa-0.94.13.tar.gz (2)Boa测试页面:index.html 3.移植过程: (1)移植Boa ①解压缩