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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? nand_util_func.c

?? MTK手機平臺下載工具FLASHTOOL驅(qū)動源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
		if( S_DONE == ret ) {
			*p_row_addr = block_addr;
			return S_DONE;
		}
		else {
			block_addr += NUTL_PAGES_PER_BLOCK(nand_info);
		}
	}

	return S_NO_GOOD_BLOCK_FOUND;
}

//------------------------------------------------------------------------------
// Block Erase                                                                  
//------------------------------------------------------------------------------
STATUS_E  NUTL_BlockErase(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,const uint32 row_addr
				,NUTL_EraseFlag_E	flag
) {
	uint32		i;
	uint32		block_addr;
	uint32		timeout = c_timeout;
	uint32		spare32[NAND_MAX_SPARE_SIZE_BYTE>>2];
	STATUS_E	ret=S_UNKNOWN_ERR;

	// search block addr 
	block_addr = NUTL_RowAddrToBlockAddr(nand_info, row_addr);

	// NUTL_ERASE -> good block will be erased, bad block will be skip. 
	// NUTL_FORCE_ERASE -> target block will be erased forcedly.        
	// NUTL_MARK_BAD_BLOCK -> target block will be erased forcedly.     
	if(	(NUTL_ERASE == flag) && 
		(S_DONE != (ret=NUTL_BadBlock_Check(nand_info, c_timeout, block_addr))) 
	) {
		// bad block or fail to read spare to check bad block 
		return ret;
	}

	// erase block 
	if( S_DONE != (ret=CB_NAND_BLOCK_ERASE(nand_info, block_addr)) ) {
		goto erase_fail;
	}
	timeout = c_timeout;
	NFI_Wait( (S_IN_PROGRESS==(ret=CB_NAND_READ_STATUS(nand_info, c_timeout))), timeout);
	if( 0 == timeout ) {
		goto erase_fail;
	} 
	else if( S_DONE != ret ) {
		goto erase_fail;
	}

	if( NUTL_MARK_BAD_BLOCK == flag ) {
		// goto mark as bad block 
		goto erase_fail;
	}

	return S_DONE;

erase_fail:
	// mark bad block symbol 
	CB_NAND_BAD_BLOCK_SYMBOL_SET(nand_info, spare32);

	// write bad block symbol in 1st and 2nd page of this block 
	for(i=0; i<2; i++) {
		// program spare 
		CB_NAND_SPARE_PROGRAM(nand_info, c_timeout, block_addr+i, spare32);
		timeout = c_timeout;
		NFI_Wait( (S_IN_PROGRESS==CB_NAND_READ_STATUS(nand_info, c_timeout)), timeout);
	}

	if( S_UNKNOWN_ERR == ret ) {
		return S_ERASE_FAILED;
	}
	else {
		return ret;
	}
}

//------------------------------------------------------------------------------
// Spare Area CheckSum Encode/Decode Related Function                           
//------------------------------------------------------------------------------
STATUS_E  NUTL_SpareCheckSum_Encode(
				const NAND_DeviceInfo_S  *nand_info
				,uint32  *p_spare32 /* MUST be 32bits alignment addr */
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	i;
	uint16	checksum;
//	uint8	*p_spare8 = (uint8 *)p_spare32;
	uint16	*p_spare16 = (uint16 *)p_spare32;

	page_size = NUTL_PAGE_SIZE(nand_info);
	spare_size = NUTL_SPARE_SIZE(nand_info);

	if( 512 < page_size ) {
		//------------------------------------------------------- 
		// 2048 page size spare area definition                   
		//------------------------------------------------------- 
		//                                                        
		// |... PAGE DATA ...|...SPARE...|E0|E1|E2|E3|NG|CHK|     
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 5 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 0~1)        
		//  E1 -> 4 bytes block-1 ECC parity. (PARITY 2~3)        
		//  E2 -> 4 bytes block-2 ECC parity. (PARITY 4~5)        
		//  E3 -> 4 bytes block-3 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes 16bits checksum.                       
		//                                                        
	}
	else {
		//------------------------------------------------------- 
		// 512 page size spare area definition                    
		//------------------------------------------------------- 
		//                                                        
		// |... PAGE DATA ...|...SPARE...|E0|NG|CHK|              
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 2 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes (16bits) checksum.                     
		//                                                        
	}

	// encode checksum 
	checksum = 0;
	for(i=0; i<((spare_size>>1)-1); i++) {
		checksum += p_spare16[i];
	}
	p_spare16[i] = checksum;

	return S_DONE;
}

STATUS_E  NUTL_SpareCheckSum_Decode(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  *p_spare32 /* MUST be 32bits alignment addr */
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	i;
	uint16	checksum;
//	const uint8		*p_spare8 = (const uint8 *)p_spare32;
	const uint16	*p_spare16 = (const uint16 *)p_spare32;

	page_size = NUTL_PAGE_SIZE(nand_info);
	spare_size = NUTL_SPARE_SIZE(nand_info);

	if( 512 < page_size ) {
		//------------------------------------------------------- 
		// 2048 page size spare area definition                   
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|E1|E2|E3|NG|CHK|    
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 5 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 0~1)        
		//  E1 -> 4 bytes block-1 ECC parity. (PARITY 2~3)        
		//  E2 -> 4 bytes block-2 ECC parity. (PARITY 4~5)        
		//  E3 -> 4 bytes block-3 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes 16bits checksum.                       
		//                                                        
	}
	else {
		//------------------------------------------------------- 
		// 512 page size spare area definition                    
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|NG|CHK|             
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 2 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes (16bits) checksum.                     
		//                                                        
	}

	// decode checksum 
	checksum = 0;
	for(i=0; i<((spare_size>>1)-1); i++) {
		checksum += p_spare16[i];
	}

	if( checksum != p_spare16[(spare_size>>1)-1] ) {
		return S_SPARE_CHKSUM_ERR;
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Spare Area Compose/Decompose Related Function                                
//------------------------------------------------------------------------------
STATUS_E  NUTL_SpareCompose(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  ecc_parity_from_reg[4]
				,uint32  *p_spare32 /* MUST be 32bits alignment addr */
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	i;
	uint32	*p_ptr32 = p_spare32;

	page_size = NUTL_PAGE_SIZE(nand_info);
	spare_size = NUTL_SPARE_SIZE(nand_info);

	// fill spare to 0xFF 
	for(i=0; i<(spare_size>>2); i++) {
		p_spare32[i] = 0xFFFFFFFF;
	}

	// store ECC parity 
	if( 512 < page_size ) {
		//------------------------------------------------------- 
		// 2048 page size spare area definition                   
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|E1|E2|E3|NG|CHK|    
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 5 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 0~1)        
		//  E1 -> 4 bytes block-1 ECC parity. (PARITY 2~3)        
		//  E2 -> 4 bytes block-2 ECC parity. (PARITY 4~5)        
		//  E3 -> 4 bytes block-3 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes 16bits checksum.                       
		//                                                        
		p_ptr32 = p_spare32 + ((spare_size>>2)-5);
		*p_ptr32++ = ecc_parity_from_reg[0];
		*p_ptr32++ = ecc_parity_from_reg[1];
		*p_ptr32++ = ecc_parity_from_reg[2];
		*p_ptr32++ = ecc_parity_from_reg[3];
	}
	else {
		//------------------------------------------------------- 
		// 512 page size spare area definition                    
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|NG|CHK|             
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 2 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes (16bits) checksum.                     
		//                                                        
		p_ptr32 = p_spare32 + ((spare_size>>2)-2);
		*p_ptr32++ = ecc_parity_from_reg[0];
	}

	// calculate spare area checksum 
	NUTL_SpareCheckSum_Encode(nand_info, p_spare32);

	return S_DONE;
}

STATUS_E  NUTL_SpareDecompose(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  *p_spare32 /* MUST be 32bits alignment addr */
				,uint32  ecc_parity_from_spare[4]
) {
	uint32	page_size;
	uint32	spare_size;
	const uint32	*p_ptr32 = p_spare32;

	page_size = NUTL_PAGE_SIZE(nand_info);
	spare_size = NUTL_SPARE_SIZE(nand_info);

	// calculate spare area checksum 
	if( S_DONE != NUTL_SpareCheckSum_Decode(nand_info, p_spare32) ) {
		return S_SPARE_CHKSUM_ERR;
	}

	// store ECC parity 
	if( 512 < page_size ) {
		//------------------------------------------------------- 
		// 2048 page size spare area definition                   
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|E1|E2|E3|NG|CHK|    
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 5 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 0~1)        
		//  E1 -> 4 bytes block-1 ECC parity. (PARITY 2~3)        
		//  E2 -> 4 bytes block-2 ECC parity. (PARITY 4~5)        
		//  E3 -> 4 bytes block-3 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes 16bits checksum.                       
		//                                                        
		p_ptr32 = p_spare32 + ((spare_size>>2)-5);
		ecc_parity_from_spare[0] = *p_ptr32++;
		ecc_parity_from_spare[1] = *p_ptr32++;
		ecc_parity_from_spare[2] = *p_ptr32++;
		ecc_parity_from_spare[3] = *p_ptr32++;
	}
	else {
		//------------------------------------------------------- 
		// 512 page size spare area definition                    
		//------------------------------------------------------- 
		//                                                        
		//  |... PAGE DATA ...|...SPARE...|E0|NG|CHK|             
		//                                                        
		//  We store the ECC parity, next good block address and  
		//  spare checksum in the last 2 DWORDs of spare data.    
		//                                                        
		//  E0 -> 4 bytes block-0 ECC parity. (PARITY 6~7)        
		//  NG -> 2 bytes row addr point to next good block.      
		//  CHK -> 2 bytes (16bits) checksum.                     
		//                                                        
		p_ptr32 = p_spare32 + ((spare_size>>2)-2);
		ecc_parity_from_spare[0] = *p_ptr32++;
		ecc_parity_from_spare[1] = 0;
		ecc_parity_from_spare[2] = 0;
		ecc_parity_from_spare[3] = 0;
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// ECC Correction                                                               
//------------------------------------------------------------------------------
STATUS_E  NUTL_ECC_Correction(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  ecc_block_size
				,const uint32  ecc_parity_from_reg[4]
				,const uint32  ecc_parity_from_spare[4]
				,uint32  *p_data32 /* MUST be 32bits alignment addr */
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	addr_cycle;
	uint32	i;
	uint32	error_bit_address;
	uint32	error_bit_offset;
	uint8	*p_data8 = (uint8 *)p_data32;
	uint8	update_data;
	UnionData_U	xor_ecc_parity[4];

	page_size = NUTL_PAGE_SIZE(nand_info);
	spare_size = NUTL_SPARE_SIZE(nand_info);
	addr_cycle = NUTL_ADDR_CYCLE(nand_info);

	// XOR two ECC parity bit strings 
	// ecc_parity_from_reg[4]: current ECC parity generated by reading whole page 
	// ecc_parity_from_spare[4]: original ECC parity stored in spare area 
	xor_ecc_parity[0].d32 = (ecc_parity_from_reg[0]^ecc_parity_from_spare[0])&0x0FFF0FFF;
	xor_ecc_parity[1].d32 = (ecc_parity_from_reg[1]^ecc_parity_from_spare[1])&0x0FFF0FFF;
	xor_ecc_parity[2].d32 = (ecc_parity_from_reg[2]^ecc_parity_from_spare[2])&0x0FFF0FFF;
	xor_ecc_parity[3].d32 = (ecc_parity_from_reg[3]^ecc_parity_from_spare[3])&0x0FFF0FFF;

	// compare ECC parity between reg and spare 
	for(i=0; i<(page_size/ecc_block_size); i++) {
		if( 0 != xor_ecc_parity[i].d32 ) {
			if( 0x0FFF == ((xor_ecc_parity[i].d16[0]^xor_ecc_parity[i].d16[1])&0x0FFF) ) {
				// one-bit correctable error 
				error_bit_address = xor_ecc_parity[i].d16[1]&(~xor_ecc_parity[i].d16[0]);
				error_bit_offset = ecc_block_size*i + (error_bit_address>>3);
				update_data = p_data8[error_bit_offset];
				update_data = update_data^(1<<(uint8)(error_bit_address&0x0007));
				p_data8[error_bit_offset] = update_data;
				return S_ECC_1BIT_CORRECT;
			} 
			else {
				return S_ECC_2BITS_ERR;
			}
		}
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Page Read                                                                    
//------------------------------------------------------------------------------
STATUS_E  NUTL_PageRead(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,const uint32  row_addr
				,uint32 *p_data32 /* MUST be 32bits alignment addr */
				,uint32 *p_spare32 /* MUST be 32bits alignment addr */
				,uint32  ecc_parity_from_reg[4]
				,uint32  ecc_parity_from_spare[4]
				,NUTL_ReadFlag_E  flag
) {
	uint32		page_size;
	uint32		spare_size;
	uint32		*p_ecc_parity_from_reg;
	uint32		*p_ecc_parity_from_spare;
	uint32		*p_page;
	uint32		*p_spare;
	STATUS_E	ret=S_UNKNOWN_ERR;
	uint32		i;
	bool		bIsEmptyPage = TRUE;

	spare_size = NUTL_SPARE_SIZE(nand_info);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品一区二区三区蜜桃| 国产精品传媒视频| 日韩国产欧美在线视频| 欧美精品v国产精品v日韩精品| 图片区日韩欧美亚洲| 91精品国产综合久久香蕉麻豆 | 日韩成人一级片| 91精品国产91久久久久久一区二区| 麻豆国产一区二区| 欧美极品另类videosde| 色婷婷亚洲一区二区三区| 亚洲国产一区二区三区| 制服视频三区第一页精品| 国产一区二区三区蝌蚪| 中文字幕字幕中文在线中不卡视频| 欧美午夜免费电影| 美女视频第一区二区三区免费观看网站| 久久综合九色综合欧美亚洲| 99久久免费精品| 首页国产欧美久久| 日本一区二区成人| 欧美精品 国产精品| 国产精品亚洲第一区在线暖暖韩国| 国产精品丝袜一区| 欧美日韩中文一区| 国产麻豆精品theporn| 亚洲品质自拍视频| 337p粉嫩大胆噜噜噜噜噜91av | 日韩黄色小视频| 国产精品三级av| 制服丝袜亚洲播放| 成人午夜看片网址| 日韩福利视频导航| 国产精品久久久久久久久久久免费看 | 成人理论电影网| 视频一区二区不卡| 中文字幕乱码日本亚洲一区二区| 精品一区二区综合| 奇米精品一区二区三区在线观看 | 9l国产精品久久久久麻豆| 国产精品综合在线视频| 欧美日韩国产乱码电影| 欧美日韩极品在线观看一区| 91老师片黄在线观看| 91美女片黄在线观看| 一区二区三区欧美日韩| 看电视剧不卡顿的网站| 日韩1区2区3区| 麻豆国产精品777777在线| 日韩av电影天堂| 在线播放一区二区三区| 欧美日韩一级二级| 亚洲免费视频中文字幕| 色综合天天综合狠狠| 国产精品女同互慰在线看 | 美女爽到高潮91| 日本午夜精品视频在线观看| 久久精品久久久精品美女| 日本道免费精品一区二区三区| 亚洲一区二区高清| 99视频一区二区三区| 久久 天天综合| 中文字幕一区视频| 久久精品国产秦先生| 亚洲免费伊人电影| 成人激情午夜影院| 91免费视频大全| 国产亚洲成aⅴ人片在线观看| 欧美蜜桃一区二区三区| 色综合天天综合狠狠| 国产欧美综合色| 懂色av一区二区夜夜嗨| 日韩欧美久久久| 91亚洲男人天堂| 国产成人自拍在线| 欧美日本一道本在线视频| 久久久精品中文字幕麻豆发布| 国产米奇在线777精品观看| 韩国三级电影一区二区| 国产精品羞羞答答xxdd| 欧美影视一区在线| 夜夜精品视频一区二区| 亚洲影院在线观看| 欧美激情一区二区三区在线| 91精品在线一区二区| 大胆亚洲人体视频| 91极品美女在线| 国产亚洲欧美中文| 亚洲成av人片一区二区| 99re热这里只有精品视频| 椎名由奈av一区二区三区| 日韩美一区二区三区| 久久久久亚洲蜜桃| 精品久久久久99| 亚洲青青青在线视频| 久久aⅴ国产欧美74aaa| 麻豆视频一区二区| 精品视频一区 二区 三区| 国产成人精品免费| 精品在线观看免费| 亚洲视频图片小说| 精品国偷自产国产一区| 国产成人精品亚洲日本在线桃色| 日韩av高清在线观看| 欧美三级日本三级少妇99| 欧美系列日韩一区| 午夜视黄欧洲亚洲| 视频一区欧美日韩| 日韩午夜激情av| 视频一区视频二区在线观看| 日韩视频中午一区| 美女在线观看视频一区二区| 成人一区二区三区视频在线观看| 亚洲欧美日韩国产手机在线| 激情六月婷婷久久| 欧美xxxx在线观看| 久久亚洲综合av| 国产精品美女久久久久久2018| 国产精品视频在线看| 国产高清久久久久| 亚洲视频狠狠干| 国产福利一区二区三区| 懂色av一区二区在线播放| 欧美日韩免费在线视频| 欧美肥妇毛茸茸| 国产日本欧美一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 精品亚洲成av人在线观看| 一本一道综合狠狠老| 精品久久久网站| 亚洲最大的成人av| 国产精品乡下勾搭老头1| 欧美视频在线观看一区二区| 久久精品视频在线免费观看| 亚洲国产综合在线| 不卡av在线网| 久久综合久久综合久久| 丝袜美腿一区二区三区| 色综合久久久久综合体| 久久久久久久综合日本| 午夜精品福利一区二区蜜股av| 99久久伊人久久99| 精品国产乱码久久久久久1区2区| 亚洲国产精品视频| 91美女片黄在线观看91美女| 国产三级精品三级在线专区| 美女性感视频久久| 欧美日韩国产123区| 亚洲精品一二三区| 成人成人成人在线视频| 欧美精品一区二区三| 日韩精彩视频在线观看| 欧美亚州韩日在线看免费版国语版 | 亚洲摸摸操操av| 东方aⅴ免费观看久久av| 精品美女被调教视频大全网站| 视频一区视频二区中文| 欧美男人的天堂一二区| 亚洲国产美女搞黄色| 欧美亚洲图片小说| 一区二区三区av电影| 欧美在线|欧美| 亚洲综合自拍偷拍| 久久免费精品国产久精品久久久久| 婷婷久久综合九色国产成人| 欧美午夜电影网| 亚洲国产日韩a在线播放性色| 色94色欧美sute亚洲线路一ni| 最近中文字幕一区二区三区| 99国产欧美另类久久久精品| 亚洲人精品午夜| 欧美在线观看禁18| 亚洲观看高清完整版在线观看| 91福利在线看| 亚欧色一区w666天堂| 337p亚洲精品色噜噜| 奇米精品一区二区三区在线观看 | 欧美日韩国产免费| 日本麻豆一区二区三区视频| 日韩一区二区高清| 国内精品第一页| 欧美国产日韩亚洲一区| 99综合影院在线| 亚洲一区二区三区四区五区中文 | 欧美一a一片一级一片| 视频一区在线播放| 欧美sm极限捆绑bd| 国产91精品一区二区麻豆网站| 国产精品成人免费| 欧美中文字幕一二三区视频| 天堂资源在线中文精品| 日韩视频永久免费| 国产成人午夜电影网| 亚洲三级小视频| 9191国产精品| 国产a级毛片一区| 一区二区久久久久久| 日韩视频免费观看高清完整版| 狠狠色丁香九九婷婷综合五月| 国产精品成人免费在线|