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(); }
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); }
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 选中 }
// 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(); }
// // Reset the chip // static void rNF_Reset() { NF_CE_L(); NF_CLEAR_RB(); NF_CMD(CMD_RESET); NF_DETECT_RB(); NF_CE_H(); }
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 校验不成功
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); }
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; }
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); }
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. }
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(); }
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); }