说明:
原来的代码在链接时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)","*(.dynsym)"(*(.rel*)","*(.dynsym)这些地址信息用于实现UBOOT可以被拷贝到任何地方,更新地址信息),但使得程序非常大,结构复杂,不利于从NAND启动(重定位之前的启动代码应该少于4K)。所提去掉了pie功能。
(1)使用一下之前写的init.c
拷贝到2440单板下:
修改init内容为:
/* 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 long *)0x50000010)
#define UTXH0 (*(volatile unsigned char *)0x50000020)
#define URXH0 (*(volatile unsigned char *)0x50000024)
#define UBRDIV0 (*(volatile unsigned long *)0x50000028)
#define TXD0READY (1<<2)
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void)
{
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
}
void clear_bss(void)
{
}
void nand_init_ll(void)
{
}
static void nand_select(void)
{
}
static void nand_deselect(void)
{
}
static void nand_cmd(unsigned char cmd)
{
}
static void nand_addr(unsigned int addr)
{
}
static void nand_wait_ready(void)
{
}
static unsigned char nand_data(void)
{
}
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
}
(2)使用
已经设置好栈,进行nand初始化、重定位等操作
参考:
拷贝:
链接地址为:
为汇编 可能存到4K之外,所以改为这个,地址定死了。这就是程序的链接地址。
这个值要修改:(64M 中预留512K给uboot)
Ofs就是大小,r0 r1 r2 分别是源 目的 大小
(3)清bss段
(4)从片内 跳转到SDRAM中。
(5)修改board_init_f,把relocate_code去掉
(6)删掉多余的清BSS
从
删除到:
(7)调用第二阶段
需要使用ID这个参数 上一个函数来返回这个值
(8)更新修改过的文件
start.S (arch\arm\cpu\arm920t)
Board.c (arch\arm\lib)
Init.c (board\samsung\smdk2440)
Smdk2440.h (include\configs)
(9)修改makefile
viboard/samsung/smdk2440/Makefile
(10)修改去掉"-pie"选项
arch/arm/config.mk:75:LDFLAGS_u-boot +=-pie 去掉这行
viarch/arm/config.mk +75
(11)修改链接脚本: 把start.S, init.c, lowlevel.S等文件放在最前面
(12)make后会出现几个错误:
函数声明错误,改成有返回值的
函数名称已经修改
(13)计算大小
(14)预留了1M给uboot,make,生成反汇编
(15)到此,下载到nand 从nand启动,启动成功!