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

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

?? flash_drv_renesas.c

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

/*******************************************************************************
 *
 * Filename:
 * ---------
 *	  flash_drv_RENESAS.c
 *
 * Project:
 * --------
 *    FlashTool Download Agent 
 *
 * Description:
 * ------------
 *    This Module defines the RENESAS flash driver. 
 *
 * Author:
 * -------
 *	  Amos Hsu
 *
 *==============================================================================
 * 				HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
 *------------------------------------------------------------------------------
 * $Revision:   1.4  $ 
 * $Modtime:   Jun 15 2005 12:07:56  $
 * $Log:   //mtkvs01/vmdata/flash_tool/archives/DA/SRC/flash_drv_RENESAS.c-arc  $
 * 
 *    Rev 1.4   Jun 15 2005 12:23:06   mtk00539
 *  1. [DA][New] Support new flash devices TV0057A002AABD and TV0057A002AABD.
 *  2. [DA][New] Support RENESAS flash with F-WP#(LOW).
 * Resolution for 118: [BROM_DLL v2.4.1013][New] Support RENESAS flash with F-WP#(LOW).
 * 
 *    Rev 1.3   Nov 30 2004 17:20:04   mtk00539
 * [FIX BUG] DON'T use fixed 128 WORDs Page-Program method. 
 * Because when length_in_word is less than 128, Page-Program will fail! 
 * Therefore, we have to use another program method.  
 * First, load variant length data to Page-Buffer, then flush Page-Buffer to flash.                                         
 * Resolution for 99: [BROM_DLL v2.4.1008][New] Support INTEL family flash Buffered-Program method.
 * 
 *    Rev 1.2   Nov 22 2004 12:25:36   mtk00539
 *  1. [DA][BUG FIX] Add data verification in status polling during erase or program operation.
 *  2. [DA][BUG FIX] Fix two dies flash detection fail in INTEL_CheckDevID(). 
 *  3. [DA][Change Behavior] When RX_BUFFER_FULL occurs, flush data queued in UART ring buffer til data is less than 512KB.
 *  4. [DA][New] Support Buffered-Program method for INTEL family flashes.
 *  5. [DA][New] Support new flashes [SHARP]LRS1828C and [RENESAS]M6MGB64BM34CDG.
 * Resolution for 99: [BROM_DLL v2.4.1008][New] Support INTEL family flash Buffered-Program method.
 * 
 *    Rev 1.1   Oct 29 2004 11:46:46   mtk00539
 *  1. [DA][BUG FIX] Read CFI boot sector flag to determine AM49DL3208GT and S71PL032J, since both flashes have the same id, but different layout.
 *  2. [DA][BUG FIX] Fix INTEL and RENESAS status checking flow.
 *  3. [DA][Enhance] Dump more logs in TEST_ExtSRAM().
 *  4. [DA][New] Support new flashes
 * 				[SAMSUNG] K5J6316CTM
 * 				[TOSHIBA] TH50VPF5682CDSB
 * 				[TOSHIBA] TH50VPF5683CDSB
 * 				[ISSI] IS75V16F128GS32
 * 				[RENESAS] M6MGT64BM34CDG
 * 				[ST] M30L0T7000T0, M36L0T7050T0
 * 				[ST] M30L0T7000B0, M36L0T7050B0
 * 				[SHARP] LRS1862
 * 				[SHARP] LRS1806A
 * 				[AMD] AM49DL3208GT
 * 				[SPANSION] S29PL032J, S71PL032J
 * Resolution for 92: [BROM_DLL v2.4.1006][BUG FIX] Fix AM49DL3208GT & S71PL032J download fail problem and some enhancement.
 * 
 *    Rev 1.0   Aug 03 2004 10:39:54   mtk00539
 * Initial revision.
 * 
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
 *==============================================================================
 *******************************************************************************/
#include "flash_drv_RENESAS.h"

//------------------------------------------------------------------------------
// Callback Function Set                                                        
//------------------------------------------------------------------------------
const NOR_CMD_Callback_S	RENESAS_CMD_CB_WORD_PGM = {
	INTEL_CheckDevID,
	DUMMY_CheckDevIdle,
	RENESAS_Erase_Block_CMD,
	RENESAS_CheckDone,
	DUMMY_Program_PreProcess,
	DUMMY_Program_PostProcess,
	DUMMY_Program_Enter,
	DUMMY_Program_Exit,
	RENESAS_Word_Program,
	RENESAS_CheckDone,
	NULL,
	NULL
};

const NOR_CMD_Callback_S	RENESAS_CMD_CB_128WORD_PAGE_PGM = {
	INTEL_CheckDevID,
	DUMMY_CheckDevIdle,
	RENESAS_Erase_Block_CMD,
	RENESAS_CheckDone,
	RENESAS_PreProcess_128WORD_BUFPGM,
	DUMMY_Program_PostProcess,
	DUMMY_Program_Enter,
	DUMMY_Program_Exit,
	RENESAS_Word_Program,
	RENESAS_CheckDone,
	RENESAS_FixedPage_Program,
	RENESAS_CheckDone
};

//------------------------------------------------------------------------------
// Memory Sector Layout Set                                                     
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Check Device ID Callback Function                                            
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Check If Device Is Idle Callback Function                                    
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Erase Related Callback Function                                              
//------------------------------------------------------------------------------
void RENESAS_Erase_Block_CMD(const uint32 blockaddr)
{
	volatile uint16 *ba = (volatile uint16 *)blockaddr;
	
	// clear status register first 
	ba[0x0] = INTEL_CMD_CLR_SR;

	// sw lock release preprocess 
	RENESAS_SoftwareLockRelease_Preprocess(blockaddr);

	// no need to unlock, just erase 
	ba[0x0] = INTEL_CMD_ERASE_STEP1;
	ba[0x0] = INTEL_CMD_ERASE_STEP2;
}

STATUS_E RENESAS_CheckDone(const uint32 blockaddr)
{
	volatile uint16 *ba = (volatile uint16 *)blockaddr;
	volatile uint16 sr;

	// read SR 
	ba[0x0] = INTEL_CMD_READ_SR;
	sr = *ba;

	if( !(sr&RENESAS_SR7_DWS_BIT) ) {
		return S_IN_PROGRESS;
	}
	else if( (sr&RENESAS_SR4_PS_BIT) && (sr&RENESAS_SR5_ES_BIT) ) {
		return S_CMD_ERR;
	}
	else if(sr&RENESAS_SR5_ES_BIT) {
		return S_ERASE_FAILED;
	}
	else if(sr&RENESAS_SR4_PS_BIT) {
		return S_PGM_FAILED;
	}
	else if(sr&RENESAS_SR3_BSAE_BIT) {
		return S_BLOCK_UNSTABLE;
	}

	// rest to read mode 
	ba[0x0] = INTEL_CMD_READ_ARRAY;
	return S_DONE;
}

//------------------------------------------------------------------------------
// Program Related Callback Function                                            
//------------------------------------------------------------------------------
void RENESAS_PreProcess_128WORD_BUFPGM(const uint16 dev) {
	// set max buffered program size 
	g_FLASH_MAX_BUFPGM_SIZE_IN_BYTE = 256; // 128 WORDs 
}

void RENESAS_Word_Program(const uint32 blockaddr, const uint32 prog_addr, const uint16 data)
{
	volatile uint16 *pa = (volatile uint16 *)prog_addr;
	
	// clear status register first 
	*pa = INTEL_CMD_CLR_SR;

	// sw lock release preprocess 
	RENESAS_SoftwareLockRelease_Preprocess(blockaddr);

	// word program 
	*pa = INTEL_CMD_WORD_PGM;
	*pa = data;
}

void RENESAS_FixedPage_Program(const uint32 blockaddr, const uint32 prog_addr, const uint16 *data, const uint32 length_in_word)
{
	//                                                                                
	// Be careful!! Before you invoke this function, please follow the rules          
	//                                                                                
	// 1. A reasonable length_in_word and make sure the program data won't exceed the 
	//    sector boundary.                                                            
	// 2. length_in_word MUST be equal to 128 WORDs.                                  
	//                                                                                
	volatile uint16 *pa = (volatile uint16 *)prog_addr;
	uint32		i;

	// clear status register first 
	*pa = INTEL_CMD_CLR_SR;

	// sw lock release preprocess 
	RENESAS_SoftwareLockRelease_Preprocess(blockaddr);

	// enter page programming 
	*pa = RENESAS_CMD_PAGE_PGM;
		
	for(i=0; i<length_in_word; i++) {
		// fill data to device buffer 
		pa[i] = data[i];
	}
}

#if 0
void RENESAS_DynamicBuf_Program(const uint32 blockaddr, const uint32 prog_addr, const uint16 *data, const uint32 length_in_word)
{
	//                                                                                     
	// Be careful!! Before you invoke this function, you must calculate a reasonable       
	// length_in_word and make sure the program data won't exceed the sector boundary.     
	//                                                                                     
	volatile uint16 *pa = (volatile uint16 *)prog_addr;
	uint32		i;

	// clear status register first 
	*pa = INTEL_CMD_CLR_SR;

	//                                                               
	// WARNING!!! DON'T use fixed 128 WORDs Page-Program method when 
	// length_in_word is not equal to 128 WORDS.                     
	//                                                               
	// Because when length_in_word is less than 128, Page-Program    
	// will fail! Therefore, we have to use another program method.  
	// First, load variant length data to Page-Buffer, then flush    
	// Page-Buffer to flash.                                         
	//                                                               

	// load data to Page-Buffer 
	for(i=0; i<length_in_word; i++) {
		// sw lock release preprocess 
		RENESAS_SoftwareLockRelease_Preprocess(blockaddr);
		// fill data to Page-Buffer 
		*pa = RENESAS_CMD_DATA_LOAD_TO_PAGE_BUF;
		pa[i] = data[i];
	}

	// sw lock release preprocess 
	RENESAS_SoftwareLockRelease_Preprocess(blockaddr);
	// flush Page-Buffer to flash 
	*pa = RENESAS_CMD_PAGE_BUF_TO_FLASH;
	*pa = RENESAS_CMD_PAGE_BUF_TO_FLASH_CNF;
}
#endif

//------------------------------------------------------------------------------
// Protection Related Callback Function                                         
//------------------------------------------------------------------------------

