现在的位置: 首页 > 综合 > 正文

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

2013年03月04日 ⁄ 综合 ⁄ 共 2045字 ⁄ 字号 评论关闭
参考链接1:(该链接针对《嵌入式Linux应用 开发完全手册》上的例子并结合K9F1G08做了相应的修改,并附了源码)
参考链接2:介绍了整个U-BOOT移植过程,整理得很详细。
参考链接3:结合参考链接2,针对K9F1G08芯片做了修改


Nand Flash移植过程中针对自己Nand Flash的型号(K9F1G08U0B,128MB),修改nand_read.c文件如下

#include <config.h>

#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 */

抱歉!评论已关闭.