📄 nand.c
字号:
/*****************************************************************************
* nand.c: nand flash read and write
*
* Copyright(C) 2007, uCdragon
* All rights reserved.
*
* History
* 2007.03.16 lqm@ucdragon.net
*
******************************************************************************/
#include "nand.h"
#ifdef NAND_FLASH_SUPPORT
typedef struct
{
U32 id;
U32 size;
}NFChipInfo;
static NFChipInfo NandFlashChip[] =
{
{0xec73, SIZE_16M}, {0xec75, SIZE_32M}, {0xec76, SIZE_64M},
{0xec79, SIZE_128M}, {0, 0},
};
static NFChipInfo * pNand = 0;
static BOOL NandAddr;
#define READCMD0 0
#define READCMD1 1
#define READCMD2 0x50
#define ERASECMD0 0x60
#define ERASECMD1 0xd0
#define PROGCMD0 0x80
#define PROGCMD1 0x10
#define QUERYCMD 0x70
#define READIDCMD 0x90
#define RESETCMD 0xFF
#define NFWrCmd(cmd) *(volatile U8 *)NandFlash_CLE = (cmd)
#define NFWrAddr(addr) *(volatile U8 *)NandFlash_ALE = (addr)
#define NFWrDat(dat) *(volatile U8 *)NandFlash_DATA =(dat)
#define NFRdDat() *(volatile U8 *)NandFlash_DATA
static U32 NFWaitBusy( void )
{
U8 stat;
NFWrCmd(QUERYCMD) ;
do
{
stat = NFRdDat();
}
while ( !( stat & 0x40 ) ) ;
NFWrCmd(READCMD0) ;
return stat & 1 ;
}
static U32 NFReadID( void )
{
U32 id, loop = 0;
NFChipEn();
NFWrCmd( RESETCMD );
NFWrAddr( 0 );
Delay( 2 );
NFWrCmd( READIDCMD );
NFWrAddr( 0 );
while ( ( NFIsBusy() ) && ( loop < 10000 ) )
loop++;
if ( loop >= 10000 )
return 0;
id = NFRdDat() << 8;
id |= NFRdDat();
NFChipDs();
return id;
}
int NandInit( void )
{
U32 id = NFReadID();
pNand = NandFlashChip;
while(pNand->id)
{
if(pNand->id == id) break;
pNand++;
}
if(!pNand->id) pNand = 0;
else
{
NandAddr = pNand->size >= SIZE_64M;
}
return id;
}
U32 NFEraseBlock( U32 addr )
{
U8 stat;
addr &= NAND_BLOCK_MASK;
NFChipEn();
NFWrCmd( ERASECMD0 );
NFWrAddr( addr );
NFWrAddr( addr >> 8 );
if ( NandAddr )
NFWrAddr( addr >> 16 );
NFWrCmd( ERASECMD1 );
stat = NFWaitBusy();
NFChipDs();
//printf( "Erase block 0x%08x %s\n" , addr , stat ? "fail" : "ok" );
return stat;
}
//addr = page address
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 < NAND_SECTOR_LEN; i++ )
buf[i] = NFRdDat();
NFChipDs();
}
//addr = page address
U32 NFWritePage( U32 addr , U8* buf )
{
U32 i = NAND_SECTOR_LEN, stat;
while (NFIsBusy());
NFChipEn();
NFWrCmd( READCMD0 );
NFWrCmd( PROGCMD0 );
NFWrAddr( 0 );
NFWrAddr( addr );
NFWrAddr( addr >> 8 );
if ( NandAddr )
NFWrAddr( addr >> 16 );
// InitEcc();
while(i--)
NFWrDat( *buf++ );
NFWrCmd( PROGCMD1 );
stat = NFWaitBusy();
NFChipDs();
return stat;
}
#endif /* NAND_SUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -