参考链接1:(该链接针对《嵌入式Linux应用 开发完全手册》上的例子并结合K9F1G08做了相应的修改,并附了源码)
http://blog.chinaunix.net/space.php?uid=22365684&do=blog&id=390112
参考链接2:介绍了整个U-BOOT移植过程,整理得很详细。
http://blog.chinaunix.net/space.php?uid=22174347&do=blog&id=1786935&page=1#comment
参考链接3:结合参考链接2,针对K9F1G08芯片做了修改
http://www.linuxidc.com/Linux/2011-05/35982p3.htm
Nand Flash移植过程中针对自己Nand Flash的型号(K9F1G08U0B,128MB),修改nand_read.c文件如下
#include
#define NF_BASE 0x4E000000 //Nand Flash配置寄存器基地址
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NFCONF __REGi(NF_BASE + 0x0 ) //通过偏移量还是得到配置寄存器基地址
#define NFCONT __REGi(NF_BASE + 0x4 ) //通过偏移量得到控制寄存器基地址
#define NFCMD __REGb(NF_BASE + 0x8 ) //通过偏移量得到指令寄存器基地址
#define NFADDR __REGb(NF_BASE + 0xC ) //通过偏移量得到地址寄存器基地址
#define NFDATA __REGb(NF_BASE + 0x10) //通过偏移量得到数据寄存器基地址
#define NFSTAT __REGb(NF_BASE + 0x20) //通过偏移量得到状态寄存器基地址
#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) //Nand片选使能
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1)) //取消Nand片选
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}
#define NAND_SECTOR_SIZE 2048
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
int page_num;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
{
return -1; //地址或长度不对齐
}
NAND_CHIP_ENABLE; //选中Nand片选
for(i=start_addr; i < (start_addr + size);)
{
//发出READ0指令
NAND_CLEAR_RB;
NFCMD = 0;
//对Nand进行寻址page_num = i >> 11 ; /* addr / 2048 */NFADDR = 0;NFADDR = 0;NFADDR = page_num & 0xFF;NFADDR = (page_num >> 8) & 0xFF;NFADDR = (page_num >> 16) & 0xFF;
NFCMD = 0x30;NAND_DETECT_RB;
for(j=0; j < NAND_SECTOR_SIZE; j++, i++)
{
*buf = (NFDATA & 0xFF);
buf++;
}
}
NAND_CHIP_DISABLE; //取消片选信号
return 0;
}
环境变量问题:
在my2440.h中
//注释掉环境变量保存到Flash的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则要恢复这些Flash宏定义)
//#define CONFIG_ENV_IS_IN_FLASH 1
//#define CONFIG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
//添加环境变量保存到Nand的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则不要这些Nand宏定义)
#define CONFIG_ENV_IS_IN_NAND 1
#define CONFIG_ENV_OFFSET 0x40000 //将环境变量保存到nand中的0x40000位置
#define CONFIG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */