⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nandflash.c

📁 优龙板的nand flash驱动程序
💻 C
字号:
#include "def.h"
#include "option.h"
static U32 nand_id;
 int  support;
void NandFlashInit (void)
{
int i;
support = 0;
nand_id = NFReadID ();
for (i=0; NandFlashChip[i].id! =0; i++)
if (NandFlashChip [I] .id==nand_id) {
nand_id = i;
NandFlashSize = NandFlashChip[i].size;
support = 1;
NandAddr = NandFlashSize>SIZE_32M;
if (! pNandPart [0].size) {
pNandPart [0].offset = 0;
pNandPart [0].size = NandFlashSize;
pNandPart [1].size = 0;
}
return;
}
}
void NandFlashStatusRep(void)
{
if(support) {
printf("Nand Flash ID is 0x%x, Size = %dM, Status = 0x%x\n",
NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20,
NFReadStat());
} else {
printf("No supported Nand Flash Found!\n");
}
}

static U32 NFEraseBlock(U32 addr)
{
U8 stat;
addr &= ~0x1f;
NFChipEn();
NFWrCmd(ERASECMD0);
NFWrAddr(addr);
NFWrAddr(addr>>8);
if(NandAddr)
NFWrAddr(addr>>16);
NFWrCmd(ERASECMD1);
stat = NFWaitBusy();
NFChipDs();
#ifdef ER_BAD_BLK_TEST
if(!((addr+0xe0)&0xff)) stat = 1; //just for test bad block
#endif
putch('.');
return stat;
}

static void NFReadPage(U32 addr, U8 *buf)
{
U16 i;
NFChipEn();
NFWrCmd(READCMD0);
NFWrAddr(0);
NFWrAddr(addr);
NFWrAddr(addr>>8);
if(NandAddr)
NFWrAddr(addr>>16);
// InitEcc();
NFWaitBusy();
for(i=0; i<512; i++)
buf[i] = NFRdDat();
NFChipDs();
}

static U32 NFWritePage(U32 addr, U8 *buf, U16 blk_idx)
{
U16 i, stat;
// U8 tmp[3];
U8 ecc_code[3];
U8 oob_info[16];
for(i=0; i<sizeof(oob_info); i++)
oob_info[i] = 0xff;
nand_calculate_ecc(buf, ecc_code);
oob_info[eccpos[0]] = ecc_code[0];
oob_info[eccpos[1]] = ecc_code[1];
oob_info[eccpos[2]] = ecc_code[2];
nand_calculate_ecc(buf+256, ecc_code);
oob_info[eccpos[3]] = ecc_code[0];
oob_info[eccpos[4]] = ecc_code[1];
oob_info[eccpos[5]] = ecc_code[2];
oob_info[BLK_IDXL] = blk_idx;
oob_info[BLK_IDXH] = blk_idx>>8;
oob_info[FMT_TAG] = format_tags[addr&0x1f];
NFChipEn();
NFWrCmd(PROGCMD0);
NFWrAddr(0);
NFWrAddr(addr);
NFWrAddr(addr>>8);
if(NandAddr)
NFWrAddr(addr>>16);
// InitEcc();
for(i=0; i<512; i++)
NFWrDat(buf[i]);
if(!addr) {
NFWrDat('b');
NFWrDat('o');
NFWrDat('o');
NFWrDat('t');
} else {
for(i=0; i<sizeof(oob_info); i++)
NFWrDat(oob_info[i]);
}
NFWrCmd(PROGCMD1);
stat = NFWaitBusy();
NFChipDs();
#ifdef WR_BAD_BLK_TEST
if((addr&0xff)==0x17) stat = 1; //just for test bad block
#endif
if(stat)
printf("Write nand flash 0x%x fail\n", addr);
else {
U8 RdDat[512];
NFReadPage(addr, RdDat);
for(i=0; i<512; i++)
if(RdDat[i]!=buf[i]) {
printf("Check data at page 0x%x, offset 0x%x fail\n", addr, i);
stat = 1;
break;
}
}
return stat;
}

void NandFlash_Test( void )
{
U16 m,n ;
U8 d[640] ;
//擦除NandFlash
printf( "\nNand Flash Erase Block!\n\n" ) ;
for( m = 0 ; m < 0x200 ; m += 0x20 ) NFEraseBlock( m ) ;
//给要写入nandflash 的数组赋值
for( m = 0 ; m < 640 ; m++ ) d[m] = m ;
//页写方式将数组依次写入nandflash,一次写入512 字节
printf( "\nNand Flash Write Page!\n\n" ) ;
NFWritePage( 0, d, 0 ) ;
//将数组全部清零
for( m = 0 ; m < 640 ; m++ ) d[m] = 0 ;
//页读方式将nandflash 的0 地址数据读出并写到数组
printf( "\nNand Flash Read Page!\n\n" ) ;
NFReadPage( 0, d ) ;
//将数组里面的数据依次打印出来,验证写入与读出是否相符
for( m = 0; m < 40; m++ )
{
for( n = 0; n < 16; n++ )
printf( "%2x ", d[m*16+n] ) ;
printf("\n");
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -