📄 cmd_nand_s3c2440a.c
字号:
NFADDR = (blockPage)&0xff; NFADDR =(blockPage>>8)&0xff;#ifdef NAND_3_ADDR_CYCLE#else NFADDR=(blockPage>>16)&0xff;#endif#ifdef S3C24X0_16BIT_NAND for(i=0 ;i < NAND_OOB_SIZE / 2 ;i++){ NFDATA16 = Buf[i]; }#else for(i=0 ;i < NAND_OOB_SIZE ;i++){ NFDATA8 = seBuf[i]; }#endif NFCMD= NAND_CMD_PAGEPROG; for(i=0;i<10;i++); NF_DETECT_RB(); NFCMD=NAND_CMD_STATUS; for(i=0;i<3;i++); if (NFDATA8 & 0x1) { NF_nFCE_H(); printf("[Program error is occurred but ignored]\n"); } else { NF_nFCE_H(); } if ( mark_flag == NF_BB_ON) { printf("[block 0x%x is marked as a bad block]\n",block); } else { printf("[block 0x%x is marked as a good block]\n",block); } return 1;} static int NF_WritePage(u32 block,u32 page,u8 *buffer){ int i; u32 blockPage;#ifdef S3C24X0_16BIT_NAND u16 *Buf = (unsigned short) seBuf; u16 *ptr16= (u16 *)buffer;#else u8 *ptr8 = buffer;#endif blockPage=block * NAND_PAGES_IN_BLOCK + page; NF_SOFT_UnLock(); NF_RSTECC(); // Initialize ECC NF_MECC_UnLock(); NF_nFCE_L(); NF_CLEAR_RB(); NFCMD = NAND_CMD_READ0; NFCMD = NAND_CMD_SEQIN; NFADDR= 0; NFADDR= blockPage & 0xff; NFADDR= (blockPage>>8) & 0xff; #ifdef NAND_3_ADDR_CYCLE /* Nothing */#else NFADDR=((blockPage>>16)&0xff);#endif#ifdef S3C24X0_16BIT_NAND for(i=0; i < NAND_PAGE_SIZE/2 ; i++){ NFDATA16 = *ptr16++; }#else for(i=0; i < NAND_PAGE_SIZE ; i++) { NFDATA8 = *ptr8++; }#endif NFCMD = NAND_CMD_PAGEPROG; for(i=0; i<10 ;i++); NF_DETECT_RB(); NFCMD = NAND_CMD_STATUS; for(i=0;i<3;i++); if (NFDATA8 & 0x1) {// Page write error NF_nFCE_H(); printf("[PROGRAM_ERROR:block#=%d]\n",block); NF_MarkBadBlock(block, NF_BB_ON); return FAIL; } else { NF_nFCE_H(); return OK; }}static int NF_WriteOob(u32 block,u32 page,u8 *buffer, int yaffs_option){ int i; u32 blockPage = (block * NAND_PAGES_IN_BLOCK) + page;#ifdef S3C24X0_16BIT_NAND u16 *ptr16=buffer;#else u8 *ptr8 = buffer; u8 oobBuf[NAND_OOB_SIZE]; for (i=0; i<NAND_OOB_SIZE; i++) { oobBuf[i] = (*ptr8++); } if ( yaffs_option == NF_USE_MTD_ECC ) { oobBuf[ 8] = 0xFF; oobBuf[ 9] = 0xFF; oobBuf[10] = 0xFF; oobBuf[13] = 0xFF; oobBuf[14] = 0xFF; oobBuf[15] = 0xFF; }#endif NF_nFCE_L(); NFCMD = NAND_CMD_READOOB; NFCMD = NAND_CMD_SEQIN; NFADDR= 0; NFADDR= blockPage & 0xff; NFADDR= (blockPage>>8) & 0xff;#ifdef NAND_3_ADDR_CYCLE /* Nothing */#else NFADDR=((blockPage>>16)&0xff);#endif#ifdef S3C24X0_16BIT_NAND for(i=0; i < NAND_OOB_SIZE/2 ; i++){ NFDATA16 = *ptr16++; }#else for(i=0; i < NAND_OOB_SIZE ; i++) { NFDATA8 = oobBuf[i]; }#endif NFCMD = NAND_CMD_PAGEPROG; for(i=0; i<10 ;i++); NF_DETECT_RB(); NFCMD = NAND_CMD_STATUS; for(i=0; i<3; i++); if (NFDATA8 & 0x1) { NF_nFCE_H(); printf("*****************************************"); printf("\r"); } else { NF_nFCE_H(); } return 1;}static u8 NF_CheckId(void){ int i; u8 maf_id,dev_id; NF_nFCE_L(); NFCMD = NAND_CMD_READID; NFADDR = 0x0; for(i=0;i<10;i++); maf_id=NFDATA8; dev_id=NFDATA8; NF_nFCE_H(); return dev_id;}void NF_Reset(void){ int i; NF_nFCE_L(); NF_CLEAR_RB(); NFCMD = NAND_CMD_RESET; for(i=0;i<10;i++); NF_DETECT_RB(); NF_nFCE_H();}/* * NF_Init : */static void NF_Init(void){#ifdef FULL_INIT NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0); // TACLS [14:12] CLE&ALE duration = HCLK*TACLS. // TWRPH0 [10:8] TWRPH0 duration = HCLK*(TWRPH0+1) // TWRPH1 [6:4] TWRPH1 duration = HCLK*(TWRPH1+1) // AdvFlash(R) [3] Advanced NAND, 0:256/512, 1:1024/2048 // PageSize(R) [2] NAND memory page size // when [3]==0, 0:256, 1:512 bytes/page. // when [3]==1, 0:1024, 1:2048 bytes/page. // AddrCycle(R) [1] NAND flash addr size // when [3]==0, 0:3-addr, 1:4-addr. // when [3]==1, 0:4-addr, 1:5-addr. // BusWidth(R/W) [0] NAND bus width. 0:8-bit, 1:16-bit. NFCONT = (0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0); // Lock-tight [13] 0:Disable lock, 1:Enable lock. // Soft Lock [12] 0:Disable lock, 1:Enable lock. // EnablillegalAcINT[10] Illegal access interupt control. 0:Disable, 1:Enable // EnbRnBINT [9] RnB interrupt. 0:Disable, 1:Enable // RnB_TrandMode[8] RnB transition detection config. 0:Low to High, 1:High to Low // SpareECCLock [6] 0:Unlock, 1:Lock // MainECCLock [5] 0:Unlock, 1:Lock // InitECC(W) [4] 1:Init ECC decoder/encoder. // Reg_nCE [1] 0:nFCE=0, 1:nFCE=1. // NANDC Enable [0] operating mode. 0:Disable, 1:Enable.#else NFCONF |= 0xFFF0; /* Max TACLS, TWRPH0, TWRPH1 */ NFCONT |= (1 << 0) ; /* Activate NAND Controller */#endif}/* * NF_EraseBlock */static int NF_EraseBlock(u32 block){ u32 blockPage = block * NAND_PAGES_IN_BLOCK; int i; NF_SOFT_UnLock(); NF_nFCE_L(); NF_CLEAR_RB(); NFCMD = NAND_CMD_ERASE1; NFADDR = blockPage&0xff; NFADDR = (blockPage>>8)&0xff;#ifdef NAND_3_ADDR_CYCLE#else NFADDR = (blockPage>>16)&0xff;#endif NFCMD = NAND_CMD_ERASE2; for(i=0;i<40;i++); NF_DETECT_RB(); NFCMD = NAND_CMD_STATUS; if (NFDATA8 & 0x1) { NF_nFCE_H(); printf("[ERASE_ERROR:block#=%d]\n",block); NF_MarkBadBlock(block,NF_BB_ON); return FAIL; } else { NF_nFCE_H(); return OK; }}static int NF_CheckBadNande(u32 block){ int i; unsigned int blockPage; u16 data; blockPage = block * NAND_PAGES_IN_BLOCK; NF_RSTECC(); NF_nFCE_L(); NF_CLEAR_RB(); NFCMD = NAND_CMD_READOOB;#ifdef S3C24X0_16BIT_NAND NFADDR = ( NAND_PAGE_SIZE + 0) & 0x7; /* X16 A0~A2 are valid */#else NFADDR = ( NAND_PAGE_SIZE + 0) & 0xf;#endif NFADDR = blockPage&0xff; // The mark of bad block is in 0 page NFADDR = (blockPage>>8)&0xff; // For block number A[24:17]#ifdef NAND_3_ADDR_CYCLE#else NFADDR =(blockPage>>16)&0xff; // For block number A[25]#endif for(i=0;i<10;i++); /* dummy check me */ NF_DETECT_RB(); for (i = 0 ; i < NAND_PAGE_SIZE /2 ;i++){ data=NFDATA16; if ( data != 0xffff ) break; } NF_nFCE_H(); if (i != (NAND_PAGE_SIZE/2)) { printf("[block %d is bad block(%x)]\n",block,data); }}static int NF_IsBadBlock(u32 block){ int i; unsigned int blockPage; u16 data; blockPage = block * NAND_PAGES_IN_BLOCK; NF_RSTECC(); NF_nFCE_L(); NF_CLEAR_RB(); NFCMD = NAND_CMD_READOOB;#ifdef S3C24X0_16BIT_NAND NFADDR = 512 & 0x7; /* X16 A0~A2 are valid */#else NFADDR = 517 & 0xf;#endif NFADDR = blockPage&0xff; // The mark of bad block is in 0 page NFADDR = (blockPage>>8)&0xff; // For block number A[24:17]#ifdef NAND_3_ADDR_CYCLE#else NFADDR =(blockPage>>16)&0xff; // For block number A[25]#endif for(i=0;i<10;i++); /* dummy check me */ NF_DETECT_RB(); data=NFDATA16; NF_nFCE_H();#ifdef S3C24X0_16BIT_NAND if(data != 0xffff)#else if(data != 0xff)#endif { printf("[block %d has been marked as a bad block(%x)]\n",block,data); return 1; } else { return 0; }}#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -