四、移植u-boot-2016.03到Jz2440之修改代码支持NAND启动

本文详细介绍U-Boot 2016.03版本在Jz2440开发板上的移植过程,重点讲解从NAND Flash启动的实现方法。文章覆盖去除-pie选项、添加初始化代码、修改启动流程及链接地址等关键步骤。

4. 移植u-boot-2016.03之修改代码支持NAND启动

    对于Jz2440开发板,它不仅支持NOR Flash启动,还支持从NAND Flash启动。那么NOR Flash启动与NAND Flash启动有什么区别呢?NOR 启动,上电后NOR Flash被映射到0x00000000地址,然后CPU从0x00000000开始运行;NAND启动,上电后CPU自动将NAND Flash中的前4K代码拷贝到SRAM,SRAM被映射为0x00000000地址,CPU从0x00000000开始运行。uboot的大小远远大于4k,因此需要在代码的前4k中完成代码的重定位,即把NAND Flash的代码拷贝到SDRAM中。关于代码的重定位知识,可以看韦东山老师的博客S3c2440代码重定位详解

4.1 去"-pie"、"checkarmreloc"选项

    原来的代码在链接时加了”-pie”选项,使得u-boot.bin里多了*(.rel*)段,程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K),因此我们需要去掉**"-pie"**选项。
(1) 在u-boot 的顶层目录中搜索"pie":grep "\-pie" * -nR,搜索结果如下:
在这里插入图片描述
从上图可以发现,"pie"选项在arch/arm/config.mk的第83行,那么我们进去把它注释掉,如下图所示:
在这里插入图片描述
然后执行如下命令重新编译:

make distclean
make jz2440_defconfig
make

最后发现如下错误:
在这里插入图片描述
checkarmreloc正如其名,它是检查arm相对位置的选项,可能是没找到arm,所以出错,对程序整体没有影响,注释掉就不检查了,编译能通过;在uboot顶层目录搜索checkarmrelocgrep "checkarmreloc" * -nR,搜索结果如下:
在这里插入图片描述
从上图可以发现,"checkarmreloc"选项在arch/arm/config.mk的第105行,那么我们进去把它注释掉,如下图所示:
在这里插入图片描述
然后重新编译就成功编译通过了。

4.2 添加init.c程序

(1) 把之前编写好的init.c文件放到board/samsung/jz2440目录,init.c文件的代码如下:

/*那么如何判断是NOR启动还是NAND启动呢? 可以利用NOR的特点:
 *1.NOR可以像内存一样读,但不可以像内存一样写;
 *2.可以通过向0地址写数据已区分是NAND启动还是NOR启动;
 *(因为NAND启动时,0地址是RAM,可读可写;但NOR启动时,0地址是NOR FLASH,可读不可写)
 *返回值:1:Nor启动; 0:NAND启动
 */
#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 long *)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)


/* NAND flash 设置时序(需要对比s3c2440与NAND手册的NAND时序)
 *
 */
void nand_init_ll(void)
{
   
   
	/*设置NANDFlash时序*/
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
    NFCONF &= ~((3<<12)|(7<<8)|(7<<4));
	NFCONF |= (TACLS<<12)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Louis@L.M.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值