📄 nfdrv.c
字号:
#include "NFDrv.h"
#include "..\\spce061\\061reg.h"
#include "..\\D12\\D12CI.h"
//Function Define In NFHAL.ASM
extern void F_InitWriteNF();
extern void F_InitReadNF();
extern unsigned int F_ReadNF();
extern void F_ReadSectorNF(unsigned int Addr);
extern unsigned int g_RWBuf[];
extern void F_WriteDataToNF(unsigned int Data);
extern void F_WriteCmdToNF(unsigned int Data);
extern void F_WriteAddrToNF(unsigned int Data);
extern void F_WriteSectorToNF(unsigned int Addr);
unsigned long int gl_address;
#define NF_WaitBusy() while(!(*P_IOA_Data & 0x08))
void NandFlashInit()
{
}
void NF_Reset()
{
F_InitWriteNF();
F_WriteCmdToNF(NF_RESET_CMD);
}
void NF_ReadOpenAarea(unsigned int wColumnAddr, unsigned long int wRowAddr)
{
F_InitWriteNF();
F_WriteCmdToNF(NF_READ_A_AREA_CMD);
F_WriteAddrToNF ( wColumnAddr );
F_WriteAddrToNF ( wRowAddr);
F_WriteAddrToNF ((wRowAddr>>8)&0xff );
NF_WaitBusy();
F_InitReadNF();
}
void NF_ReadOpenCarea(unsigned int wColumnAddr, unsigned int wRowAddr)
{
F_InitWriteNF();
F_WriteCmdToNF(NF_READ_C_AREA_CMD);
F_WriteAddrToNF ( wColumnAddr );
F_WriteAddrToNF ( wRowAddr);
F_WriteAddrToNF ((wRowAddr>>8)&0xff );
NF_WaitBusy();
F_InitReadNF();
}
void NF_WriteOpenAarea(unsigned int wColumnAddr, unsigned long int wRowAddr)
{
NF_WP_CLOSE();
F_InitWriteNF();
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_A_AREA_CMD);
F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
F_WriteAddrToNF( wColumnAddr&0xff ); //1st Cycle
F_WriteAddrToNF( wRowAddr & 0xff ); //2nd Cycle
F_WriteAddrToNF( (wRowAddr>>8)&0xff ); //3th Cycle
NF_WaitBusy();
}
void NF_WriteOpenCarea(unsigned int wColumnAddr, unsigned long int wRowAddr)
{
NF_WP_CLOSE();
F_InitWriteNF();
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_C_AREA_CMD);
F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
F_WriteAddrToNF( wColumnAddr&0xff ); //1st Cycle
F_WriteAddrToNF( wRowAddr & 0xff ); //2nd Cycle
F_WriteAddrToNF( (wRowAddr>>8)&0xff ); //3th Cycle
NF_WaitBusy();
}
void NF_ReadMultiByte(unsigned long int dAddr, unsigned int wLen, unsigned int *wrData )
{
unsigned int i;
F_InitWriteNF();
NF_WaitBusy();
F_WriteCmdToNF((dAddr>>8)&0x1 );
F_WriteAddrToNF(dAddr); //1st Cycle
F_WriteAddrToNF((dAddr>>9)&0xff); //2nd Cycle
F_WriteAddrToNF((dAddr>>17)&0xff); //3th Cycle
F_InitReadNF();
NF_WaitBusy();
for(i=0; i<wLen; i++)
{
*wrData++ = F_ReadNF();
}
}
void NF_PageRead(unsigned int wColumnAddr,unsigned long int wRowAddr, unsigned int *wrData)
{
unsigned int i;
F_InitWriteNF();
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_A_AREA_CMD);
F_WriteAddrToNF(wColumnAddr &0xff); //1st Cycle
F_WriteAddrToNF(wRowAddr & 0xff); //2nd Cycle
F_WriteAddrToNF(wRowAddr>>8 & 0xff); //3th Cycle
F_InitReadNF();
NF_WaitBusy();
F_ReadSectorNF(wrData);
}
unsigned int NF_ReadID()
{
unsigned int tData;
F_InitWriteNF();
F_WriteCmdToNF(NF_READ_ID_CMD);
F_WriteAddrToNF(0x00);
F_InitReadNF();
tData=F_ReadNF(); //Read MakerCode
tData = (tData<<8)&0xff00;
tData |= F_ReadNF(); //Read DeviceCode
return(tData); //Return Maker(H8) & Device(L8) Code
}
unsigned int NF_PageProgram(unsigned int wColumnAddr, unsigned long int wRowAddr, unsigned int *wrData)
{
unsigned int i;
NF_WP_CLOSE();
F_InitWriteNF();
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_A_AREA_CMD);
F_WriteCmdToNF(NF_SEQUENTIAL_DATA_INPUT_CMD);
F_WriteAddrToNF( wColumnAddr&0xff ); //1st Cycle
F_WriteAddrToNF( wRowAddr & 0xff ); //2nd Cycle
F_WriteAddrToNF( (wRowAddr>>8)&0xff ); //3th Cycle
NF_WaitBusy();
F_WriteSectorToNF(wrData);
F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_STATUS_CMD ); /*Read Status */
F_InitReadNF();
NF_WP_OPEN();
return (F_ReadNF());
}
/*F**************************************************************************
* NAME: NF_MarkBadBlock
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* Write 0x00 on block status byte (Byte 5 of spare data)
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* This function use the global variable Uint32 address
*----------------------------------------------------------------------------
* REQUIREMENTS:
* ram/xram:
* cycle:
* stack:
* code:
*****************************************************************************/
void NF_MarkBadBlock(void)
{
NF_WaitBusy();
NF_WriteOpenCarea(0x00,gl_address);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteDataToNF(0xFF);
F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
NF_WaitBusy();
}
unsigned int NF_EraseBlock(unsigned long int Addr32 )
{
*P_Watchdog_Clear=0x0001;
F_InitWriteNF();
NF_WP_CLOSE();
Addr32 = Addr32<<5 ; //(Sector -> Block) Address
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_A_AREA_CMD);
F_WriteCmdToNF(NF_BLOCK_ERASE_CMD); /* Auto Block Erase Setup */
F_WriteAddrToNF( Addr32 & 0xff ); /* 2nd address cycle */
F_WriteAddrToNF((Addr32>>8)&0xff); /* 3rd address cycle */
F_WriteCmdToNF(NF_BLOCK_ERASE_CONFIRM_CMD); /* Erase command */
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_STATUS_CMD ); /*Read Status */
F_InitReadNF();
NF_WP_OPEN();
return (F_ReadNF()); //Return Status
}
/*F**************************************************************************
* NAME: nf_erase_all_block
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
* OK : erase done
* KO : erase not done
*----------------------------------------------------------------------------
* PURPOSE:
* This function erase all blocks on a NF card and write CIS information
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* This function use the global variable Uint32 address
*----------------------------------------------------------------------------
* REQUIREMENTS:
* ram/xram:
* cycle:
* stack:
* code:
*****************************************************************************/
void nf_erase_all_block (void)
{
unsigned int i, badBlockDetect;
// Erase All Block
for(gl_address = 0; gl_address < 2048; gl_address++)
{
NF_WaitBusy();
NF_ReadOpenCarea(0x05,gl_address*32);
if( F_ReadNF() == 0xff )
{
if( NF_EraseBlock(gl_address) & 0x01)
{// Error in Erase
NF_MarkBadBlock();
}
else
{// Successful in Erase
NF_WaitBusy();
NF_WriteOpenCarea(0x00,gl_address*32);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteDataToNF(0x00);
F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD); /* Valid the page programmation */
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_STATUS_CMD ); /*Read Status */
if(0x01 & F_ReadNF())
{// Error in Program
NF_MarkBadBlock();
}
badBlockDetect = 0;
NF_ReadOpenCarea(0x00,gl_address*32);
for (i = 16; i != 0; i--)
{
if (F_ReadNF() != 0x00) badBlockDetect = 1;
}
if (badBlockDetect)
{
NF_MarkBadBlock();
}
else
{
if( NF_EraseBlock(gl_address) & 0x01)
{// Error in Erase
NF_MarkBadBlock();
}
}
}
}//Success Erase End
} //For End
}
void DMA_NFtoD12(unsigned long int wAddr, unsigned int nbSector)
{
unsigned int nbPage;
while(nbSector--)
{
NF_ReadOpenAarea(0x00,wAddr++);
nbPage=8;
while(nbPage--)
{
do
{
F_InitWriteD12();
F_WriteCmdToD12(0x05);
F_InitReadD12();
}while((F_ReadD12() & 0x01)); // Wait (D12-Data) is Empty
F_InitWriteD12();
F_WriteCmdToD12(0xF0);
F_WriteDataToD12(0x00);
F_WriteDataToD12(64);
// Write Data -> D12 (-- DMA MODE --)
F_DMA_NFtoD12_64B();
F_InitWriteD12();
F_WriteCmdToD12(0x00FA);
// Clear D12 Interrupt
// F_D12_ReadLastTransactionStatus(5);
}
}
F_D12_ReadLastTransactionStatus(5);
do
{
F_InitWriteD12();
F_WriteCmdToD12(0x05);
F_InitReadD12();
} while((F_ReadD12() & 0x01)); // Wait (D12-Data) is Empty
}
void DMA_D12toNF(unsigned long int wAddr, unsigned int nbSector)
{
unsigned int nbPage;
while(nbSector--)
{
NF_WriteOpenAarea(0x00,wAddr++);
nbPage=8;
while(nbPage--)
{
do
{
F_InitWriteD12();
F_WriteCmdToD12(0x04);
F_InitReadD12();
}while(!(F_ReadD12() & 0x01)); // Wait (D12-Data) is Full
F_InitWriteD12();
F_WriteCmdToD12(0x00F0);
F_InitReadD12();
F_ReadD12(); //Empty Read(1)
F_ReadD12(); //Empty Read(2)
// Write Data -> D12 (-- DMA MODE --)
F_DMA_D12toNF_64B();
F_InitWriteD12();
F_WriteCmdToD12(0x00F2);
}
// Page Program
F_InitWriteNF();
F_WriteCmdToNF(NF_PAGE_PROGRAM_CMD);
NF_WaitBusy();
F_WriteCmdToNF(NF_READ_STATUS_CMD ); /*Read Status */
F_InitReadNF();
if(F_ReadNF() &0x01) ;//UartSendData(0xaa);
}
// Clear D12 Interrupt
F_D12_ReadLastTransactionStatus(4);
NF_WP_OPEN();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -