亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? s3c6410_fil.c

?? 6410BSP3
?? C
?? 第 1 頁 / 共 5 頁
字號:
	}
	NF_CMD(CMD_READ_CONFIRM);

	if (bInternalInterleaving == TRUE32)
	{
#if	1
		_TRDelay(nPpn);
#else
		if (nVBank%2)
		{
			NF_CMD(CMD_READ_STATUS_CHIP1);
		}
		else
		{
			NF_CMD(CMD_READ_STATUS_CHIP0);
		}
		while(!(NF_DATA_R()&0x40));

		// Dummy Command to Set Proper Pointer to Read Position after NF_WAIT_RnB()
		NF_CMD(CMD_READ);
#endif
	}
	else
	{
		NF_WAIT_RnB(nBank);

		// Dummy Command to Set Proper Pointer to Read Position after NF_WAIT_RnB()
		NF_CMD(CMD_READ);
	}

	// Read Spare Area
	if (ECC_8BIT_SPPORT == TRUE32)
	{
        NF_SETREG_8BITECC();
		nRet = Read_Spare_8BitECC(nBank, nPpn, (UINT32*)pSBuf);		
	}
	else if (SECTORS_PER_PAGE == 8)
	{
        NF_SETREG_8BITECC();
		nRet = Read_Spare_Separate(nBank, nPpn, (UINT32*)pSBuf);
        NF_SETREG_4BITECC();
	}
	else
	{
		nRet = Read_Spare(nBank, nPpn, (UINT32*)pSBuf);
	}

	if ((nRet & ECC_UNCORRECTABLE_ERROR) == 0)
	{
		nPageReadStatus = (nRet<<16);

		if (WMR_GetChkSum(&pSBuf[1], 1) >= 4)
		{
			// Not Clean Page
			bPageClean = FALSE32;
		}

		// Read Main Area
		if(pDBuf != NULL)
		{
			for (nCnt=0; nCnt<nLoopCount; nCnt++)
			{
				if (nSctBitmap&(0x1<<nCnt))
				{
 					if (ECC_8BIT_SPPORT == TRUE32)
					{
                        NF_SETREG_8BITECC();
						nRet = Read_Sector_8BitECC(nBank, nPpn, nCnt, pDBuf, (UINT32*)pSBuf, bPageClean);						
					}
					else
					{
						nRet = Read_Sector(nBank, nPpn, nCnt, pDBuf, (UINT32*)pSBuf, bPageClean);
					}
					//nPageReadStatus |= (nRet<<(nCnt*4));  // if 2KByte/Page
					nPageReadStatus |= (nRet<<(nCnt*2));  // if both non-case for all-ff and 4KByte/Page
				}
			}
		}
	}
	else
	{
    	nPageReadStatus |= (nRet<<(8*2));  // The spare area position.
	}

	// Chip Unselect
	NF_CE_H(nBank);

#ifdef	USE_SETKMODE
	SetKMode(bLastMode);
