#include "nand.h"
//#include "printf.h"
static void NF_Reset()
{
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_RESET);
NF_Check_Busy();
NF_Disable();
}
#define TACLS 1
#define TWRPH0 4
#define TWRPH1 0
void NF_Init(void)
{
rGPACON &= ~(0x3f << 17);
rGPACON |= (0x3f << 17);
rNFCONF = (TACLS << 12)|(TWRPH0 << 8)|(TWRPH1 << 4);
rNFCONT = (0 << 12) | (1 << 0);
rNFSTAT = 0;
NF_Reset();
}
void NF_WritePage(unsigned int block , unsigned int page,unsigned char *buffer)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
unsigned char *bufPt = buffer;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_WRITE1);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
for(i = 0; i < 2048; i++)
{
NF_Send_Data(*bufPt++);
}
NF_Send_Cmd(NAND_CMD_WRITE2);
NF_Check_Busy();
NF_Disable();
}
void NF_ReadPage(unsigned int block ,unsigned int page,unsigned char *dstaddr)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_READ0);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
NF_Send_Cmd(NAND_CMD_READSTART);
NF_Check_Busy();
for(i = 0; i < 2048; i++)
{
dstaddr[i] = NF_Read_Byte();
}
NF_Disable();
}
void NF_EraseBlock(unsigned int block)
{
unsigned int blocknum = block << 6;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_ERASE1);
NF_Send_Addr(blocknum & 0xff);
NF_Send_Addr((blocknum >> 8) & 0xff);
NF_Send_Addr((blocknum >> 16) & 0xff);
NF_Send_Cmd(NAND_CMD_ERASE2);
NF_Check_Busy();
NF_Disable();
}
//#include "printf.h"
static void NF_Reset()
{
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_RESET);
NF_Check_Busy();
NF_Disable();
}
#define TACLS 1
#define TWRPH0 4
#define TWRPH1 0
void NF_Init(void)
{
rGPACON &= ~(0x3f << 17);
rGPACON |= (0x3f << 17);
rNFCONF = (TACLS << 12)|(TWRPH0 << 8)|(TWRPH1 << 4);
rNFCONT = (0 << 12) | (1 << 0);
rNFSTAT = 0;
NF_Reset();
}
void NF_WritePage(unsigned int block , unsigned int page,unsigned char *buffer)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
unsigned char *bufPt = buffer;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_WRITE1);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
for(i = 0; i < 2048; i++)
{
NF_Send_Data(*bufPt++);
}
NF_Send_Cmd(NAND_CMD_WRITE2);
NF_Check_Busy();
NF_Disable();
}
void NF_ReadPage(unsigned int block ,unsigned int page,unsigned char *dstaddr)
{
unsigned int i;
unsigned int blockPage = (block << 6) + page;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_READ0);
NF_Send_Addr(0x00);
NF_Send_Addr(0x00);
NF_Send_Addr(blockPage & 0xff);
NF_Send_Addr((blockPage >> 8) & 0xff);
NF_Send_Addr((blockPage >> 16) & 0x01);
NF_Send_Cmd(NAND_CMD_READSTART);
NF_Check_Busy();
for(i = 0; i < 2048; i++)
{
dstaddr[i] = NF_Read_Byte();
}
NF_Disable();
}
void NF_EraseBlock(unsigned int block)
{
unsigned int blocknum = block << 6;
NF_Reset();
NF_Enable();
NF_Enable_RB();
NF_Send_Cmd(NAND_CMD_ERASE1);
NF_Send_Addr(blocknum & 0xff);
NF_Send_Addr((blocknum >> 8) & 0xff);
NF_Send_Addr((blocknum >> 16) & 0xff);
NF_Send_Cmd(NAND_CMD_ERASE2);
NF_Check_Busy();
NF_Disable();
}