⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_nand_s3c2440a.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -