您的位置:首页 > 其它

06-S3C2440学习之移植2012u-boot到S3C2440(移植过程二)支持NAND启动

2017-04-19 16:50 621 查看
说明:

原来的代码在链接时加了"-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启动,启动成功!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