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

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

?? nand_drv_common.c

?? MTK手機(jī)平臺(tái)下載工具FLASHTOOL驅(qū)動(dòng)源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*******************************************************************************
*  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
*
*******************************************************************************/

/*******************************************************************************
 *
 * Filename:
 * ---------
 *	 nand_drv_COMMON.c 
 *
 * Project:
 * --------
 *   FlashTool Download Agent 
 *
 * Description:
 * ------------
 *   General NAND flash driver compatible with most of SAMSUNG devices. 
 *
 * Author:
 * -------
 *	 Amos Hsu 
 *
 *==============================================================================
 * 				HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * $Revision:   1.1  $
 * $Modtime:   Dec 19 2005 15:41:24  $
 * $Log:   //mtkvs01/vmdata/new_flash_tool/archives/DA/SRC/nand_drv_COMMON.c-arc  $
 *
 * Feb 23 2006 mtk00539
 * [STP100000625] FlashTool v2.7.1016
 * 
 * 
 *    Rev 1.1   Dec 29 2005 10:53:18   mtk00539
 *  1. [DA] Add pre-process callback function to unlock all the blocks to meet ST NAND flash requirement. 
 * Resolution for 156: [FlashTool v2.7.1013][BUG FIX] Fix BootROM start command failure while manually selecting NMT6226 or MT6227 baseband chip.
 * 
 *    Rev 1.0   Oct 19 2005 14:41:06   mtk00539
 * Initial revision.
 * Resolution for 140: [BROM_DLL v2.7.1008][New] Support NFB download and many new features.
 * 
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *==============================================================================
 *******************************************************************************/
#include "nand_drv_COMMON.h"
#include "nand_util_func.h"
#include "NFI.h"

//------------------------------------------------------------------------------
// COMMON Callback Function Set                                                 
//------------------------------------------------------------------------------
const NAND_CMD_Callback_S	g_NAND_COMMON_CB_FUNC_SET={
	NAND_COMMON_ReadID
	,NAND_COMMON_Reset
	,NULL
	,NAND_COMMON_ReadStatus
	,NAND_COMMON_BlockErase
	,NAND_COMMON_BadBlockSymbol_Check
	,NAND_COMMON_BadBlockSymbol_Set
	,NAND_COMMON_PageRead
	,NAND_COMMON_PageProgram
	,NAND_COMMON_SpareRead
	,NAND_COMMON_SpareProgram
	,NAND_COMMON_CopyBack
};

//------------------------------------------------------------------------------
// COMMON Callback Function Set Without H/W CopyBack Function                   
//------------------------------------------------------------------------------
const NAND_CMD_Callback_S	g_NAND_COMMON_CB_FUNC_SET_WITHOUT_COPYBACK={
	NAND_COMMON_ReadID
	,NAND_COMMON_Reset
	,NULL
	,NAND_COMMON_ReadStatus
	,NAND_COMMON_BlockErase
	,NAND_COMMON_BadBlockSymbol_Check
	,NAND_COMMON_BadBlockSymbol_Set
	,NAND_COMMON_PageRead
	,NAND_COMMON_PageProgram
	,NAND_COMMON_SpareRead
	,NAND_COMMON_SpareProgram
	,NULL
};

//------------------------------------------------------------------------------
// Read Device ID Callback Function                                             
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_ReadID(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,uint16	*p_maker_code
				,uint16	*p_device_code
				,uint16 *p_ext_code1
				,uint16 *p_ext_code2
) {
	uint32	id1 = 0;
	uint16	nfi_pagefmt;
	STATUS_E	ret=S_UNKNOWN_ERR;

	// reset the NFI core state machine, data FIFO and flushing FIFO 
	*NFI_OPCON = 0x0;
	*NFI_CON = 0x0;
	*NFI_FIFOCON = 0x30;

	// always use 8bits I/O interface to read device id 
	nfi_pagefmt = *NFI_PAGEFMT;
	*NFI_PAGEFMT = nfi_pagefmt&(~PAGEFMT_16BITS)|PAGEFMT_8BITS;

	// read id cmd 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_read_id.m_cmd;
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	// issue addr 
	*NFI_ADDRL = 0;
	*NFI_ADDNOB = 1;
	// wait til ADDR is completely issued 
	while( *NFI_PSTA & STATUS_ADDR );

	// set single read by DWORD 
	*NFI_OPCON = SINGLE_RD | NOB_DWORD;
	// wait til DATA_READ is completely issued 
	while( *NFI_PSTA & STATUS_DATAR );

	// single read doesn't need to polling FIFO 
	id1 = *NFI_DATAR;

	*p_maker_code = (id1&0xFF);
	*p_device_code = ((id1>>8)&0xFF);
	*p_ext_code1 = ((id1>>16)&0xFF);
	*p_ext_code2 = ((id1>>24)&0xFF);

	ret = S_DONE;

	// restore original page format setting 
	*NFI_PAGEFMT = nfi_pagefmt;

	return ret;
}

//------------------------------------------------------------------------------
// Reset Device Callback Function                                               
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_Reset(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
) {
	uint32		timeout = c_timeout;
	STATUS_E	ret=S_UNKNOWN_ERR;

	// reset the NFI core state machine, data FIFO and flushing FIFO 
	*NFI_OPCON = 0x0;
	*NFI_CON = 0x0;
	*NFI_FIFOCON = 0x30;

	// enable interrupt 
	*NFI_INTR_EN = BUSY_RETURN_EN;

	// reset cmd 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_reset.m_cmd;
	
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	// wait for reset finish 
	timeout = c_timeout;
	NFI_Wait( !(*NFI_INTR & BUSY_RETURN), timeout);
	if( 0 == timeout ) {
		ret = S_TIMEOUT;
		goto end;
	}

	ret = S_DONE;

end:
	// disable interrupt 
	*NFI_INTR_EN = 0;

	return ret;
}

//------------------------------------------------------------------------------
// Read Status Callback Function                                                
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_ReadStatus(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
) {
	uint32	status;

	// read status cmd 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_status.m_cmd;
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	// set single read by DWORD 
	*NFI_OPCON = SINGLE_RD | NOB_DWORD;
	// wait til DATA_READ is completely issued 
	while( *NFI_PSTA & STATUS_DATAR );

	// single read doesn't need to polling FIFO 
	status = *NFI_DATAR;

	// check READY/BUSY status first 
	if( !(STATUS_READY&status) ) {
		return S_IN_PROGRESS;
	}

	// flash is ready now, check status code 
	if( STATUS_FAIL & status ) {
		if( !(STATUS_WR_ALLOW&status) ) {
			return S_BLOCK_LOCKED_ERR;
		}
		else {
			return S_UNKNOWN_ERR;
		}
	}
	else {
		return S_DONE;
	}
}

//------------------------------------------------------------------------------
// Block Erase Related Callback Function                                        
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_BlockErase(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  row_addr
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	addr_cycle;

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

	// reset the NFI core state machine, data FIFO and flushing FIFO 
	*NFI_OPCON = 0x0;
	*NFI_CON = 0x0;
	*NFI_FIFOCON = 0x30;

	// block erase cmd 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_erase.m_cmd;
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	// fill 1~4 cycle addr, erase command only fill row address, so column bits shift is unnecessary 
	*NFI_ADDRL = row_addr;
	*NFI_ADDRM = 0;
	// no. of addr cycle 
	if( 512 < page_size ) {
		*NFI_ADDNOB = addr_cycle-2;
	}
	else {
		*NFI_ADDNOB = addr_cycle-1;
	}
	// wait til ADDR is completely issued 
	while( *NFI_PSTA & STATUS_ADDR );

	// block erase confirm 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_erase_cnf.m_cmd;
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	return S_DONE;
}

