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

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

?? nand_util_func.c

?? MTK手機(jī)平臺(tái)下載工具FLASHTOOL驅(qū)動(dòng)源碼
?? C
?? 第 1 頁(yè) / 共 3 頁(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_util_func.c 
 *
 * Project:
 * --------
 *   FlashTool Download Agent 
 *
 * Description:
 * ------------
 *   NAND flash related utility functions. 
 *
 * Author:
 * -------
 *	 Amos Hsu 
 *
 *==============================================================================
 * 				HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * $Revision:   1.3  $
 * $Modtime:   Jan 04 2006 14:32:44  $
 * $Log:   //mtkvs01/vmdata/new_flash_tool/archives/DA/SRC/nand_util_func.c-arc  $
 *
 * Mar 8 2006 mtk00539
 * [STP100000669] [DA] Support RENESAS superAND flash read back and format operation.
 * 
 *
 * Feb 23 2006 mtk00539
 * [STP100000625] FlashTool v2.7.1016
 * 
 * 
 *    Rev 1.3   Jan 04 2006 14:40:10   mtk00539
 * Bug fixes:
 *  1. [DA] Fix Spansion S71PLXXXN detection problem by reading CFI info.
 *  2. [DA] Fix TOSHIBA NAND flash callback function set, because TOSHIBA NAND flash doesn't support CopyBack command.
 *  
 * New features:
 *  1. [DA] Supports Spansion MirrorBit Buffer-Program method.
 *  2. [DA] Supports new NOR flash device.
 * 		[SPANSION] S71PL129N
 * 
 * Enhancements:
 *  1. [DA] Halt program when external RAM is less than 128KB.
 * Resolution for 158: [FlashTool v2.7.1014][New] Support Spansion MirrorBit Buffer-Program method.
 * 
 *    Rev 1.2   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.1   Nov 27 2005 16:38:54   mtk00539
 * 1. [DA][BUG FIX] Add NUTL_VERIFY_AFTER_PROGRAM flash to perform read back verification after program operation. 
 * 2. [DA][BUG FIX] Use mem_overlap_copy() instead of memcpy() to fix RegionRelocation() failure.
 * Resolution for 151: [BROM_DLL v2.7.1012][BUG FIX] Cannot recognize 05B ROM_INFO header.
 * 
 *    Rev 1.0   Oct 19 2005 14:41:08   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_dev_tbl.h"
#include "nand_util_func.h"
#include "NFI.h"
#include "hw_config.h"

typedef struct {
	NAND_PageBuffer_U	m_PageBuf;
	uint32				m_ecc_parity_from_reg[4];
	uint32				m_ecc_parity_from_spare[4];
} NUTL_InternalTempBuf_S;

NUTL_InternalTempBuf_S		g_NUTL_PageRead_Var;
NUTL_InternalTempBuf_S		g_NUTL_PageProgram_Var;
NUTL_InternalTempBuf_S		g_NUTL_CopyBack_Var;

//------------------------------------------------------------------------------
// NFI Initialization                                                           
//------------------------------------------------------------------------------
STATUS_E  NUTL_NFI_Init(uint32  nfi_acccon, bool bEnableCS1) {

	volatile uint16 *p_reg_power_down_clear_0;
	volatile uint16 *p_reg_power_down_clear_1;

	p_reg_power_down_clear_0 = g_HW_DevCfg.m_hw_bbcfg->m_PDN->m_reg_power_down_clear_0;
	p_reg_power_down_clear_1 = g_HW_DevCfg.m_hw_bbcfg->m_PDN->m_reg_power_down_clear_1;

	g_pNandInfo = &g_NandFlashInfo;

	// assign a default H/W device info 
	g_pNandInfo->m_dev = &(g_NandFlashDevTbl[0]);

	// power on NFI 
	*(p_reg_power_down_clear_1) = 0x1000;

	// power on DMA 
	*(p_reg_power_down_clear_0) = 0x0001;

	// NFI access control 
	*NFI_ACCCON = nfi_acccon;

	// NFI format (default 8bits, 512 page size) 
	*NFI_PAGEFMT = PAGEFMT_512|PAGEFMT_8BITS;
	
	// setup chip-select 
	return NUTL_NFI_SelectCS(g_pNandInfo, bEnableCS1);
}

//------------------------------------------------------------------------------
// NFI Enable Chip Select 1                                                     
//------------------------------------------------------------------------------
STATUS_E  NUTL_NFI_SelectCS(
					const NAND_DeviceInfo_S  *nand_info
					,bool bEnableCS1
) {
	uint16		gpio_cfg;
	volatile uint16 *p_reg_gpio_mod_ctrl_4;

	p_reg_gpio_mod_ctrl_4 = g_HW_DevCfg.m_hw_bbcfg->m_GPIO->m_reg_gpio_mod_ctrl_4;

	// check if NFI CS1 is supported on this baseband chip 
	if( bEnableCS1 && !(g_HW_DevCfg.m_hw_bbcfg->m_NFI->m_nfi_v2) ) {
		return S_NFI_CS1_NOT_SUPPORT;
	}
	
	// choose NFI chip select 
	if(bEnableCS1) {
		gpio_cfg = g_HW_DevCfg.m_hw_bbcfg->m_GPIO->m_nfi_cs1;
		*NFI_CSEL = 1;
	}
	else {
		gpio_cfg = g_HW_DevCfg.m_hw_bbcfg->m_GPIO->m_nfi_cs0;
		*NFI_CSEL = 0;
	}

	// GPIO configuration
	*(p_reg_gpio_mod_ctrl_4) &= g_HW_DevCfg.m_hw_bbcfg->m_GPIO->m_nfi_mask;
	*(p_reg_gpio_mod_ctrl_4) |= gpio_cfg;

	return S_DONE;
}

//------------------------------------------------------------------------------
// Check Device                                                                 
//------------------------------------------------------------------------------
STATUS_E  NUTL_CheckDevice(NAND_DeviceInfo_S  *nand_info) {

	uint32	shift_bits;
	uint32	page_size;
	uint32	io_interface;
	uint32	i;
	uint16	maker_code, device_code, ext_code_1, ext_code_2;

	// search device table 
	for(i=0; 0!=g_NandFlashDevTbl[i].m_hw_info.m_id.m_maker_code; i++) {

		// H/W device info 
		nand_info->m_dev = &(g_NandFlashDevTbl[i]);

		// reset device 
		CB_NAND_RESET(nand_info, 0x7FFF);

		// check device 
		if( S_DONE == CB_NAND_READ_ID(nand_info, NUTL_DEFAULT_TIMEOUT, &maker_code, &device_code, &ext_code_1, &ext_code_2) ) {
			
			// compare maker code 
			if( maker_code != NUTL_MAKER_CODE(nand_info) ) {
				// no match, skip 
				continue;
			}

			// if maker code exist, temporarily record flash id to g_HW_DetectionResult 
			g_HW_DetectionResult.m_flash_dev_code_1 = maker_code;
			g_HW_DetectionResult.m_flash_dev_code_2 = device_code;
			g_HW_DetectionResult.m_flash_dev_code_3 = ext_code_1;
			g_HW_DetectionResult.m_flash_dev_code_4 = ext_code_2;

			// compare device code 
			if( device_code != NUTL_DEVICE_CODE(nand_info) ) {
				// no match, skip 
				continue;
			}

			// match! initialize rest of data 
	
			page_size = NUTL_PAGE_SIZE(nand_info);
			io_interface = NUTL_IO_INTERFACE(nand_info);

			// check if I/O interface is supported on this baseband chip 
			if( (NAND_IO_16BITS==io_interface) && !(g_HW_DevCfg.m_hw_bbcfg->m_NFI->m_nfi_v2) ) {
				return S_NFI_16BITS_IO_NOT_SUPPORT;
			}

			// setup NFI page format and I/O interface 
			if( 512 < page_size ) {
				if( NAND_IO_16BITS == io_interface ) {
					*NFI_PAGEFMT = PAGEFMT_2K|PAGEFMT_16BITS;
				}
				else {
					*NFI_PAGEFMT = PAGEFMT_2K|PAGEFMT_8BITS;
				}
			}
			else {
				if( NAND_IO_16BITS == io_interface ) {
					*NFI_PAGEFMT = PAGEFMT_512|PAGEFMT_16BITS;
				}
				else {
					*NFI_PAGEFMT = PAGEFMT_512|PAGEFMT_8BITS;
				}
			}

			// m_block_size 
			nand_info->m_block_size = NUTL_PAGES_PER_BLOCK(nand_info)*page_size;
		
			// total block count 
			nand_info->m_total_blocks = NUTL_TOTAL_SIZE(nand_info)/NUTL_BLOCK_SIZE(nand_info);
		
			// total page count 
			nand_info->m_total_pages = NUTL_PAGES_PER_BLOCK(nand_info)*NUTL_TOTAL_BLOCK_COUNT(nand_info);
		
			// spare size 
			nand_info->m_spare_size = page_size/512*16;
		
			// page addr shift bits 
			if( 512 < page_size ) {
				nand_info->m_page_addr_shift_bits = 16;
			}
			else {
				nand_info->m_page_addr_shift_bits = 8;
			}

			// block addr shift bits 
			for(shift_bits=0; 0<(NUTL_PAGES_PER_BLOCK(nand_info)>>(shift_bits+1)); shift_bits++);
			nand_info->m_block_addr_shift_bits = shift_bits+NUTL_PAGE_ADDR_SHIFT_BITS(nand_info);
		
			// pre-process callback 
			if( NULL != FP_CB_NAND_PRE_PROCESS(nand_info) ) {
				CB_NAND_PRE_PROCESS(nand_info, NUTL_DEFAULT_TIMEOUT);
			}

			return S_DONE;
		}
	}

	return S_DEVICE_NOT_FOUND;
}

//------------------------------------------------------------------------------
// Read From NFI FIFO                                                           
//------------------------------------------------------------------------------
STATUS_E  NUTL_FIFO_Read(
				const uint32  c_timeout
				,const bool bUsingDMA
				,uint32 *p_data32 /* MUST be 32bits alignment addr */
				,const uint32 data_len
) {
	uint32	timeout = c_timeout;
	uint32	i;

	if(bUsingDMA) {
		// read page data with DMA 

		// receive page data 
		*(volatile uint32 *)(0x80030118) = 0x0000;
		*(volatile uint32 *)(0x80030100) = (uint32)NFI_DATAR;
		*(volatile uint32 *)(0x80030104) = (uint32)p_data32;
		*(volatile uint32 *)(0x80030110) = data_len>>2;
		*(volatile uint32 *)(0x80030114) = 0x00f4001a;
		*(volatile uint32 *)(0x80030128) = 0;
		*(volatile uint32 *)(0x80030118) = 0x8000;
		// wait for DMA transmission complete 
		timeout = c_timeout;
		NFI_Wait( (0x01 == ((*(volatile uint32 *)(0x80030000))&0x01)), timeout);
		if( 0 == timeout ) {
			return S_TIMEOUT;
		}
	}
	else {
		// read page data 
		for(i=0; i<data_len; i+=4, p_data32++) {
			// wait for data ready 
			// when RD_EMPTY_MASK flag is poll-down, it means data is ready in FIFO at least 4 bytes. 
			timeout = c_timeout;
			NFI_Wait( (*NFI_FIFOCON & RD_EMPTY_MASK), timeout);
			if( 0 == timeout ) {
				return S_TIMEOUT;
			}
			*p_data32 = *NFI_DATAR;
		}
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Write To NFI FIFO                                                            
//------------------------------------------------------------------------------
STATUS_E  NUTL_FIFO_Write(
				const uint32  c_timeout
				,const bool bUsingDMA
				,const uint32 *p_data32 /* MUST be 32bits alignment addr */
				,const uint32 data_len
) {
	uint32	timeout = c_timeout;
	uint32	i;

	if(bUsingDMA) {
		// program page data with DMA 

		// program page data 
		*(volatile uint32 *)(0x80030118) = 0x0000;
		*(volatile uint32 *)(0x80030100) = (uint32)p_data32;
		*(volatile uint32 *)(0x80030104) = (uint32)NFI_DATAW;
		*(volatile uint32 *)(0x80030110) = data_len>>2;
		*(volatile uint32 *)(0x80030114) = 0x00f00016;
		*(volatile uint32 *)(0x80030128) = 0;
		*(volatile uint32 *)(0x80030118) = 0x8000;
		// wait for DMA transmission complete 
		timeout = c_timeout;
		NFI_Wait( (0x01 == ((*(volatile uint32 *)(0x80030000))&0x01)), timeout);
		if( 0 == timeout ) {
			return S_TIMEOUT;
		}
	}
	else {
		// program page data 
		for(i=0; i<data_len; i+=4, p_data32++) {
			// wait for FIFO has space to enqueue 
			// when WR_FULL_MASK flag is poll-down, it means there are at least 4 bytes free space in FIFO. 
			timeout = c_timeout;
			NFI_Wait( (*NFI_FIFOCON & WR_FULL_MASK), timeout);
			if( 0 == timeout ) {
				return S_TIMEOUT;
			}
			*NFI_DATAW = *p_data32;
		} 
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Bad Block Check                                                              
//------------------------------------------------------------------------------
STATUS_E  NUTL_BadBlock_Check(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,const uint32 row_addr
) {
	uint32		i;
	uint32		block_addr;
	uint32		internal_spare[NAND_MAX_SPARE_SIZE_BYTE>>2];
	STATUS_E	ret=S_UNKNOWN_ERR;

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

	// check bad block symbol in 1st and 2nd page of this block 
	for(i=0; i<2; i++) {
		// read spare 
		if( S_DONE != (ret=CB_NAND_SPARE_READ(nand_info, c_timeout, block_addr+i, internal_spare)) ) {
			return ret;
		}
		// check bad block symbol 
		if( S_DONE != (ret=CB_NAND_BAD_BLOCK_SYMBOL_CHECK(nand_info, internal_spare)) ) {
			return ret;
		}
	}

	return S_DONE;
}

//------------------------------------------------------------------------------
// Find Good Block                                                              
//------------------------------------------------------------------------------
STATUS_E  NUTL_FindGoodBlock(
				const NAND_DeviceInfo_S  *nand_info
				,const uint32  c_timeout
				,uint32  *p_row_addr
) {
	uint32		block_addr;
	uint32		last_block_addr;
	STATUS_E	ret=S_UNKNOWN_ERR;

	// calculate the last block addr 
	last_block_addr = (NUTL_TOTAL_SIZE(nand_info)/NUTL_BLOCK_SIZE(nand_info)-1)*NUTL_PAGES_PER_BLOCK(nand_info);

	if( NULL == p_row_addr ) {
		return S_INVALID_BEGIN_ADDR;
	}

	// search block addr 
	block_addr = NUTL_RowAddrToBlockAddr(nand_info, *p_row_addr);
	if( block_addr > last_block_addr ) {
		return S_INVALID_BEGIN_ADDR;
	}

	while( block_addr <= last_block_addr ) {
		ret = NUTL_BadBlock_Check(nand_info, c_timeout, block_addr);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩精品一区视频| 日韩视频在线永久播放| 欧美aaaaa成人免费观看视频| 久久亚洲一区二区三区四区| 欧美又粗又大又爽| 国产成人亚洲综合a∨猫咪| 天堂久久久久va久久久久| 国产精品护士白丝一区av| 日韩精品中文字幕一区二区三区 | 国产成人av电影免费在线观看| 一区二区三区欧美| 中文字幕av一区二区三区| 欧美一区二区视频在线观看2022| 91亚洲永久精品| 国产精品66部| 精品一区二区成人精品| 午夜精品一区二区三区免费视频| 中文字幕一区二区三区精华液| 日韩精品中文字幕在线一区| 91精品在线免费| 在线观看免费成人| 91美女福利视频| 高清不卡在线观看| 国产乱码精品一区二区三区五月婷| 免费视频最近日韩| 日韩精品欧美精品| 午夜国产精品一区| 一区二区三区成人| 伊人性伊人情综合网| 国产精品国产三级国产| 国产精品乱人伦中文| 久久精品视频一区二区三区| 精品国产乱码91久久久久久网站| 欧美一级精品大片| 91精品国产综合久久精品麻豆| 欧美视频在线观看一区| 欧美亚洲国产一区二区三区 | 亚洲国产精品嫩草影院| 亚洲欧美色图小说| 中文字幕在线不卡视频| 国产精品久久久久久久久果冻传媒| 国产精品无人区| 国产精品久久久久久久久动漫| ...xxx性欧美| 一区二区三区 在线观看视频| 亚洲午夜激情网站| 亚洲成人综合视频| 青青草伊人久久| 精品制服美女久久| 国产一区二区0| 成人18视频日本| 91麻豆123| 精品视频一区二区三区免费| 欧美精品一二三四| 欧美不卡一二三| 久久精品人人爽人人爽| 国产精品久久久久久福利一牛影视 | 成人h动漫精品| 色欧美片视频在线观看| 欧洲在线/亚洲| 日韩精品中文字幕在线不卡尤物 | 欧美片网站yy| 精品成人私密视频| 综合久久久久综合| 午夜亚洲福利老司机| 精品一区二区三区免费观看 | 国产在线麻豆精品观看| 国产激情视频一区二区在线观看| 福利电影一区二区| 欧美视频在线不卡| 2022国产精品视频| 亚洲欧美视频在线观看| 日韩高清在线不卡| 从欧美一区二区三区| 日本丶国产丶欧美色综合| 538prom精品视频线放| www成人在线观看| 亚洲黄色av一区| 久久国产免费看| 不卡av电影在线播放| 欧美精品丝袜中出| 国产精品久久久久久久久免费相片 | 亚洲成人免费电影| 国产精品一区免费视频| 欧美日韩在线亚洲一区蜜芽| 亚洲成人午夜电影| 国产精品一品二品| 欧美久久久久免费| 欧美激情一区二区三区不卡| 天天综合网 天天综合色| 成人一级片网址| 欧美一级午夜免费电影| 亚洲视频每日更新| 极品销魂美女一区二区三区| 91国偷自产一区二区开放时间 | 亚洲人123区| 黄页网站大全一区二区| 欧美做爰猛烈大尺度电影无法无天| 欧美大片一区二区| 一区二区三区四区不卡在线| 国产a视频精品免费观看| 日韩一区二区三区在线| 亚洲午夜久久久久久久久电影网| 国产精品亚洲一区二区三区妖精 | 日韩精品一区二区三区swag| 亚洲精品福利视频网站| 国产成人亚洲精品青草天美| 欧美一级专区免费大片| 亚洲午夜精品网| 91小视频在线观看| 国产欧美一区二区在线观看| 日本人妖一区二区| 欧美精品国产精品| 一区二区欧美精品| 97超碰欧美中文字幕| 日本一二三不卡| 国产福利精品一区| 26uuu欧美| 久久国产剧场电影| 日韩欧美一二区| 日本va欧美va精品| 欧美日韩二区三区| 亚洲国产精品自拍| 色婷婷精品久久二区二区蜜臀av| 国产精品色一区二区三区| 国产宾馆实践打屁股91| 337p粉嫩大胆噜噜噜噜噜91av| 日本强好片久久久久久aaa| 在线成人免费观看| 视频一区视频二区在线观看| 欧美日韩三级视频| 午夜欧美一区二区三区在线播放| 欧美视频中文一区二区三区在线观看| 一区二区三区在线免费| 色综合天天狠狠| 亚洲精品日产精品乱码不卡| 91一区二区三区在线播放| 中文字幕欧美一| 一本色道久久综合亚洲精品按摩| 国产精品超碰97尤物18| 色偷偷久久人人79超碰人人澡| 亚洲欧美另类小说视频| 色狠狠桃花综合| 亚洲第一久久影院| 欧美一区二区三区四区五区| 青椒成人免费视频| 欧美不卡123| 丁香婷婷综合激情五月色| 亚洲欧洲综合另类| 欧美三级日韩三级国产三级| 三级在线观看一区二区| 日韩精品一区二区三区老鸭窝| 国产乱码字幕精品高清av| 国产精品久久久久桃色tv| 在线看一区二区| 日韩电影在线一区二区三区| 精品人在线二区三区| 国产大片一区二区| 亚洲欧美激情在线| 在线播放中文一区| 国产伦精品一区二区三区免费迷| 国产欧美一区二区三区在线看蜜臀 | 亚洲激情第一区| 3d动漫精品啪啪1区2区免费| 精品午夜久久福利影院 | 日本一区二区三区国色天香| 成人黄色国产精品网站大全在线免费观看 | 欧美sm美女调教| 夫妻av一区二区| 午夜私人影院久久久久| 久久久www成人免费无遮挡大片| eeuss鲁片一区二区三区在线看 | 国产乱理伦片在线观看夜一区| 国产精品午夜在线观看| 欧美特级限制片免费在线观看| 韩国三级在线一区| 亚洲品质自拍视频网站| 精品三级在线看| 色综合天天在线| 麻豆精品蜜桃视频网站| 国产精品网站在线观看| 91精品国产综合久久福利软件| 国产成人精品亚洲777人妖| 亚洲丰满少妇videoshd| 国产欧美视频在线观看| 欧美日韩国产一区二区三区地区| 国产精品一线二线三线精华| 亚洲国产欧美在线| 久久精品夜夜夜夜久久| 在线播放视频一区| 色综合天天综合色综合av | 日韩视频一区在线观看| av亚洲产国偷v产偷v自拍| 日本免费在线视频不卡一不卡二| 国产精品二三区| 精品国产乱码久久久久久影片| 欧美在线影院一区二区| 成人在线视频首页| 另类小说视频一区二区| 一区二区三区四区不卡在线 |