#endif

	if(bSecondRead)
	{
		nPageReadStatus2nd = nPageReadStatus;
	}
	else
	{
		nPageReadStatus1st = nPageReadStatus;
	}

	if(bLoopNeed && !bSecondRead)
	{
		bSecondRead = TRUE32;
		goto _B_SecondRead;
	}

	if(nPageReadStatus1st&PAGE_UNCORRECTABLE_ERROR_MASK || nPageReadStatus2nd&PAGE_UNCORRECTABLE_ERROR_MASK)
	{
		// Uncorrectable ECC Error
		NAND_ERR((_T("[FIL:ERR]--NAND_Read() : Uncorrectable Error in Bank %d, Page %d [0x%08x] [0x%08x]\r\n"), nBank, nPpn, nPageReadStatus1st, nPageReadStatus));
		return FIL_U_ECC_ERROR;
	}
	else
	{

//        MLC_Print_Page_Data(pDBuf, pSBuf);

#if (WMR_READ_RECLAIM)
		if (nPageReadStatus1st&PAGE_CORRECTABLE_ERROR_MASK || nPageReadStatus2nd&PAGE_CORRECTABLE_ERROR_MASK)
		{
			READ_ERR_FLAG = TRUE32;
			NAND_ERR((_T("[FIL:INF] NAND_Read() : Correctable Error in Bank %d, Page %d [0x%08x] [0x%08x]\r\n"), nBank, nPpn, nPageReadStatus1st, nPageReadStatus2nd));
		}
#endif
		if (bCleanCheck&&bPageClean)
		{
			if (bIsSBufNull == FALSE32)
			{
				BOOL32 bClean;

				// Check 32 bytes is all 0xFF & don't care about ECC Value
				if ((pDBuf == NULL) && (bECCIn))
				{
					// When the pMBuf is NULL, read 128 bytes(twice read) in the spare area
					if (bSecondRead)
					{
						pSBuf -= BYTES_PER_SPARE_PAGE;
					}

					bClean = _IsAllFF(pSBuf, BYTES_PER_SPARE_SUPAGE);
				}
				else
				{
					// TODO: to be changed all FF check Size
					bClean = _IsAllFF(pSBuf, ((SECTORS_PER_PAGE == 8) ? NAND_MECC_OFFSET_4K : NAND_MECC_OFFSET));
				}

				if (bClean)
				{
					NAND_MSG((_T("[FIL]--NAND_Read() : FIL_SUCCESS_CLEAN\r\n")));
					return FIL_SUCCESS_CLEAN;
				}
				else
				{
					NAND_MSG((_T("[FIL]--NAND_Read()[bClean==FASLE32]\r\n")));
					return FIL_SUCCESS;
				}
			}
			else
			{
				NAND_MSG((_T("[FIL]--NAND_Read()[bIsSBufNull != FALSE32] : FIL_SUCCESS_CLEAN\r\n")));
				return FIL_SUCCESS_CLEAN;
			}
		}
		else
		{
			NAND_MSG((_T("[FIL]--NAND_Read()[bCleanCheck&&bPageClean == FASLE32]\r\n")));
			return FIL_SUCCESS;
		}
	}

}


/*****************************************************************************/
/*                                                                           */
/* NAME                                                                      */
/*      NAND_Write		                                                     */
/* DESCRIPTION                                                               */
/*      This function writes NAND page area							 		 */
/* PARAMETERS                                                                */
/*      nBank    	[IN] 	Physical device number			               	 */
/*      nPpn     	[IN] 	Physical page number				         	 */
/*      nSctBitmap 	[IN] 	The indicator for the sector to write         	 */
/*      nPlaneBitmap[IN]    The indicator of the plane  					 */
/*      pDBuf		[IN]	Buffer pointer of main area to write          	 */
/*      pSBuf		[IN]	Buffer pointer of spare area to write         	 */
/*																			 */
/* RETURN VALUES                                                             */
/*		None																 */
/* NOTES                                                                     */
/*                                                                           */
/*****************************************************************************/
VOID
NAND_Write(UINT32 nBank, UINT32 nPpn, UINT32 nSctBitmap,
			UINT32  nPlaneBitmap, UINT8* pDBuf, UINT8* pSBuf)
{
	UINT32 nCnt;
	UINT32 nPbn;
	UINT32 nPOffset;

	//BOOL32	bFirstWrite = TRUE32;
	BOOL32	bSecondWrite = FALSE32;
	BOOL32  bLoopNeed = FALSE32;

	pSECCCxt pSpareCxt = NULL;

#ifdef	USE_SETKMODE
	BOOL bLastMode;
#endif

	NAND_MSG((_T("[FIL] ++NAND_Write(%d, %d, 0x%02x, 0x%02x)\r\n"), nBank, nPpn, nSctBitmap, nPlaneBitmap));
	//NAND_ERR((_T("[FIL] ++NAND_Write(%d, %d, 0x%02x, 0x%02x)\r\n"), nBank, nPpn, nSctBitmap, nPlaneBitmap));  // ksk dbg

//    MLC_Print_Page_Data(pDBuf, pSBuf);

	if (nBank >= BANKS_TOTAL || nPpn >= PAGES_PER_BANK || (pDBuf == NULL && pSBuf == NULL))
	{
		NAND_ERR((_T("[FIL:ERR]--NAND_Write() : Parameter Overflow\r\n")));
		WMR_ASSERT(FALSE32);
		return;
	}

	// avoid r/b check error with internal interleaving
	if (bInternalInterleaving == TRUE32)
	{
		aNeedSync[nBank] = TRUE32;
	}

	/* 
	In case of Internal Interleaving, the first address of the second bank should be 
	the half of toal block number of NAND.
	For example, In 4Gbit DDP NAND, its total block number is 4096.
	So, the bank 0 has 2048 blocks (Physical number : 0 ~ 2047),
	the bank 1 has another 2048 blocks (Physical number : 2048 ~ 4095).
	therefore, first block address of Bank 1 could be the physically 2048th block.
	*/
	if (bInternalInterleaving == TRUE32)
	{
		if ((nBank & 0x1) == 1)
		{
			nPpn += PAGES_PER_BANK;
		}
		nBank /= 2;
	}

#if (WMR_STDLIB_SUPPORT)
	nPbn = nPpn / PAGES_PER_BLOCK;
	nPOffset = nPpn % PAGES_PER_BLOCK;
#else
	nPbn = DIV(nPpn, PAGES_PER_BLOCK_SHIFT);
	nPOffset = REM(nPpn, PAGES_PER_BLOCK_SHIFT);
#endif

	// In case of 2-Plane Program, re-calculate the page address
	if(TWO_PLANE_PROGRAM == TRUE32)
	{
		nPpn = nPbn * 2 * PAGES_PER_BLOCK + nPOffset;

		if (nPlaneBitmap == enuBOTH_PLANE_BITMAP)
		{
			bLoopNeed = TRUE32;
		}
		else if (nPlaneBitmap == enuRIGHT_PLANE_BITMAP)
		{
			nPpn += PAGES_PER_BLOCK;
			//nSctBitmap = nSctBitmap>>4;
		}
	}

	nSctBitmap &= FULL_SECTOR_BITMAP_PAGE;

#ifdef	USE_SETKMODE
	bLastMode = SetKMode(TRUE);
#endif

	// CE Select
	NF_CE_L(nBank);

_B_SecondWrite:

	// 2-Plane Program, page address is changed
	if (bSecondWrite)
	{
		nPpn += PAGES_PER_BLOCK;
		nSctBitmap = nSctBitmap >> SECTORS_PER_PAGE;
	}

	if(pSBuf == NULL)
	{
		pSBuf = aTempSBuf;
		WMR_MEMSET(pSBuf, 0xFF, BYTES_PER_SPARE_PAGE);		// Initialize the spare buffer
	}
	else
	{
		// Set 0xFF to ECC Area
		if (IS_CHECK_SPARE_ECC == TRUE32)
		{
			pSBuf[2] = 0xff;	// Reserved
			pSBuf[3] = 0xff;
			//WMR_MEMSET(pSBuf+2, 0xFF, 2);						// Clear Reserved area in Spare Buffer
			WMR_MEMSET(pSBuf+((SECTORS_PER_PAGE == 8) ? NAND_MECC_OFFSET_4K : NAND_MECC_OFFSET),
						0xFF,
						BYTES_PER_SPARE_PAGE-((SECTORS_PER_PAGE == 8) ? NAND_MECC_OFFSET_4K : NAND_MECC_OFFSET));		// Clear ECC area in Spare Buffer
		}
	}

	pSpareCxt = (pSECCCxt)pSBuf;
	pSpareCxt->cCleanMark = 0x0;	// Clean mark to 0. It means that page is written

	if (bSecondWrite)
	{
		NF_CMD(CMD_2PLANE_PROGRAM);
		NF_SET_ADDR(nPpn, 0);
	}
	else
	{
		NF_CMD(CMD_PROGRAM);
		NF_SET_ADDR(nPpn, 0);
	}

	// Write Main Sector
	if (pDBuf != NULL)
	{
		// In case of the second write, the position of buffer pointer is moved backward as much as 1 page size
		if (bSecondWrite)
		{
			pDBuf += BYTES_PER_MAIN_PAGE;
		}

		for (nCnt=0; nCnt<SECTORS_PER_PAGE; nCnt++)
		{
			if (nSctBitmap&(0x1<<nCnt))
			{
				if (ECC_8BIT_SPPORT == TRUE32)
				{
                    NF_SETREG_8BITECC();
					Write_Sector_8BitECC(nPpn, nCnt, pDBuf);
				}
				else
				{
					Write_Sector(nPpn, nCnt, pDBuf);					
				}

				if (IS_CHECK_SPARE_ECC == TRUE32)
				{
				    if ( ECC_8BIT_SPPORT != TRUE32 )
				    {
    					pSpareCxt->aMECC[nCnt*2] = NF_MECC0();
    					pSpareCxt->aMECC[nCnt*2+1] = NF_MECC1();
    				}
    				else
    				{
    					pSpareCxt->aMECC[nCnt*4] = NF_8MECC0();
    					pSpareCxt->aMECC[nCnt*4+1] = NF_8MECC1();
    					pSpareCxt->aMECC[nCnt*4+2] = NF_8MECC2();
    					pSpareCxt->aMECC[nCnt*4+3] = NF_8MECC3() & 0xff;	
    				}
				}
			}
			else
			{
				if (ECC_8BIT_SPPORT == TRUE32)
				{
					pSpareCxt->aMECC[nCnt*4] = ECCVAL_ALLFF0;
					pSpareCxt->aMECC[nCnt*4+1] = ECCVAL_ALLFF1;
					pSpareCxt->aMECC[nCnt*4+2] = ECCVAL_ALLFF2;
					pSpareCxt->aMECC[nCnt*4+3] = ECCVAL_ALLFF3 & 0xff;					
    			}
    			else
    			{
    				pSpareCxt->aMECC[nCnt*2] = ECCVAL_ALLFF0;	// All 0xFF ECC
    				pSpareCxt->aMECC[nCnt*2+1] = ECCVAL_ALLFF1;
    			}
    		}
		}
	}
	else if (IS_CHECK_SPARE_ECC == TRUE32)
	{
		if (ECC_8BIT_SPPORT == TRUE32)
		{
			for (nCnt=0; nCnt<SECTORS_PER_PAGE; nCnt++)
			{
				pSpareCxt->aMECC[nCnt*4] = ECCVAL_ALLFF0;
				pSpareCxt->aMECC[nCnt*4+1] = ECCVAL_ALLFF1;
				pSpareCxt->aMECC[nCnt*4+2] = ECCVAL_ALLFF2;
				pSpareCxt->aMECC[nCnt*4+3] = ECCVAL_ALLFF3 & 0xff;
			}
		}
		else
		{
			for (nCnt=0; nCnt<SECTORS_PER_PAGE; nCnt++)
			{
				pSpareCxt->aMECC[nCnt*2] = ECCVAL_ALLFF0;	// All 0xFF ECC
				pSpareCxt->aMECC[nCnt*2+1] = ECCVAL_ALLFF1;
			}
		}
	}

	// Write Spare
	if (ECC_8BIT_SPPORT == TRUE32)
	{
        NF_SETREG_8BITECC();
		Write_Spare_8BitECC(nBank, nPpn, pSpareCxt);		
	}
	else if (SECTORS_PER_PAGE == 8)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产综合色视频| 一本久道久久综合中文字幕 | 中文一区一区三区高中清不卡| 国产精品国产自产拍高清av| 日韩精品一区第一页| 成人va在线观看| 日韩欧美激情在线| 亚洲综合图片区| 成人美女视频在线看| 日韩欧美一区二区久久婷婷| 一区二区三区在线观看国产| 国产69精品久久久久毛片| 欧美精品v国产精品v日韩精品 | 欧美日韩精品三区| 国产精品久久影院| 国产精品一区一区三区| 91精品国产综合久久国产大片| 亚洲视频一区二区免费在线观看 | 久久香蕉国产线看观看99| 亚洲大片在线观看| 色88888久久久久久影院野外 | 国产精品影视在线观看| 欧美一级高清片| 丝袜亚洲精品中文字幕一区| 日本道色综合久久| 日韩一区在线看| 国产+成+人+亚洲欧洲自线| 26uuu精品一区二区在线观看| 午夜精品免费在线观看| 精品污污网站免费看| 亚洲精品国产一区二区三区四区在线| 成人综合婷婷国产精品久久免费| 26uuuu精品一区二区| 久久国产精品一区二区| 日韩午夜精品视频| 老司机免费视频一区二区| 91精品国产综合久久久蜜臀粉嫩| 无吗不卡中文字幕| 91精品国产一区二区| 蜜桃久久久久久| 欧美成人艳星乳罩| 国产伦精品一区二区三区在线观看| 日韩精品在线一区| 国产精品亚洲а∨天堂免在线| 日韩精品一区二区三区在线| 激情久久五月天| 中文字幕国产一区二区| 不卡一区在线观看| 一区二区三区四区不卡视频| 欧美日韩成人综合天天影院 | 国产一区不卡精品| 中文字幕不卡一区| 久久久亚洲精品一区二区三区| 国内精品免费在线观看| 国产精品短视频| 欧美性做爰猛烈叫床潮| 蜜臀av一区二区在线观看| 日韩欧美www| 成人黄色在线网站| 午夜影视日本亚洲欧洲精品| 欧美videossexotv100| 国产盗摄一区二区三区| 亚洲特黄一级片| 欧美一区二区视频免费观看| 国产精品一二三区在线| 亚洲国产成人va在线观看天堂| 欧美一级片在线看| www.视频一区| 久久99久久99精品免视看婷婷| 欧美韩国一区二区| 7777精品伊人久久久大香线蕉经典版下载| 久久精品国产免费| 亚洲美女免费视频| 精品国产成人在线影院 | 久久精品国产亚洲a| 国产精品三级av| 欧美一区二区视频在线观看| 成人高清免费观看| 久久国产麻豆精品| 尤物在线观看一区| 欧美激情综合五月色丁香 | 欧美妇女性影城| 成人免费看片app下载| 亚洲高清免费视频| 国产精品对白交换视频| 精品久久久久久综合日本欧美| 91视频免费播放| 国产美女视频一区| 男女激情视频一区| 一区二区激情小说| 国产精品免费aⅴ片在线观看| 欧美一级日韩不卡播放免费| 色婷婷精品大在线视频| 国产二区国产一区在线观看| 日韩精品一二三四| 亚洲尤物视频在线| 中文字幕在线不卡国产视频| 26uuu另类欧美| 日韩女优制服丝袜电影| 欧美日韩高清不卡| 欧美日韩国产一区| 日本乱码高清不卡字幕| caoporen国产精品视频| 高清免费成人av| 国产麻豆午夜三级精品| 精久久久久久久久久久| 蜜桃av噜噜一区二区三区小说| 一级女性全黄久久生活片免费| 国产精品美女久久久久久久久久久| 精品欧美乱码久久久久久1区2区| 69久久夜色精品国产69蝌蚪网| 欧美少妇bbb| 欧美三级电影网| 欧美日韩国产bt| 884aa四虎影成人精品一区| 欧美日韩一区二区在线观看| 欧美日韩国产一级| 欧美精品免费视频| 日韩一级视频免费观看在线| 欧美一级午夜免费电影| 欧美刺激午夜性久久久久久久| 日韩一区二区免费在线观看| 91麻豆精品国产91久久久久久| 7777精品伊人久久久大香线蕉完整版 | 一区二区三区.www| 亚洲成人精品影院| 蜜桃视频在线观看一区| 国内外精品视频| 成人福利视频网站| 色综合久久久久综合| 91福利在线播放| 欧美精品v日韩精品v韩国精品v| 91精品国产高清一区二区三区 | 色美美综合视频| 91成人免费在线| 欧美情侣在线播放| 2021国产精品久久精品| 中文子幕无线码一区tr| 亚洲欧美日韩国产综合在线| 亚洲电影在线播放| 久久精品国内一区二区三区| 国产69精品久久久久毛片| 91色九色蝌蚪| 日韩一区二区三区四区| 欧美国产亚洲另类动漫| 一区二区三区自拍| 毛片基地黄久久久久久天堂| 成人一级黄色片| 欧美日韩久久久| 国产亚洲欧美在线| 亚洲综合清纯丝袜自拍| 久久精品国产99久久6| 成人免费高清在线| 欧美高清你懂得| 国产精品黄色在线观看| 日本一区中文字幕| 99久久99久久综合| 欧美大片日本大片免费观看| 国产精品国产精品国产专区不蜜| 偷拍亚洲欧洲综合| 成人av先锋影音| 欧美不卡在线视频| 一区二区三区在线高清| 国产成人精品午夜视频免费| 欧美探花视频资源| 国产欧美一区二区三区在线看蜜臀 | 五月天久久比比资源色| 国产激情一区二区三区四区| 欧美亚一区二区| 国产精品久久久久久久久图文区| 美女一区二区三区| 欧美性猛交xxxxxxxx| 日本一区二区三区在线观看| 日本强好片久久久久久aaa| 91免费视频大全| 国产日韩精品视频一区| 男男视频亚洲欧美| 欧美视频一区二区三区四区 | 欧美一区二区三区四区高清| 国产精品三级电影| 国产伦精品一区二区三区免费| 欧美精品丝袜中出| 亚洲一区二区视频| 99久久精品国产导航| 国产日韩欧美综合一区| 久久超级碰视频| 91精品麻豆日日躁夜夜躁| 一区二区免费在线| 一本久久精品一区二区| 亚洲欧洲99久久| 北条麻妃国产九九精品视频| 国产日本欧美一区二区| 久久精品72免费观看| 欧美一级黄色录像| 日韩专区一卡二卡| 宅男噜噜噜66一区二区66| 香港成人在线视频| 欧美人伦禁忌dvd放荡欲情| 亚洲大片免费看| 91麻豆精品国产91久久久资源速度 |