U-Boot在2440上Nand Flash移植过程问题整理

2019-07-13 01:05发布

参考链接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 */