//------------------------------------------------------------------------------
// Bad Block Symbol Identification Related Callback Function                    
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_BadBlockSymbol_Check(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  *p_spare32 /* MUST be 32bits alignment addr */
) {
	uint32	page_size;
	uint32	spare_size;
	uint32	column_addr_bits;
	uint32	addr_cycle;
	uint32	io_interface;
	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);
	column_addr_bits = NUTL_PAGE_ADDR_SHIFT_BITS(nand_info);
	addr_cycle = NUTL_ADDR_CYCLE(nand_info);
	io_interface = NUTL_IO_INTERFACE(nand_info);

	// check the invalid block status from spare area 
	if( 512 < page_size ) {
		// for 2048 page size flash, the invalid block status is defined by the 1st byte/word in spare area 
		if( NAND_IO_16BITS == io_interface ) {
			if( 0xFFFF != p_spare16[0] ) {
				return S_BAD_BLOCK;
			}
		}
		else {
			if( 0xFF != p_spare8[0] ) {
				return S_BAD_BLOCK;
			}
		}
	}
	else {
		// for 512 page size flash 
		if( NAND_IO_16BITS == io_interface ) {
#if 0
			// for 16 bits I/O, the invalid block status is defined by the 1st and 6th word in spare area 
			if( 0xFFFF!=p_spare16[0] || 0xFFFF!=p_spare16[5] ) {
#else
			// for 16 bits I/O, the invalid block status is defined by the 1st word in spare area 
			if( 0xFFFF != p_spare16[0] ) {
#endif
				return S_BAD_BLOCK;
			}
		}
		else {
			// for 8 bits I/O, the invalid block status is defined by the 6th byte in spare area 
			if( 0xFF != p_spare8[5] ) {
				return S_BAD_BLOCK;
			}
		}
	}

	return S_DONE;
}

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

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

	// reset spare 
	for(i=0; i<(spare_size>>2); i++) {
		p_spare32[i] = 0xAAAAAAAA;
	}

	// check the invalid block status from spare area 
	if( 512 < page_size ) {
		// for 2048 page size flash, the invalid block status is defined by the 1st byte/word in spare area 
		if( NAND_IO_16BITS == io_interface ) {
			p_spare16[0] = 0x0;
		}
		else {
			p_spare8[0] = 0x0;
		}
	}
	else {
		// for 512 page size flash 
		if( NAND_IO_16BITS == io_interface ) {
#if 0
			// for 16 bits I/O, the invalid block status is defined by the 1st and 6th word in spare area 
			p_spare16[0] = 0x0;
			p_spare16[5] = 0x0;
#else
			// for 16 bits I/O, the invalid block status is defined by the 1st word in spare area 
			p_spare16[0] = 0x0;
#endif
		}
		else {
			// for 8 bits I/O, the invalid block status is defined by the 6th byte in spare area 
			p_spare8[5] = 0x0;
		}
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Page Read Callback Function                                                  
//------------------------------------------------------------------------------
STATUS_E  NAND_COMMON_PageRead(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,const uint32  row_addr
				,uint32 *p_data32 /* MUST be 32bits alignment addr */
				,uint32  ecc_parity_from_reg[4]
) {
	uint32		page_size;
	uint32		spare_size;
	uint32		column_addr_bits;
	uint32		addr_cycle;
	STATUS_E	ret=S_UNKNOWN_ERR;
	bool		bUsingDMA=TRUE;

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

	// reset the NFI core state machine, data FIFO and flushing FIFO 
	*NFI_OPCON = 0x0;
	*NFI_CON = 0x0;
	*NFI_FIFOCON = 0x30;

	// read cmd 
	*NFI_CMD = nand_info->m_dev->m_cmd_set->m_read.m_cmd;
	// wait til CMD is completely issued 
	while( *NFI_PSTA & STATUS_CMD );

	// fill 1~4 cycle addr 
	*NFI_ADDRL = (row_addr<<column_addr_bits);
	*NFI_ADDRM = 0;
	if( 4 < addr_cycle ) {
		// if addr cycle is more than 4, you have to fill 5th cycle addr 
		*NFI_ADDRM = (row_addr>>(32-column_addr_bits));
	}
	// no. of addr cycle 
	*NFI_ADDNOB = addr_cycle;
	// wait til ADDR is completely issued 
	while( *NFI_PSTA & STATUS_ADDR );


	// read confirm 
	if(nand_info->m_dev->m_cmd_set->m_read_cnf.m_enable) {
		*NFI_CMD = nand_info->m_dev->m_cmd_set->m_read_cnf.m_cmd;
	}
	// set burst read by DWORD 
	*NFI_OPCON = BURST_RD | NOB_DWORD;
	// wait til DATA_READ is completely issued 
	while( *NFI_PSTA & STATUS_DATAR );


#ifdef DISABLE_NFI_DMA
	bUsingDMA = FALSE;
#else
	bUsingDMA = TRUE;
	// activating DMA transfer 
	*NFI_CON |= DMA_RD_EN;
#endif

	// read page data 
	if( S_DONE != (ret=NUTL_FIFO_Read(c_timeout, bUsingDMA, p_data32, page_size)) ) {
		goto end;
	}

	// <<<<  WARNING!! >>>>                                                               
	// 1. You MUST wait until the NFI FIFO is empty.                                      
	//    It means all data in the FIFO had been read out, and then you can start to read 
	//    ECC parity registers.                                                           
	while(!(*NFI_FIFOCON & RD_EMPTY_MASK));

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产一区二区在线播放| 成人综合在线观看| 欧美日韩精品二区第二页| 一区二区三区四区激情| 在线观看欧美日本| 日本在线不卡视频| 欧美本精品男人aⅴ天堂| 国产毛片一区二区| 中文字幕在线观看一区| 欧美三级韩国三级日本三斤| 日韩av一二三| 国产农村妇女毛片精品久久麻豆| www.欧美精品一二区| 一区二区在线观看不卡| 91麻豆精品久久久久蜜臀| 国产精一区二区三区| 综合久久给合久久狠狠狠97色| 欧美伊人久久久久久午夜久久久久| 午夜国产精品影院在线观看| 久久影院午夜片一区| 91久久精品日日躁夜夜躁欧美| 亚洲成人av一区二区| 久久精品亚洲精品国产欧美| 91久久精品国产91性色tv| 久久99精品一区二区三区三区| 国产精品久久免费看| 欧美亚洲综合一区| 国产一区二区电影| 亚洲精品日日夜夜| 精品国产免费视频| 欧美综合视频在线观看| 精品无人区卡一卡二卡三乱码免费卡| 国产精品福利在线播放| 91麻豆精品国产91久久久久久 | 91视频国产资源| 视频一区二区欧美| 国产精品麻豆久久久| 欧美二区在线观看| 99久久精品国产导航| 久久国产人妖系列| 亚洲成人你懂的| 亚洲欧洲美洲综合色网| 91麻豆精品国产91| 91蜜桃免费观看视频| 国产在线国偷精品产拍免费yy| 夜夜爽夜夜爽精品视频| 国产婷婷一区二区| 欧美大片一区二区| 欧美日本不卡视频| 99re6这里只有精品视频在线观看| 麻豆精品蜜桃视频网站| 亚洲小少妇裸体bbw| 亚洲天堂av一区| 国产视频一区二区在线观看| 日韩欧美国产一区在线观看| 欧美日韩精品免费| 欧美影院精品一区| 在线精品视频一区二区三四| 成人av先锋影音| 成人中文字幕电影| 国产激情一区二区三区| 激情图片小说一区| 麻豆精品视频在线观看视频| 日本最新不卡在线| 日韩电影免费在线| 日韩专区欧美专区| 天天综合天天综合色| 亚洲国产另类av| 午夜精品久久久久影视| 亚洲高清免费观看高清完整版在线观看 | 亚洲一区二区3| 亚洲美女视频在线| 亚洲欧美国产毛片在线| 日韩美女久久久| 亚洲乱码一区二区三区在线观看| 国产精品午夜久久| 国产精品欧美一区喷水| 中文字幕精品三区| 亚洲六月丁香色婷婷综合久久 | 亚洲成人tv网| 日本中文字幕一区| 久久精品噜噜噜成人88aⅴ | 激情五月播播久久久精品| 免费在线观看一区二区三区| 五月天中文字幕一区二区| 丝袜诱惑亚洲看片| 久久精品国产99| 国产精品一级黄| 成人激情视频网站| 色综合久久久久| 欧美精品123区| 日韩久久久精品| 日本一区免费视频| 最新日韩在线视频| 午夜精品久久久久| 国产在线麻豆精品观看| 成人免费视频一区二区| 一本久久精品一区二区| 欧美肥妇毛茸茸| 国产婷婷色一区二区三区四区| 国产精品福利av| 日韩avvvv在线播放| 国精产品一区一区三区mba视频 | 91小视频在线| 欧美日韩精品免费观看视频| 精品处破学生在线二十三| 国产亲近乱来精品视频| 亚洲综合色网站| 久久国产人妖系列| 91麻豆福利精品推荐| 91麻豆精品国产91久久久资源速度 | 99久久久无码国产精品| 欧美人与禽zozo性伦| 久久精品这里都是精品| 亚洲一区在线播放| 国产在线精品不卡| 欧美性猛交xxxx黑人交| 精品国产髙清在线看国产毛片| 国产精品美女久久久久久2018| 亚洲一区二三区| 国产在线一区观看| 欧美在线免费观看亚洲| 久久精品亚洲乱码伦伦中文| 亚洲福利视频一区| www.久久久久久久久| 日韩天堂在线观看| 亚洲欧美日韩在线播放| 久久99精品国产麻豆婷婷| 色婷婷亚洲婷婷| 国产人久久人人人人爽| 日产国产欧美视频一区精品| 91在线视频网址| 26uuu国产在线精品一区二区| 亚洲一区二区欧美| www.色综合.com| 久久亚洲春色中文字幕久久久| 亚洲综合999| 国产不卡一区视频| 欧美大片日本大片免费观看| 亚洲一区二区视频在线| 成人激情校园春色| 久久综合九色综合欧美亚洲| 日日噜噜夜夜狠狠视频欧美人| 99国产精品视频免费观看| 久久久久久久电影| 精品午夜一区二区三区在线观看 | 一本久久精品一区二区| 亚洲国产电影在线观看| 国产美女在线观看一区| 欧美一区二区三区公司| 夜夜爽夜夜爽精品视频| 91丨九色丨尤物| 国产精品电影一区二区| 国产精品亚洲视频| 久久精品一区二区三区不卡牛牛 | 麻豆精品一二三| 欧美一级久久久久久久大片| 亚洲国产裸拍裸体视频在线观看乱了| 91在线精品秘密一区二区| 国产欧美精品一区| 国产宾馆实践打屁股91| 久久久三级国产网站| 久久99精品久久久久婷婷| 日韩精品一区国产麻豆| 日本系列欧美系列| 91精品国产综合久久香蕉麻豆| 亚洲午夜一区二区三区| 欧美日韩视频在线第一区| 亚洲国产视频在线| 欧美男女性生活在线直播观看| 亚洲第一狼人社区| 欧美一二区视频| 九九视频精品免费| 国产日本亚洲高清| 99久久精品国产毛片| 一个色妞综合视频在线观看| 欧美日韩精品高清| 麻豆精品在线播放| 久久精品人人做| 99在线视频精品| 亚洲成人av免费| 精品久久久三级丝袜| 国产成人亚洲综合a∨婷婷 | 欧美成人三级电影在线| 精品在线观看视频| 日本一区二区动态图| av电影一区二区| 亚洲永久免费av| 日韩亚洲欧美综合| 风间由美一区二区三区在线观看 | 制服丝袜国产精品| 国内精品第一页| 最新欧美精品一区二区三区| 色悠悠久久综合| 美女爽到高潮91| 国产精品热久久久久夜色精品三区| 91农村精品一区二区在线| 亚洲成人一二三| 国产欧美一区二区三区在线老狼| 色婷婷av久久久久久久|