移植U-BOOT-2016.11到JZ2440详细教程(4)

让U-BOOT支持从NAND FLASH启动

在移植之前,我们首先要知道ARM开发板从NAND和NOR FLASH启动有什么区别。
关于这块内容的介绍,推荐看一下这个博主的文章,讲的还是蛮具体的,链接: [https://www.cnblogs.com/aaronLinux/p/5540606.html].
这边我们只需要知道如果要从NAND FLASH启动,那么我们在对代码重定位之前的程序不能大于4K。所以在这4K的程序中我们一般要做这些事情:

  1. 初始化基本底层硬件,如时钟,看门狗,中断等。
  2. 初始化内存控制器。
  3. 初始化SDRAM。
  4. 复制代码到SDRAM。
  5. 清除BSS段。
  6. 跳转到SDRAM继续执行。

接着我们就按着上面的顺序一步一步移植代码。

取消链接时U-BOOT提供的PIE选项

在链接的时候,如果我们启用了PIE功能,那么程序中的变量就会被抽出来放到代码段后面的一些特殊段,而这些变量的地址肯定超过了4K,无法再访问了。所以我们要去除这个PIE功能。
首先直接用 “#”注释掉pie选项:
arch/arm/config.mk,第89行

# LDFLAGS_u-boot += -pie

然后2016版的U-BOOT和韦东山老师移植的2012版有一个区别就是在第111行添加了一个检查ARM相对位置的选项,因为我们已经警用了pie选项,所以我们也要把这个注释掉,不然编译会报错。修改后如下:

# ALL-y += checkarmreloc

现在关于pie就改好了,在后续程序中我们就不需要在重定位代码后再去计算变量的相对位置。

指定链接地址

关于链接地址,运行地址等,推荐看一下这篇文章,链接: [https://www.cnblogs.com/douzi2/p/4970632.html].这边我们只需要知道运行地址和链接地址最好要一致,不然程序会出错跑飞。但是有一种典型的例外就是u-boot从NAND FLASH启动的过程。

在链接U-BOOT的时候我们往往把他的链接地址设为SDRAM的地址,虽然指定了链接地址,但是程序自己不知道现在是运行在哪个地址。所以开发板一上电,程序正常的从CPU片内0地址开始运行,当我们把所有的准备工作都做好后,通过一条跳转指令跳转到链接地址,程序就从SDRAM上接着往下执行。注意在这个过程中不能使用位置有关码,至于什么是位置有关,什么是位置无关推荐上一看下上面那篇文章。

S3C2440的SDRAM的起始地址是0x30000000,我们接的片外SDRAM的大小为64M(0x4000000),可以计算出SDRAM的地址为0x30000000~0x34000000。我们给u-boot 1Mb的空间来存放。所以修改代码如下:

include/configs/smdk2440.h

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值