Пример #1
0
static void rLB_ReadPage(U32 addr, unsigned char * to)
{
	U32 i;

	rNF_Reset();

	//  Enable the chip
	NF_nFCE_L();   
	NF_CLEAR_RB();

	// Issue Read command
	NF_CMD(CMD_READ);

	//  Set up address
	NF_ADDR(0x00);
	NF_ADDR(0x00);
	NF_ADDR((addr) & 0xff);
	NF_ADDR((addr >> 8) & 0xff);
	NF_ADDR((addr >> 16) & 0xff);

	NF_CMD(CMD_READ3);

	NF_DETECT_RB();		// wait tR(max 12us)

	for (i = 0; i < 2048; i++)
	{
		to[i] =  NF_RDDATA8();
	}

	NF_nFCE_H();

}
Пример #2
0
static char rNF_ReadID()
{
	char	pMID;
	char	pDID;
	char	nBuff;
	char	n4thcycle;
	int	i;


	NF_nFCE_L();    
	NF_CLEAR_RB();
	NF_CMD(CMD_READID);	// read id command
	NF_ADDR(0x0);
	for ( i = 0; i < 100; i++ );

	pMID = NF_RDDATA8();
	pDID = NF_RDDATA8();

	nBuff     = NF_RDDATA8();
	n4thcycle = NF_RDDATA8();
	NF_nFCE_H();


	return (pDID);
}
Пример #3
0
static void NF_Reset()
{
  NF_nFCE_L(); // 片选 Nand Flash 芯片
  NF_CLEAR_RB(); // 清除 RnB 信号
  NF_CMD( NF_CMD_RST ); // 复位命令
  NF_WAIT_RB(); // 等待 RnB 信号变高,即不忙
  NF_nFCE_H(); // 取消 Nand Flash 选中
}
Пример #4
0
// int printk(const char *fmt, ...);
 void __low_nand_reset()
{
	NF_CE_L();
	NF_CLEAR_RB();
	NF_CMD(CMD_RESET);  
	NF_DETECT_RB();
	NF_CE_H();
}
Пример #5
0
//
//  Reset the chip
//
static void rNF_Reset()
{
	NF_CE_L();
	NF_CLEAR_RB();
	NF_CMD(CMD_RESET);  
	NF_DETECT_RB();
	NF_CE_H();
}
Пример #6
0
WORD NF_ReadPage(WORD block,WORD page,BYTE* buffer)
{
  int i;
  WORD blockPage = (block << 5) + page;
  BYTE* bufPt = buffer;
  BYTE ECCbuf[6];

  NF_RSTECC(); // 复位 ECC
  NF_MainECCUnlock(); // 解锁本页 main 区域的 ECC 校验,允许生成 ECC 校验码
  NF_nFCE_L();
  NF_CLEAR_RB(); // 清 RnB 信号
  NF_CMD( NF_CMD_RD1 ); // 从本页的上半部分开始读
  
  NF_ADDR( 0 ); // 从本页的第一个列(字节)开始读
  NF_ADDR( blockPage & 0xff ); // 这三行代码指明页号
  NF_ADDR( ( blockPage >> 8 ) & 0xff );
  NF_ADDR( ( blockPage >> 16 ) & 0xff );

  NF_WAIT_RB();

  // 往本页的 main 区里写入 buffer 里的内容
  for(i=0 ; i<NF_MAINSIZE ; i++)
    {
      buffer[i] = NF_RDDATA8();
    }

  NF_MainECCLock(); // 锁定 main 区域的 ECC 校验码
  NF_SpareECCUnlock(); // 解锁本页 spare 区域的 ECC 校验  

  // 读 spare 区域的前4个字节,即 main 区域的 ECC 校验码部分
  for(i=0 ; i<4 ; i++)
    {
      ECCbuf[i] = NF_RDDATA8();
    }

  NF_SpareECCLock(); // 锁定 spare 区域的 ECC 校验码

  // 读 spare 区域的第5,第6个字节,即 spare 区域的 ECC 校验码部分
  for(i=4 ; i<6 ; i++)
    {
      ECCbuf[i] = NF_RDDATA8();
    }

  
  /* 下面就是验证 ECC 校验码了 */

  if(( ECCbuf[0] == (NFMECCD0 & 0xff)) && 
     ( ECCbuf[1] == ((NFMECCD0 >> 16) & 0xff)) &&
     ( ECCbuf[2] == (NFMECCD1 & 0xff)) &&
     ( ECCbuf[3] == ((NFMECCD1 >> 16) & 0xff)) &&
     ( ECCbuf[4] == (NFSECCD & 0xff)) &&
     ( ECCbuf[5] == ((NFSECCD >> 16) & 0xff)))
    { // ECC 校验全部成功
      NF_nFCE_H();
      return 1;
    }
  else
    { // ECC 校验不成功
Пример #7
0
char __low_nand_write_page(unsigned int page_addr,unsigned char *from)
{
	U32 i;
	char nfstatus;
	unsigned int *pfrom = (unsigned int *)from;//2440的NFADDR寄存器是32位的

	// printk("write page addr :%.8x \r\n",page_addr);



	// __low_nand_reset();

	//  Enable the chip
	NF_nFCE_L();
	NF_CLEAR_RB();

	// Issue Read command
	NF_CMD(CMD_WRITE1);

	//  Set up address
	
	NF_ADDR(page_addr & 0xff);		
	NF_ADDR((page_addr >> 8) & 0x0f);
	NF_ADDR((page_addr >> 12) & 0xff);
	NF_ADDR((page_addr >> 20) & 0xff);
	NF_ADDR((page_addr >> 28) & 0x01);
	


	// NF_WRDATA(0xffffffff);
	// NF_WRDATA(0xffffffff);
	// NF_WRDATA(0xffffffff);
	// NF_WRDATA(0xffffffff);

	for(i = 0;i < (NAND_PAGE_SIZE+64) >> 2;++i) {
		NF_WRDATA( *((unsigned*)pfrom++));
	}
	NF_CMD(CMD_WRITE2);

	
	NF_DETECT_RB();		// wait tR(max 12us)
	NF_CMD(CMD_STATUS);

	return (NF_RDDATA8() & 0x01);
	// nfstatus =  NF_RDDATA8();

	// NF_nFCE_H();
	// printk("nand status:%x\r\n",nfstatus);
}
Пример #8
0
WORD NF_CheckId()
{
  WORD id;

  NF_nFCE_L();
  NF_CLEAR_RB();
  NF_CMD( NF_CMD_RDD );
  NF_ADDR( 0x0 ); // 指定地址 0x0, 芯片手册要求
  NF_WAIT_RB();
  id = NF_RDDATA8() << 8; // 厂商 ID
  id |= NF_RDDATA8(); // 设备 ID
  NF_nFCE_H();

  return id;
}
Пример #9
0
char __low_nand_erase_block(unsigned int row_addr)
{
	NF_nFCE_L();
	NF_CLEAR_RB();
	NF_CMD(CMD_ERASE1);
	NF_ADDR((row_addr >> 12) & 0xff);
	NF_ADDR((row_addr >> 20) & 0xff);
	NF_ADDR((row_addr >> 28) & 0x01);
	NF_CMD(CMD_ERASE2);
	NF_DETECT_RB();		

	NF_CMD(CMD_STATUS);
	return (NF_RDDATA8() & 0x01);

}
Пример #10
0
void SubmitSpareAreaReadCmd(DWORD SectorStartAddr, DWORD SpareStartAddr)
{
    NF_nFCE_L();

    NF_CLEAR_RB();

    NF_CMD(CMD_READ);                            // Send read command.

    NF_ADDR((SpareStartAddr)&0xff);
    NF_ADDR((SpareStartAddr>>8)&0xff);
    NF_ADDR((SectorStartAddr) & 0xff);
    NF_ADDR((SectorStartAddr >> 8) & 0xff);
    if(g_bNeedExtAddr)
    {
        NF_ADDR((SectorStartAddr >> 16) & 0xff);
    }

    NF_CMD(CMD_READ3);                        // 2nd command

    NF_DETECT_RB();                                // Wait for command to complete.
}
Пример #11
0
 void __low_nand_read_page(unsigned int page_addr,unsigned char *to)
{
	U32 i;
	char nfstatus;
	unsigned int *pto = (unsigned int *)to;
	// printk("read page addr :%.8x \r\n",page_addr);



	// __low_nand_reset();

	//  Enable the chip
	NF_nFCE_L();
	NF_CLEAR_RB();

	// Issue Read command
	NF_CMD(CMD_READ);

	//  Set up address
	NF_ADDR(page_addr & 0xff);		
	NF_ADDR((page_addr >> 8) & 0x0f);
	NF_ADDR((page_addr >> 12) & 0xff);
	NF_ADDR((page_addr >> 20) & 0xff);
	NF_ADDR((page_addr >> 28) & 0x01);
	NF_CMD(CMD_READ2);


	NF_DETECT_RB();		// wait tR(max 12us)

	for (i = 0; i < (NAND_PAGE_SIZE+64) >> 2;++i) {
		*((unsigned*)pto++) = NF_RDDATA();	
	}
	
	// for (i = 0; i < NAND_PAGE_SIZE ;++i)
	// {
		
	// 	to[i] = NF_RDDATA8();
	// }
	NF_nFCE_H();
}
Пример #12
0
 char __low_nand_readid(unsigned int *part1,unsigned *part2)
{
	char g_nfid1;
	char g_nfid2;
	char g_nfid3;
	char g_nfid4;
	char g_nfid5;

	char	pMID;
	char	pDID;
	char	nBuff;
	char	n4thcycle;
	int	i;


	NF_nFCE_L();    
	NF_CLEAR_RB();
	NF_CMD(CMD_READID);	// read id command
	NF_ADDR(0x00);
	for ( i = 0; i < 100; i++ );

	g_nfid1 = NF_RDDATA8();
	g_nfid2 = NF_RDDATA8();
	g_nfid3 = NF_RDDATA8();
	g_nfid4 = NF_RDDATA8();
	g_nfid5 = NF_RDDATA8();

	pMID = g_nfid1;
	pDID = g_nfid2;

	nBuff     = NF_RDDATA8();
	n4thcycle = NF_RDDATA8();
	NF_nFCE_H();
	



	return (pDID);
}