让U-BOOT支持从NAND FLASH启动
在移植之前,我们首先要知道ARM开发板从NAND和NOR FLASH启动有什么区别。
关于这块内容的介绍,推荐看一下这个博主的文章,讲的还是蛮具体的,链接: [https://www.cnblogs.com/aaronLinux/p/5540606.html].
这边我们只需要知道如果要从NAND FLASH启动,那么我们在对代码重定位之前的程序不能大于4K。所以在这4K的程序中我们一般要做这些事情:
- 初始化基本底层硬件,如时钟,看门狗,中断等。
- 初始化内存控制器。
- 初始化SDRAM。
- 复制代码到SDRAM。
- 清除BSS段。
- 跳转到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