文章目录
上一节:3、移植UBOOT之新建单板-时钟-SDRAM-串口
0、总体流程
修改UBOOT支持NAND启动,原来的代码在链接时加了"-pie"
选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)"
,使得程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K)
- 1、去掉 "-pie"选项
arch/arm/config.mk:75:LDFLAGS_u-boot += -pie
去掉这行 - 2、参考"毕业班第1课"的
start.S, init.c
来修改代码
把init.c
放入board/samsung/smdk2440
目录, 修改Makefile
修改CONFIG_SYS_TEXT_BASE
为0x33f80000
修改start.S - 3、修改
board_init_f
, 把relocate_code
去掉 - 4、修改链接脚本: 把
start.S, init.c, lowlevel.S
等文件放在最前面
1、去除 -pie 编译选项
使用grep “-pie” * -nR找到:
arch/arm/config.mk:75:LDFLAGS_u-boot += -pie // LDFLAGS: arm-linux-ld的参数
所以屏蔽arch/arm/config.mk
文件的"LDFLAGS_u-boot += -pie"
这行即可
2、修改之前写的 init.c文件
将以前写uboot里的init.c放入board/samsung/smdk2440目录;
并检查是否有同名函数名,若函数只在同文件使用,则添加static.并修改Makefile;
修改vim board/samsung/smdk2440/Makefile
添加init.o
;
修改include/configs/smdk2440.h
文件,将CONFIG_SYS_TEXT_BASE
宏改为0x33f80000
,也就是uboot重定位后的位置, 这里留了512K空间供给uboot重定位,修改完的代码如下所示。
/* NAND FLASH控制器 */
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))
/* GPIO */
#define GPHCON (*(volatile unsigned long *)0x56000070)
#define GPHUP (*(volatile unsigned long *)0x56000078)
/* UART registers*/
#define ULCON0 (*(volatile unsigned long *)0x50000000)
#define UCON0 (*(volatile unsigned long *)0x50000004)
#define UFCON0 (*(volatile unsigned long *)0x50000008)
#define UMCON0 (*(volatile unsigned long *)0x5000000c)
#define UTRSTAT0 (*(volatile unsigned