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顶层目录搜索checkarmreloc:grep "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)

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

被折叠的 条评论
为什么被折叠?