void RENESAS_SoftwareLockRelease_Preprocess(const uint32 blockaddr)
{
	volatile uint16 *ba = (volatile uint16 *)blockaddr;
	uint16	block_num;

	//                     DQ7  DQ6  DQ5  DQ4  DQ3  DQ2  DQ1  DQ0        
	// ----------------------------------------------------------------- 
	//         Block Addr: A22  A21  A20  A19  A18  A17  A16  A15        
	// Block Addr Inverse: A22# A21# A20# A19# A18# A17# A16# A15#       
	//                                                                   
	// STEP 1: Right shift 1 bit to convert BYTE address to WORD address 
	// STEP 2: Right shift 15 bit to convert to block address            
	block_num = (blockaddr>>(1+15));

	ba[0x0] = RENESAS_CMD_SWLOCK_RELEASE_CMD_1;
	ba[0x0] = block_num;	// block address 
	ba[0x0] = RENESAS_CMD_SWLOCK_RELEASE_CMD_2;
	ba[0x0] = ~block_num;	// block address inverse 
	ba[0x0] = RENESAS_CMD_SWLOCK_RELEASE_CMD_3;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性猛交xxxx黑人交| 国产在线麻豆精品观看| 91丨porny丨在线| 中国色在线观看另类| 丰满岳乱妇一区二区三区| 国产偷国产偷精品高清尤物| 国产一区二区三区免费在线观看| 26uuu国产在线精品一区二区| 精彩视频一区二区| 国产欧美日韩视频一区二区| 91在线观看下载| 亚洲综合在线观看视频| 欧美日韩成人一区| 蜜桃av噜噜一区| 国产午夜精品一区二区三区四区| 成人av网站大全| 亚洲自拍与偷拍| 宅男噜噜噜66一区二区66| 国产专区综合网| 亚洲精品视频免费观看| 欧美亚一区二区| 美女任你摸久久| 国产精品免费aⅴ片在线观看| 日本道精品一区二区三区| 午夜精品久久久久久久久久| 精品国产自在久精品国产| 福利91精品一区二区三区| 亚洲国产一区二区视频| 久久久久久久网| 91片在线免费观看| 美女视频网站久久| 亚洲欧美激情小说另类| 日韩色视频在线观看| av一本久道久久综合久久鬼色| 亚洲一区二区在线免费看| 欧美精品一区二区三区很污很色的 | 欧洲视频一区二区| 日韩av一二三| 中文字幕一区二区三区四区不卡| 欧美一级久久久| 91猫先生在线| 国产一区二区剧情av在线| 一区二区三区在线看| 国产日韩一级二级三级| 91精品国产综合久久久久久| 99国产精品久久久| 激情综合色播五月| 亚洲成a人v欧美综合天堂下载| 国产日本欧洲亚洲| 91精品国产色综合久久不卡电影| av在线不卡观看免费观看| 久久国产尿小便嘘嘘尿| 亚洲图片自拍偷拍| 国产精品国产三级国产普通话99| 欧美电影免费观看高清完整版在线观看| 91在线精品秘密一区二区| 国产精品一区二区果冻传媒| 日韩电影一区二区三区| 亚洲午夜久久久久中文字幕久| 久久久精品国产免大香伊| 欧美一卡在线观看| 欧美熟乱第一页| 色呦呦网站一区| 成人av资源站| 波多野结衣一区二区三区| 国产麻豆精品视频| 精品影视av免费| 麻豆精品在线播放| 日本女优在线视频一区二区| 亚洲亚洲人成综合网络| 亚洲摸摸操操av| 国产精品福利影院| 国产精品网站在线播放| 国产日韩欧美精品电影三级在线| 久久只精品国产| 2017欧美狠狠色| 久久综合九色综合欧美98| 日韩三级视频在线看| 日韩视频一区二区三区| 日韩欧美成人一区| 欧美成人三级在线| 精品国产91九色蝌蚪| 久久日韩粉嫩一区二区三区| 久久女同性恋中文字幕| 国产亚洲精品福利| 中文字幕欧美国产| 国产精品乱码久久久久久| 欧美国产日韩亚洲一区| 亚洲视频1区2区| 夜夜嗨av一区二区三区四季av| 亚洲综合一区二区三区| 婷婷一区二区三区| 美女视频免费一区| 国产电影一区在线| 99久精品国产| 欧美性欧美巨大黑白大战| 7777精品伊人久久久大香线蕉经典版下载| 欧美日韩一区二区在线观看视频| 欧美女孩性生活视频| 9191国产精品| 亚洲精品一区二区三区香蕉| 国产欧美精品在线观看| 亚洲丝袜制服诱惑| 亚洲成人自拍一区| 久久精品国产99久久6| 粉嫩av一区二区三区在线播放| av激情综合网| 欧美日韩午夜精品| 精品国产免费视频| 亚洲人快播电影网| 日韩二区三区四区| 国产99久久久国产精品免费看| av在线不卡网| 欧美一区二区国产| 国产精品国产三级国产有无不卡 | 亚洲国产成人高清精品| 久久精品国产一区二区三区免费看| 国内精品免费**视频| 91原创在线视频| 欧美高清性hdvideosex| 国产欧美日韩在线| 五月天中文字幕一区二区| 国产在线精品一区二区不卡了| 91在线视频在线| 精品国产一区久久| 亚洲国产欧美在线| 成人18视频日本| 91精品国产欧美一区二区18| 国产精品久久久久久久岛一牛影视| 亚洲成人动漫精品| 成人av电影在线观看| 日韩一二三区视频| 一区二区三区蜜桃网| 国产精品18久久久久久久久| 欧美日韩一区二区三区四区| 国产日本一区二区| 捆绑调教美女网站视频一区| 在线亚洲人成电影网站色www| 欧美精品一区二区三区很污很色的 | av一区二区三区四区| 欧美成人r级一区二区三区| 亚洲精品日韩一| 国产成人av在线影院| 欧美电影一区二区三区| 亚洲综合999| 99久久精品免费看| 国产婷婷色一区二区三区在线| 日韩精品亚洲专区| 91福利视频久久久久| 亚洲色欲色欲www在线观看| 国产成人免费视频网站| 日韩欧美国产小视频| 日本特黄久久久高潮| 欧美三级午夜理伦三级中视频| 中文字幕亚洲在| 国产精品一区二区91| 精品国产乱码久久久久久久| 视频在线观看国产精品| 欧美三级日韩三级国产三级| 亚洲免费大片在线观看| 99久久久久免费精品国产| 欧美激情一区不卡| 国产成人av电影免费在线观看| 欧美电视剧免费全集观看| 日本不卡高清视频| 欧美一级午夜免费电影| 日韩综合小视频| 欧美精品v国产精品v日韩精品| 亚洲国产成人va在线观看天堂 | 在线精品视频小说1| 亚洲伦在线观看| 91视频.com| 亚洲免费视频中文字幕| 在线亚洲人成电影网站色www| 亚洲免费资源在线播放| 在线观看一区二区视频| 亚洲无人区一区| 91麻豆精品国产| 九九视频精品免费| 26uuu另类欧美亚洲曰本| 国产v日产∨综合v精品视频| 中文字幕成人网| 不卡的av电影在线观看| 最近中文字幕一区二区三区| 91丨porny丨在线| 午夜久久久久久久久| 欧美一区二区三区免费在线看| 另类小说视频一区二区| 久久久久久久久97黄色工厂| 国产福利电影一区二区三区| 综合久久综合久久| 欧美性色aⅴ视频一区日韩精品| 丝袜美腿亚洲综合| 精品日韩成人av| 成人高清免费观看| 亚洲高清不卡在线观看| 日韩欧美的一区| 成人app网站| 午夜精品福利在线| 亚洲精品在线免费观看视频|