📄 nandflash.c
字号:
stat = NFRdDat();
//printf("%x\n", stat);
}while(!(stat&0x40));
NFWrCmd(READCMD0);
return stat&1;
}
#endif
/********************************************************************
Function name: NFReadID
Parameter : void
Description : 读取NAND FLASH的ID号
Return : 返回读取的ID号
Argument :
Autor & date : void
*********************************************************************/
static U32 NFReadID(void)
{
U32 id, loop = 0;
NFChipEn();
NFWrCmd(READIDCMD);
NFWrAddr(0);
while(NFIsBusy()&&(loop<10000)) loop++;
if(loop>=10000)
return 0;
id = NFRdDat()<<8;
id |= NFRdDat();
NFChipDs();
return id;
}
/********************************************************************
Function name: NFReadStat
Parameter : void
Description : 读取NAND FLASH的状态
Return : 返回读取的状态
Argument :
Autor & date : void
*********************************************************************/
static U16 NFReadStat(void)
{
U16 stat;
NFChipEn();
NFWrCmd(QUERYCMD);
stat = NFRdDat();
NFChipDs();
return stat;
}
/********************************************************************
Function name: NFEraseBlock
Parameter : U32 addr : 要擦除块的地址
Description : 擦除地址为addr的块
Return : void
Argument :
Autor & date : void
*********************************************************************/
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;
}
/********************************************************************
Function name: NandReadPage
Parameter : addr : 地址 *buf:要写入的数据
Description : 向地址addr写入数据*buf
Return : void
Argument : addr = page address
Autor & date :
*********************************************************************/
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();
}
/********************************************************************
Function name: NandWritePage
Parameter : addr : 地址 *buf:要写入的数据 blk_idx
Description : 向地址addr写入数据*buf
Return : void
Argument : addr = page address
Autor & date :
*********************************************************************/
//addr = page address
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;
}
/********************************************************************
Function name: NandFlashInit
Parameter : void
Description : 初始化Nand Flash
Return : void
Argument :
Autor & date :
*********************************************************************/
static U32 nand_id;
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;
}
}
/********************************************************************
Function name: NandFlashStatusRep
Parameter : void
Description : 读取Nand Flash的相关信息
Return : void
Argument :
Autor & date :
*********************************************************************/
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");
}
}
/********************************************************************
Function name: NandFlash_Test
Parameter : void
Description : 用来测试NAND读写实验
Return : void
Argument :
Autor & date :
*********************************************************************/
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");
}
}
#endif /* NAND_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -