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

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

?? bl_nfi.c

?? mtk 平臺 bootloader
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   bl_NFI.c
 *
 * Project:
 * --------
 *   Bootloader
 *
 * Description:
 * ------------
 *   NANDFlash driver.
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/

#include <kal_release.h>
#include <bl_loader.h>
#include <bl_NFI.h>

      //------------------------------------------------------- 
		// 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.                     
		//                             
		//------------------------------------------------------- 
		// 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.                       
		//                                                                  

typedef union 
{
	kal_uint8  	d8[4];
	kal_uint16  d16[2];
	kal_uint32  d32;
} UnionData_U;


#ifdef BIT_ERROR_TEST

extern BOOTL_HEADER  BLHeader;   

void EmulateBitError(kal_uint32 *destination, kal_uint32 *parity, kal_uint16 addr_no, kal_uint32 addr1, kal_uint16 addr2, kal_uint16 pageSize)
{
	kal_uint8 BitNo, status, Sector, Mask;
	kal_uint32 Offset, MagicNum;
	kal_bool EmulatedBitError;
	kal_uint8 *Ptr = (kal_uint8 *)destination;


	NFI_PageRead(destination, parity, pageSize, addr_no, addr1, addr2, pageSize, KAL_TRUE, KAL_FALSE);
	status = NFI_ParityCheck(destination, parity, addr_no, addr1, addr2, \
								pageSize, BLHeader.NFIinfo.IOInterface, \
								BLHeader.NFIinfo.pageSize*BLHeader.pagesPerBlock);                          
	if (status != NFI_SUCCESS) {
		dbg_print(" Original data has error. No need to emulate bit error. status=%x \n\r", status);
		return;
	}

	for(Sector=0; Sector<(pageSize/0x200); Sector++) {
		EmulatedBitError = KAL_FALSE;
		if(pageSize < 1024) {
			MagicNum = (addr1>>16) ^ (addr1>>8);
		} else {
			MagicNum = (addr1>>16) ^ (addr1>>24);
		}
		for(Offset=(MagicNum & 0x1ff); Offset<0x200; Offset++) {
			Mask = 0x01;
			for(BitNo=0; BitNo<8; BitNo++) {
				if(Ptr[Sector*0x200+Offset] & Mask) {
					dbg_print("***[Emulate] Offset = %x, Original data = %x", addr1+(Sector*0x200)+Offset, Ptr[Sector*0x200+Offset]);
					Ptr[Sector*0x200+Offset] = Ptr[Sector*0x200+Offset] & (~Mask);
					dbg_print(" New data  = %x \n\r", Ptr[Sector*0x200+Offset]);
					EmulatedBitError = KAL_TRUE;
					break;
				}
				Mask = Mask << 1;
			}
			if(EmulatedBitError==KAL_TRUE) {
				break;
			}
		}
	}

	*NFI_FIFOCON = RESET;
	*NFI_CON = 0;
	if(pageSize<1024) {
		*NFI_CMD = RD_1ST_CMD;             // Set poiner to 0.
		while (*NFI_PSTA & STATUS_CMD);
		*NFI_OPCON = 0;
		while (*NFI_PSTA & STATUS_CMD);
		*NFI_FIFOCON = RESET;			
	}
	*NFI_CMD = INPUT_DATA_CMD;                  // Issue data input command
	while (*NFI_PSTA & STATUS_CMD);
	*NFI_ADDRL = addr1;
	if (addr_no == 5)
	    *NFI_ADDRM = addr2;
	*NFI_ADDNOB = addr_no;  // no. of bytes for address
	while (*NFI_PSTA & STATUS_ADDR);

	*NFI_OPCON = BURST_WR;                      // set burst write

	*NFI_CON = DMA_WR_EN;

	*(volatile kal_uint32 *)(0x80030118) = 0x0000;
	*(volatile kal_uint32 *)(0x80030100) = (kal_uint32)destination;
	*(volatile kal_uint32 *)(0x80030104) = (kal_uint32)NFI_DATAW;
	*(volatile kal_uint32 *)(0x80030110) = pageSize>>2;
	*(volatile kal_uint32 *)(0x80030114) = 0x01000016;
	*(volatile kal_uint32 *)(0x80030128) = 0;
	*(volatile kal_uint32 *)(0x80030118) = 0x8000;

	while ( ((*(volatile kal_uint32 *)(0x80030000)&0x03)==0x01) ); 

	*NFI_CMD = PROG_DATA_CMD;       // Issue program command
	while (*NFI_PSTA & STATUS_CMD);

	while (*NFI_PSTA & STATUS_BUSY);
	*NFI_OPCON = 0;

	return;
} 

#endif

/**********************************************************
Description : NUTL_ECC_Correction
Input       : .......
Output      : _RET_CODE
***********************************************************/            
_RET_CODE  NUTL_ECC_Correction(kal_uint32 *dataPtr, kal_uint32 *parityPtr, kal_uint32 *sparePtr, \
                               kal_uint16 pageSize, kal_uint32 blockSize)	
{
   kal_uint8   update_data;
   kal_uint32  i;
	kal_uint32  error_bit_address;
	kal_uint32  error_bit_offset;
	kal_uint8   *p_data8 = (kal_uint8 *)dataPtr;		
	kal_uint32  ecc_parity_from_spare[5] = {0,0,0,0,0};	
	kal_uint32  *ecc_parity_from_reg = parityPtr;
	UnionData_U	xor_ecc_parity[4];
	kal_uint8   status = NFI_SUCCESS;
	

   if ( pageSize==512 )
   {
      ecc_parity_from_spare[0] = *(sparePtr + 2);
   }
   else
   {
      ecc_parity_from_spare[0] = *(sparePtr + 11);
      ecc_parity_from_spare[1] = *(sparePtr + 12);
      ecc_parity_from_spare[2] = *(sparePtr + 13);
      ecc_parity_from_spare[3] = *(sparePtr + 14);
   }
   
	// 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<(pageSize/0x200); 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 = 0x200*i + (error_bit_address>>3);
				update_data = p_data8[error_bit_offset];
				update_data = update_data^(1<<(kal_uint8)(error_bit_address&0x0007));
#ifdef BIT_ERROR_TEST
				dbg_print(" ECC error address=%x error bit=%x Original=%x corrected data=%x \n\r", 
					error_bit_offset, error_bit_address & 0x07, p_data8[error_bit_offset], update_data);				
#endif
				p_data8[error_bit_offset] = update_data;

				if(status==NFI_SUCCESS) {
					status = NFI_ECC_1BIT_CORRECT;
				}
			} 
			else 
			{
				kal_uint32 iIndex=0,iEccsum=0;

				for(iIndex = 0; iIndex < 12; iIndex++)
				{
				   iEccsum += ((xor_ecc_parity[i].d16[0] >> iIndex) & 0x01);
				   iEccsum += ((xor_ecc_parity[i].d16[1] >> iIndex) & 0x01);
				}
				if(iEccsum ==1)
				{
				   // ECC code error.
				   dbg_print(" ECC code error... \n\r");
				   continue;
				}

/*				dbg_print(" ECC error ... \n\r");
				dbg_print(" Register %x \n\r", ecc_parity_from_reg[i]);
				dbg_print(" Spare %x \n\r", ecc_parity_from_spare[i]);*/
				if(status!=NFI_ECC_2BITS_ERR) {
					status = NFI_ECC_2BITS_ERR;
				}
			}
		}
	}

	return status;
}

/**********************************************************
Description : NFI_PageRead
Input       : .......
Output      : _RET_CODE
Remark      : Must be page alignment
***********************************************************/
_RET_CODE NFI_PageRead(kal_uint32 *destination, kal_uint32 *parity, kal_uint32 length, \
                       kal_uint16 addr_no, kal_uint32 addr1, kal_uint16 addr2, kal_uint16 pageSize, \
                       kal_bool ECC, kal_bool continous)
{
   kal_int16   timeout=0xfff;
   kal_uint32  *parity_ptr = parity;
   
   *NFI_OPCON = 0x00;   
   *NFI_CON = 0x00;        
   *NFI_FIFOCON = 0x30;                  // Flushing FIFO

   if ( pageSize<1024 )
   {
	   *NFI_CMD = RD_1ST_CMD;             // read command 
	   while (*NFI_PSTA & STATUS_CMD);	   
	   *NFI_ADDRL = addr1;
	   if ( addr_no>4 )

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美高清性hdvideosex| 欧美一区二区在线看| 一本色道久久综合狠狠躁的推荐 | 不卡电影一区二区三区| 色婷婷激情综合| 精品免费一区二区三区| 综合精品久久久| 免费xxxx性欧美18vr| 不卡一二三区首页| 欧美成人video| 亚洲一区二区四区蜜桃| 国产精品一二三四五| 欧美午夜精品一区| 久久网这里都是精品| 亚洲国产一二三| 国产成人免费在线视频| 精品视频免费在线| 国产日本一区二区| 青娱乐精品在线视频| 91美女蜜桃在线| 国产亚洲视频系列| 日本亚洲最大的色成网站www| 国产精品18久久久| 日韩片之四级片| 亚洲综合色丁香婷婷六月图片| 国产在线播放一区| 91麻豆精品国产| 亚洲在线免费播放| caoporn国产一区二区| 亚洲精品在线免费观看视频| 视频一区二区不卡| 欧美色倩网站大全免费| 综合中文字幕亚洲| 成人国产精品免费网站| 久久精品一区蜜桃臀影院| 老司机午夜精品| 在线播放中文一区| 亚洲电影第三页| 色94色欧美sute亚洲线路一ni| 国产精品麻豆99久久久久久| 国产大陆精品国产| 2021中文字幕一区亚洲| 蜜桃精品视频在线| 91精品国产色综合久久不卡电影 | 天堂蜜桃一区二区三区| 91在线免费播放| 国产精品国产三级国产a| 国产v综合v亚洲欧| 日韩视频中午一区| 青青草一区二区三区| 538prom精品视频线放| 日韩国产欧美三级| 欧美中文字幕一区二区三区亚洲 | 久久99精品久久久久婷婷| 欧美一三区三区四区免费在线看| 婷婷夜色潮精品综合在线| 欧美久久一二区| 美日韩一区二区| 久久嫩草精品久久久精品一| 国产成人久久精品77777最新版本| 国产日韩三级在线| 91麻豆精东视频| 亚洲成av人片www| 日韩欧美电影一二三| 国产成人在线看| 亚洲人成电影网站色mp4| 在线区一区二视频| 欧美aaaaa成人免费观看视频| 欧美精品一区在线观看| 成人深夜视频在线观看| 一区二区三区中文字幕电影| 337p亚洲精品色噜噜狠狠| 久久精品国产99久久6| 久久久五月婷婷| 91亚洲国产成人精品一区二三| 亚洲va在线va天堂| 久久亚洲二区三区| 99精品视频一区| 日韩精品一二三四| 欧美激情综合在线| 精品视频全国免费看| 国产伦精品一区二区三区视频青涩 | 日本一区二区三区免费乱视频| jlzzjlzz亚洲日本少妇| 水蜜桃久久夜色精品一区的特点| 精品国产电影一区二区| 97成人超碰视| 精品一区二区成人精品| 亚洲欧美日韩电影| 欧美精品一区二区高清在线观看| 99精品视频在线播放观看| 奇米888四色在线精品| 亚洲欧美色综合| 久久香蕉国产线看观看99| 欧美午夜影院一区| 国产1区2区3区精品美女| 天堂影院一区二区| 欧美xfplay| 日韩一区二区视频在线观看| 成人免费va视频| 日韩成人免费在线| 亚洲欧美偷拍卡通变态| 精品国产三级a在线观看| 欧美色网站导航| av在线不卡免费看| 国产中文字幕一区| 香蕉影视欧美成人| 亚洲免费毛片网站| 国产情人综合久久777777| 日韩一区二区三区四区五区六区| 一本大道久久a久久精二百| 国产在线国偷精品免费看| 日韩高清不卡一区二区三区| 亚洲卡通动漫在线| 国产精品女主播av| 国产欧美一区二区精品婷婷 | 精品一区二区三区香蕉蜜桃| 亚洲国产乱码最新视频| 亚洲一区视频在线| 日韩免费观看高清完整版| 在线一区二区视频| 99久久免费视频.com| 成人精品视频网站| 国产精品99久久久久久有的能看| 精品一区二区三区免费毛片爱| 日本欧美在线看| 免费黄网站欧美| 奇米色一区二区三区四区| 日韩精品视频网| 日韩av电影天堂| 日本欧美一区二区| 蜜桃av一区二区三区| 麻豆精品一区二区av白丝在线| 日韩福利视频导航| 蜜臀av性久久久久蜜臀aⅴ四虎| 午夜精品久久久久久久蜜桃app| 亚洲午夜在线电影| 午夜久久电影网| 美女网站色91| 国产精品18久久久久久久久久久久 | 亚洲综合男人的天堂| 亚洲免费在线播放| 亚洲免费观看高清| 亚洲制服丝袜一区| 成人国产一区二区三区精品| 欧美电影一区二区三区| 欧美在线观看视频在线| 欧洲视频一区二区| 91免费观看视频| 日韩va亚洲va欧美va久久| 视频一区视频二区中文| 美脚の诱脚舐め脚责91| 国产一区二区三区四区五区入口 | 久久天天做天天爱综合色| 久久久亚洲综合| 首页国产欧美日韩丝袜| 91色porny在线视频| 欧美亚洲国产怡红院影院| 欧美一三区三区四区免费在线看 | 热久久国产精品| 国产精品自拍av| 色诱视频网站一区| 日韩欧美不卡在线观看视频| 国产精品欧美一区二区三区| 亚洲国产精品久久人人爱| 精品一区二区三区在线观看| 成人黄色av网站在线| 欧美年轻男男videosbes| 国产日韩欧美制服另类| 亚洲va国产天堂va久久en| 国产精品123区| 欧美日韩国产精选| 中文字幕免费在线观看视频一区| 亚洲国产日韩a在线播放| 国产麻豆精品视频| 欧美男男青年gay1069videost| 欧美视频在线一区| 精品国产髙清在线看国产毛片| 亚洲欧美日韩国产一区二区三区| 青青草原综合久久大伊人精品优势 | 久久久久88色偷偷免费| 亚洲成人av免费| 成人av免费网站| 久久夜色精品国产噜噜av| 性久久久久久久| 色综合天天综合色综合av| 久久蜜桃av一区二区天堂| 亚洲成人资源在线| 99久久伊人久久99| 久久久久久久久久久久久女国产乱| 亚洲国产精品自拍| 99热这里都是精品| 国产亚洲精久久久久久| 麻豆传媒一区二区三区| 欧美久久久久免费| 一区二区三区在线免费视频 | 亚洲午夜精品久久久久久久久| 精品在线观看免费| 欧美另类高清zo欧美| 夜夜亚洲天天久久|