📄 drv_nf.c
字号:
/* CLE, ALE set*/
colAddr=(unsigned short)(ulAddress & 0x000000ff); /* A7-0*/
pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9); /* A16-9*/
blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17); /* A24-17*/
blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25); /* A27-25*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/* write command*/
SET_CLE_L; /* set CLE low*/
SET_ALE_H; /* set ALE h*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=colAddr; /* send col address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=pageAddr; /* send page address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrL; /* send block l address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrH; /* send block h address*/
SET_ALE_L; /* set ALE L*/
#ifdef ECC
RESET_ECC;
EN_ECC;
#endif
/* DMA transfer start*/
DMA_EN;
DMA_TRIG;
/* Wait till DMA_En bit equal to "0"*/
do{}
while (CHECK_DMA_END);
#ifdef ECC
DIS_ECC;
do{}
while (!CHECK_ECC_READY);
/* Write ECC data to redundant area (first 6byte/3word)*/
ECCRet = ECC_AREA0_COL_ADDR;
pWriteData = pWriteData + 0x200; /* write ECC data to the end of pWriteData buffer*/
for (Cnt=0; Cnt<6; Cnt++){
*pWriteData ++ = * ECCRet ++;
}
pWriteData = pWriteData - 6;
for (Cnt=0; Cnt< 3; Cnt++){
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS = *(volatile unsigned short*)pWriteData;
pWriteData +=2;
}
#endif
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;
SET_CLE_L; /* set CLE l*/
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{}
while (!CHECK_BUSY); /*wait R/#B to high*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
SET_CLE_L; /* set CLE l*/
ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
if (ReadStatus & 0x1)
return FLASH_WRITE_ERR;
return RetVal;
}
//---------------------------------------------------------------------------------
// Function name : fnSMC_PageWrite
// Function description : write page data to SMC
//
// Parameters
// Input :unsigned long ulAddress page address
// Output :unsigned char* pWriteBuf buf for store write data
// I/O :void
//
// Return value :unsigned char FLASH_SUCCESS write Success
// FLASH_ECC_ERROR ecc check error
// FLASH_PAR_ERR parameter error
// FLASH_WRITE_ERR write error
// Global variable :void
//---------------------------------------------------------------------------------
unsigned char fnSMC_PageWrite( unsigned long ulAddress, unsigned char* pWriteData){
unsigned char RetVal;
unsigned char ReadStatus;
unsigned short colAddr,pageAddr,blockAddrL,blockAddrH;
unsigned short Cnt;
unsigned char* ECCRet;
unsigned char* Write_ECC;
RetVal=FLASH_SUCCESS;
#ifdef DEBUG
/* check parameter */
if (ulAddress >=(MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE))
return FLASH_PAR_ERR;
#endif
colAddr=(unsigned short)(ulAddress & 0x000000ff); /*A7-0*/
pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9); /*A16-9*/
blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17); /*A24-17*/
blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25); /*A27-25*/
SET_CLE_H; /* set CLE high*/
SET_SMC_CE_L; /*set SMC CE L */
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/* write command*/
SET_CLE_L; /* set CLE low*/
SET_ALE_H; /* set ALE h*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=colAddr; /* send col address*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=pageAddr; /* send page address*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrL; /* send block l address*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrH; /* send block h address*/
SET_ALE_L; /*set ALE L*/
#ifdef ECC
RESET_ECC;
EN_ECC;
for (Cnt=0; Cnt< 512; Cnt++){
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS = *pWriteData; /*write one byte*/
pWriteData++;
}
DIS_ECC;
do{}
while (!CHECK_ECC_READY);
/*Write ECC data to redundant area (first 6byte/3word)*/
ECCRet = ECC_AREA0_COL_ADDR;
Write_ECC = pWriteData;
for (Cnt=0; Cnt<6; Cnt++){
*Write_ECC ++ = * ECCRet ++;
}
for (Cnt=0; Cnt< 6; Cnt++){
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS = * pWriteData++;
}
#endif
SET_CLE_H; /* set CLE high
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;*/
SET_CLE_L; /*set CLE l*/
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{}
while (!CHECK_BUSY); /*wait R/#B to high*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
SET_CLE_L; /*set CLE l*/
ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
if (ReadStatus & 0x1)
return FLASH_WRITE_ERR;
SET_SMC_CE_H; /*set SMC CE H */
return RetVal;
}
//---------------------------------------------------------------------------------
// Function name : fnFlash_PageWrite
// Function description : write page data to SMC
//
// Parameters
// Input :unsigned long ulAddress page address
// Output :unsigned char* pWriteBuf buf for store write data
// I/O :void
//
// Return value :unsigned char FLASH_SUCCESS write Success
// FLASH_ECC_ERROR ecc check error
// FLASH_PAR_ERR parameter error
// FLASH_WRITE_ERR write error
// Global variable :void
//---------------------------------------------------------------------------------
unsigned char fnFlash_PageWrite( unsigned long ulAddress, unsigned char* pWriteData){
unsigned char RetVal;
unsigned char ReadStatus;
unsigned short colAddr,pageAddr,blockAddrL,blockAddrH;
unsigned short Cnt;
unsigned char* ECCRet;
unsigned char* Write_ECC;
RetVal=FLASH_SUCCESS;
#ifdef DEBUG
/* check parameter */
if (ulAddress >=(MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE))
return FLASH_PAR_ERR;
#endif
colAddr=(unsigned short)(ulAddress & 0x000000ff); /*A7-0 */
pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9); /*A16-9*/
blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17); /*A24-17*/
blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25); /*A27-25*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=AUTO_WRITE_CMD;/* write command*/
SET_CLE_L; /* set CLE low*/
SET_ALE_H; /* set ALE h*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=colAddr; /* send col address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=pageAddr; /* send page address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrL; /* send block l address*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=blockAddrH; /* send block h address*/
SET_ALE_L; /*set ALE L*/
#ifdef ECC
RESET_ECC;
EN_ECC;
#endif
for (Cnt=0; Cnt< 256; Cnt++){
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS= *(volatile unsigned short*)pWriteData;
pWriteData+=2;
}
#ifdef ECC
DIS_ECC;
do{}
while (!CHECK_ECC_READY);
/*Write ECC data to redundant area (first 6byte/3word)*/
ECCRet = ECC_AREA0_COL_ADDR;
Write_ECC = pWriteData;
for (Cnt=0; Cnt<6; Cnt++){
*Write_ECC ++ = * ECCRet ++;
}
for (Cnt=0; Cnt< 3; Cnt++){
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS = *(volatile unsigned short*)pWriteData;
pWriteData +=2;
}
#endif
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=PAGE_WRITE_CMD;
SET_CLE_L; /*set CLE l*/
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{}
while (!CHECK_BUSY); /*wait R/#B to high*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned short*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
SET_CLE_L; /*set CLE l */
ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
if (ReadStatus & 0x1)
return FLASH_WRITE_ERR;
return RetVal;
}
//---------------------------------------------------------------------------------
// Function name : fnSMC_BlockErase
// Function description : write page data to SMC
//
// Parameters
// Input :unsigned long ulAddress block address
// Output :
// I/O :void
//
// Return value :unsigned char FLASH_SUCCESS Success
// FLASH_PAR_ERR parameter error
// FLASH_ERASE_ERR erase error
// Global variable :void
//---------------------------------------------------------------------------------
unsigned char fnSMC_BlockErase(unsigned long ulAddress){
unsigned char ReadStatus;
unsigned char RetVal;
unsigned short pageAddr,blockAddrL,blockAddrH;
#ifdef DEBUG
if((ulAddress < 0 ) || ( ulAddress >= (MAX_BLK_NUM * MAX_PG_NUM * PG_SIZE) ))
return FLASH_PAR_ERR;
#endif
pageAddr=(unsigned short)((ulAddress & 0x0001fe00)>>9); /*A16-9*/
blockAddrL=(unsigned short)((ulAddress & 0x01fe0000)>>17); /*A24-17*/
blockAddrH=(unsigned short)((ulAddress & 0x0e000000)>>25); /*A27-25*/
SET_CLE_H; /* set CLE high*/
SET_SMC_CE_L; /*set SMC CE L */
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=AUTO_ERASE_CMD;/* write command*/
SET_CLE_L; /* set CLE low*/
SET_ALE_H; /* set ALE h*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=pageAddr; /* send page address*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrL; /* send block l address*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=blockAddrH; /* send block h address*/
SET_ALE_L; /*set ALE L*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=ERASE_CMD;
SET_CLE_L; /*set CLE l*/
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{}
while (!CHECK_BUSY); /*wait R/#B to high*/
SET_CLE_H; /* set CLE high*/
*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS=READ_STATUS_CMD;
SET_CLE_L; /*set CLE l*/
ReadStatus=*(volatile unsigned char*)NAND_Flash_BASE_ADDRESS;
SET_SMC_CE_H; /*set SMC CE H*/
if (ReadStatus & 0x1)
return FLASH_ERASE_ERR;
return FLASH_SUCCESS;
}
//---------------------------------------------------------------------------------
// Function name : fnFlash_BlockErase
// Function description : write page data to SMC
//
// Parameters
// Input :unsigned long ulAddress block address
// Output :
// I/O :void
//
// Return value :unsigned char FLASH_SUCCESS Success
// FLASH_PAR_ERR parameter error
// FLASH_ERASE_ERR erase error
// Global variable :void
//---------------------------------------------------------------------------------
unsigned char fnFlash_BlockErase(unsigned long ulAddress){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -