?? 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 + -