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

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

?? nand_drv_common.c

?? MTK手機平臺下載工具FLASHTOOL驅(qū)動源碼
?? 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
*
*******************************************************************************/

/*******************************************************************************
 *
 * 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));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人天堂一区| 久久久青草青青国产亚洲免观| 亚洲免费观看高清| 91日韩精品一区| 亚洲综合在线电影| 在线一区二区观看| 香蕉久久一区二区不卡无毒影院 | 日韩一区二区免费电影| 老司机免费视频一区二区| 精品欧美久久久| 国产69精品久久久久777| 自拍偷在线精品自拍偷无码专区| 91黄色免费观看| 久久不见久久见中文字幕免费| 欧美精品一区二区蜜臀亚洲| 成人精品小蝌蚪| 亚洲综合清纯丝袜自拍| 欧美一级一区二区| 国产老肥熟一区二区三区| 国产精品国产三级国产普通话蜜臀| 在线观看欧美黄色| 另类小说视频一区二区| 中文字幕第一页久久| 欧美日韩免费一区二区三区视频| 亚洲免费视频成人| 日韩视频免费观看高清完整版在线观看| 国产一区二区三区免费| 亚洲欧美激情小说另类| 日韩精品一区二区三区视频在线观看| 国产精品一区免费在线观看| 亚洲欧美日韩在线| 久久新电视剧免费观看| 91黄色在线观看| 国产精品996| 午夜精品久久久久久久 | 欧美国产一区在线| 日本韩国精品在线| 狠狠久久亚洲欧美| 亚洲一线二线三线视频| 久久精品一区二区三区av | 91麻豆精品久久久久蜜臀| 成人精品一区二区三区中文字幕| 午夜一区二区三区视频| 国产精品美女久久久久久2018| 欧美日韩午夜影院| 99久久99久久精品免费看蜜桃| 日本一不卡视频| 一区二区三区欧美| 国产精品欧美经典| 欧美大片免费久久精品三p| 日本韩国精品一区二区在线观看| 国产盗摄精品一区二区三区在线| 日韩精品成人一区二区在线| 亚洲激情在线播放| 国产精品美女久久久久aⅴ国产馆| 91精品国产乱码| 在线观看免费亚洲| 99久久伊人久久99| 国产麻豆精品久久一二三| 日韩高清一级片| 亚洲男女毛片无遮挡| 国产人成亚洲第一网站在线播放| 91精品国产麻豆| 欧美日韩成人一区| 欧美午夜一区二区三区免费大片| 91免费看`日韩一区二区| 激情综合网天天干| 久久精品国产成人一区二区三区| 亚洲123区在线观看| 亚洲一区二区在线播放相泽| 亚洲美女淫视频| 亚洲欧美国产77777| 国产精品久久一级| 中文字幕精品一区| 日本一区二区成人| 欧美国产日韩精品免费观看| 久久精品人人做人人爽人人| 久久久亚洲高清| 久久久天堂av| 中文天堂在线一区| 国产精品国产三级国产三级人妇 | av一二三不卡影片| 本田岬高潮一区二区三区| 高清国产一区二区| 成人动漫一区二区在线| 成人18视频在线播放| av网站免费线看精品| 99国产精品视频免费观看| caoporn国产精品| 91久久香蕉国产日韩欧美9色| 在线欧美一区二区| 欧美日韩一区国产| 日韩久久久精品| 国产视频一区在线观看| 中文字幕在线不卡视频| 亚洲黄色性网站| 亚洲成人av电影| 国产传媒日韩欧美成人| 精品在线播放免费| 成人激情小说乱人伦| 在线观看视频一区| 欧美二区三区的天堂| 欧美www视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲123区在线观看| 热久久免费视频| 国产原创一区二区三区| 成人h版在线观看| 欧美色大人视频| 精品国产制服丝袜高跟| 日韩理论在线观看| 丝袜亚洲另类欧美| 国产精品99久久久久久久vr| 91天堂素人约啪| 日韩欧美精品三级| **性色生活片久久毛片| 日本最新不卡在线| 成人性生交大片免费| 欧美日韩免费观看一区三区| 日韩免费一区二区| 亚洲欧美怡红院| 国内久久婷婷综合| 色哟哟日韩精品| 久久久久久影视| 午夜国产不卡在线观看视频| 国产成人aaaa| 日韩一区国产二区欧美三区| 中文字幕一区二区三区精华液| 亚洲国产一二三| 成人黄色小视频| 精品国产一区久久| 亚洲成人第一页| www.视频一区| 精品国产一区二区三区不卡| 亚洲国产精品久久久久婷婷884| 国产酒店精品激情| 欧美日韩成人激情| 亚洲人吸女人奶水| 国产二区国产一区在线观看 | 欧美一区二区三区在线视频| 中文幕一区二区三区久久蜜桃| 日本不卡视频在线| 色香色香欲天天天影视综合网| 久久久99久久精品欧美| 五月天视频一区| 91成人免费在线| 亚洲人成网站影音先锋播放| 成人精品免费看| 久久综合九色综合97婷婷| 日日欢夜夜爽一区| 一本一道久久a久久精品 | 欧美一区二区精品久久911| 亚洲日本青草视频在线怡红院| 国产九色精品成人porny | 成人在线一区二区三区| 欧美精品一区二区三区蜜桃视频| 亚洲高清一区二区三区| 91在线观看地址| 国产精品嫩草99a| 国产91精品精华液一区二区三区| 日韩情涩欧美日韩视频| 日日摸夜夜添夜夜添精品视频 | 色综合欧美在线视频区| 欧美国产一区视频在线观看| 国产一区中文字幕| 国产三级精品在线| 国产精品一二三在| 久久嫩草精品久久久久| 国产一区999| 国产三级一区二区| 国产另类ts人妖一区二区| 久久综合99re88久久爱| 精一区二区三区| 国产亚洲1区2区3区| 精品一区二区三区在线播放视频| 精品日韩成人av| 国产精品一区在线| 国产精品久久久久久久久搜平片 | 99久久精品免费精品国产| 国产精品看片你懂得| 91在线观看成人| 亚洲一区二区三区视频在线| 欧美精品99久久久**| 美国欧美日韩国产在线播放 | 国产精品全国免费观看高清| 91丨九色丨蝌蚪丨老版| 亚洲综合视频网| 日韩欧美在线网站| 国产成人夜色高潮福利影视| 国产精品麻豆视频| 欧美曰成人黄网| 久久电影网电视剧免费观看| 亚洲精品一区二区三区在线观看| 国产**成人网毛片九色| 亚洲免费高清视频在线| 欧美日韩精品一区视频| 免费欧美高清视频| 91麻豆精东视频| 日韩精品免费专区| 5566中文字幕一区二区电影|