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

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

?? amd.c

?? EP9315的wince下載程序。download.exe
?? C
?? 第 1 頁 / 共 2 頁
字號:
//****************************************************************************
//
// AMD.c - The amd flash function definition.
//
// Copyright (c) 2006 Cirrus Logic, Inc.
//
//****************************************************************************

#include "ep93xx.h"
#include "flash.h"
#include "amd.h"
#include <string.h>

#define AMD_compatible_MAX 3
static struct sFlashManufactureId sAMD_ManufactureId[AMD_compatible_MAX]={
	{0x0001,"AMD"},
	{0x0004,"Spansion"},
	{0x0020,"ST"}
};
//****************************************************************************
// Name       : AmdFlashQuery
// Description: This routine read the flash manufactureid and deviceid.
// Return     : 0 - succuss.
//              1 - failure.
// Note(s)    :
//****************************************************************************
int AmdFlashQuery(struct FlashInfo *pInfo)
{
    volatile unsigned short *ptr16 = (volatile unsigned short *)pInfo->FlashBase;
    volatile unsigned long *ptr32 = (volatile unsigned long *)pInfo->FlashBase;
	unsigned short usByteWidth = pInfo->ByteWidth;
	int iIdx, iResult;
	int timeout = 500000;
	
	if (usByteWidth == 1){
	    
        unsigned short usWord;	    
	    usWord = *ptr16;
	    
	    // Query 16 bitwidth id.
	    *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_CODE1;
	    *(ptr16 + AMD_SETUP_ADDR2) = AMD_SETUP_CODE2;	    
	    *(ptr16 + AMD_SETUP_ADDR1) = AMD_READ_ID;
        pInfo->ManufactureId = *(ptr16 + AMD_VENDORID_ADDR);
        pInfo->DeviceId[0]   = *(ptr16 + AMD_DEVICEID_ADDR1);  
             	    
	    // Query 16 bitwidth flash.
	    *(ptr16 + AMD_QUERY_ADDR) = AMD_READ_QUERY;
	    pInfo->pQuery->DeviceSize = 1 << (*(ptr16 + 0x27) & 0xFF);
	    pInfo->pQuery->NumEraseBlocks = *(ptr16 + 0x2c) & 0xFFFF;
	    
        for(iIdx = 0; iIdx < pInfo->pQuery->NumEraseBlocks; iIdx++){
            pInfo->pQuery->sBlockInfo[iIdx].blocks = 
                (*(ptr16 + 0x2d + (iIdx<<2)) & 0xFFFF) + 1;
			pInfo->pQuery->sBlockInfo[iIdx].block_size = 
			    (((*(ptr16 + 0x30 + (iIdx<<2)) & 0xFFFF) << 8) + 
			    (*(ptr16 + 0x2f + (iIdx<<2)) & 0xFFFF)) << 8;
		}
        // Put the FLASH into read array mode.
        *ptr16 = AMD_RESET;
        
        // Stall, waiting for flash to return to read mode.
        while ((--timeout != 0) && (usWord != *ptr16));
        iResult = 0;		
	} else if (usByteWidth == 2){
	    
        unsigned long ulWord;	    
	    ulWord = *ptr32;
	    
	    // Query 16 bitwidth id.
	    *(ptr32 + AMD_SETUP_ADDR1) = (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
	    *(ptr32 + AMD_SETUP_ADDR2) = (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;	    
	    *(ptr32 + AMD_SETUP_ADDR1) = (AMD_READ_ID << 16) | AMD_READ_ID;
        pInfo->ManufactureId = (unsigned short) ((*(ptr32 + AMD_VENDORID_ADDR) >> 16)
                                & ((*(ptr32 + AMD_VENDORID_ADDR)) & 0xFFFF));
        pInfo->DeviceId[0]   = (unsigned short) (*(ptr32 + AMD_DEVICEID_ADDR1) );
         
	    // Query 32 bitwidth flash.
	    *(ptr32 + AMD_QUERY_ADDR) = (AMD_READ_QUERY << 16) | AMD_READ_QUERY;
	    pInfo->pQuery->DeviceSize = 2 << (*(ptr32 + 0x27) & 0xFF);
	    pInfo->pQuery->NumEraseBlocks = *(ptr32 + 0x2c) & 0xFFFF;
	    
        for(iIdx = 0; iIdx < pInfo->pQuery->NumEraseBlocks; iIdx++){
            pInfo->pQuery->sBlockInfo[iIdx].blocks = 
                (*(ptr32 + 0x2d + (iIdx<<2)) & 0xFFFF) + 1;
			pInfo->pQuery->sBlockInfo[iIdx].block_size = 
			    (((*(ptr32 + 0x30 + (iIdx<<2)) & 0xFFFF) << 8) + 
			    (*(ptr32 + 0x2f + (iIdx<<2)) & 0xFFFF)) << 8;
		}
        // Put the FLASH into read array mode.
        *ptr32 = (AMD_RESET << 16) | AMD_RESET;
        
        // Stall, waiting for flash to return to read mode.
        while ((--timeout != 0) && (ulWord != *ptr32));
        iResult = 0;	    
	} else{
	    // No such parameter.
        iResult = 1;
    }

    //if(pInfo->ManufactureId == 0x0001) return 0;
    //else return 1;
    for(iIdx=0;iIdx<AMD_compatible_MAX;iIdx++)
    {
    	if(pInfo->ManufactureId == sAMD_ManufactureId[iIdx].manufacture_id) 
    	{
    	    return 0;
    	}
    }
    return 1;    
}

//****************************************************************************
// Name       : AmdFlashEraseSector
// Description: This routine erase the specified sector of amd.
// Arguments  : iOffset - the offset address.
//              len  - the length.
// Return     : 0 - succuss.
//              1 - failure.
// Note(s)    :
//****************************************************************************
int AmdFlashEraseSector(struct FlashInfo *pInfo, int iSector)
{
    volatile unsigned short *ptr16 = (volatile unsigned short *)pInfo->FlashBase;
    volatile unsigned long *ptr32 = (volatile unsigned long *)pInfo->FlashBase;
	unsigned short usByteWidth = pInfo->ByteWidth;
	int iResult = FLASH_ERR_OK;
	int timeout = 50000;

	if (usByteWidth == 1){
	    // Send erase block command - six step sequence
        *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_CODE1;
        *(ptr16 + AMD_SETUP_ADDR2) = AMD_SETUP_CODE2;
        *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_ERASE;
        *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_CODE1;
        *(ptr16 + AMD_SETUP_ADDR2) = AMD_SETUP_CODE2;
        *(ptr16 + (iSector >> 1)) = AMD_BLOCK_ERASE;
        
        // Now poll for the completion of the sector erase timer (50us)
        timeout = 10000000;              // how many retries?
        while (1) {
            if (((*(ptr16 + (iSector >> 1))) & AMD_SECTOR_ERASE_TIMER)
                    == AMD_SECTOR_ERASE_TIMER) break;

            if (--timeout == 0) {
                iResult = FLASH_ERR_DRV_TIMEOUT;
                break;
            }
        }

        // Then wait for erase completion.
        if (FLASH_ERR_OK == iResult) {
            timeout = 10000000;
            while (1) {
                if (0xffff == (*(ptr16 + (iSector >> 1)))) {
                    break;
                }

                // Don't check for FLASH_Err here since it will fail
                // with devices in parallel because these may finish
                // at different times.

                if (--timeout == 0) {
                    iResult = FLASH_ERR_DRV_TIMEOUT;
                    break;
                }
            }
        }

        if (FLASH_ERR_OK != iResult)
            *ptr16 = AMD_RESET;
            
	} else if (usByteWidth == 2){
	    // Send erase block command - six step sequence
        *(ptr32 + AMD_SETUP_ADDR1) = (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
        *(ptr32 + AMD_SETUP_ADDR2) = (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
        *(ptr32 + AMD_SETUP_ADDR1) = (AMD_SETUP_ERASE << 16) | AMD_SETUP_ERASE;
        *(ptr32 + AMD_SETUP_ADDR1) = (AMD_SETUP_CODE1 << 16) | AMD_SETUP_CODE1;
        *(ptr32 + AMD_SETUP_ADDR2) = (AMD_SETUP_CODE2 << 16) | AMD_SETUP_CODE2;
        *(ptr32 + (iSector >> 2)) = (AMD_BLOCK_ERASE << 16) | AMD_BLOCK_ERASE;
        
        // Now poll for the completion of the sector erase timer (50us)
        timeout = 10000000;              // how many retries?
        while (1) {
            if (((*(ptr32 + (iSector >> 2))) & AMD_SECTOR_ERASE_TIMER)
                    == AMD_SECTOR_ERASE_TIMER) break;

            if (--timeout == 0) {
                iResult = FLASH_ERR_DRV_TIMEOUT;
                break;
            }
        }

        // Then wait for erase completion.
        if (FLASH_ERR_OK == iResult) {
            timeout = 10000000;
            while (1) {
                if (0xffffffff == (*(ptr32 + (iSector >> 2)))) {
                    break;
                }

                // Don't check for FLASH_Err here since it will fail
                // with devices in parallel because these may finish
                // at different times.

                if (--timeout == 0) {
                    iResult = FLASH_ERR_DRV_TIMEOUT;
                    break;
                }
            }
        }

        if (FLASH_ERR_OK != iResult)
            *ptr32 = (AMD_RESET << 16) | AMD_RESET;
                
	} else{
	    // No such parameter.
        return 1;
    }
    		
	return iResult;
}


//****************************************************************************
// Name       : GetSectorIndex
// Description: This routine erase the sectors of intel.
// Arguments  : iOffset - the offset address.
//              len  - the length.
// Return     : 0 - succuss.
//              1 - failure.
// Note(s)    :
//****************************************************************************
int Amd_GetSectorIndex(struct FlashInfo *pInfo,long lStartAddress,
			unsigned long * pulSectorBase,int * piCurEraseRegion,
			int * piCurEraseBlock )
{
    unsigned short usByteWidth = pInfo->ByteWidth;
    int i, j;
    long iEraseBase = lStartAddress;
    
    *pulSectorBase = 0;
    
    if (usByteWidth == 1)
    {
        for(i = 0; i < pInfo->pQuery->NumEraseBlocks; i++) 
        {     
            for(j = 0; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) 
            {
		
		
                
                if(iEraseBase >= pInfo->pQuery->sBlockInfo[i].block_size) 
                {
                    *pulSectorBase = *pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size;
                    iEraseBase = iEraseBase - pInfo->pQuery->sBlockInfo[i].block_size;
                } 
                else 
                {
                    *piCurEraseRegion = i;
                    *piCurEraseBlock  = j;  
                    return 0;
                }

            }
        }
    }
    else if (usByteWidth == 2)
    {
        for(i = 0; i < pInfo->pQuery->NumEraseBlocks; i++) 
        {     
            for(j = 0; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) 
            {
                
                if(iEraseBase >= pInfo->pQuery->sBlockInfo[i].block_size*2) 
                {
                    *pulSectorBase = *pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size*2;
                    iEraseBase = iEraseBase - pInfo->pQuery->sBlockInfo[i].block_size*2;
                } 
                else 
                {
                    *piCurEraseRegion = i;
                    *piCurEraseBlock  = j;  
                    return 0;
                }

            }
        }    	
    } 
    else
    {
        // No such parameter.
        return 1;
    }

    return 1;        

}
//****************************************************************************
// Name       : AmdFlashErase
// Description: This routine erase the amd flash.
// Arguments  : iOffset - the offset address.
//              len  - the length.
// Return     : 0 - succuss.
//              1 - failure.
// Note(s)    :
//****************************************************************************
int AmdFlashErase(struct FlashInfo *pInfo, int iOffset, int len)
{
    volatile unsigned short *ptr16 = (volatile unsigned short *)pInfo->FlashBase;
    volatile unsigned long *ptr32 = (volatile unsigned long *)pInfo->FlashBase;	
    unsigned short usByteWidth = pInfo->ByteWidth;
    long i, j,iIdx;
    //long iEraseLen = len;
    //long iEraseBase = iOffset;
    unsigned long pulSectorBase=0,pulSectorEnd=0;
    int piCurEraseRegionStart=0,piCurEraseBlockStart=0,piCurEraseRegionEnd=0,piCurEraseBlockEnd=0;
    
    if(Amd_GetSectorIndex(pInfo,iOffset,&pulSectorBase,
    			&piCurEraseRegionStart, &piCurEraseBlockStart)==1)
	return 1;    
	
    if(Amd_GetSectorIndex(pInfo,iOffset+len,&pulSectorEnd,
    			&piCurEraseRegionEnd, &piCurEraseBlockEnd)==1)
	return 1; 
	
	
    if (usByteWidth == 1)
    {
	if(piCurEraseRegionStart!=piCurEraseRegionEnd)
	{
 	
        for(i = piCurEraseRegionStart; i <= piCurEraseRegionEnd; i++) 
        {             
             if(i==piCurEraseRegionStart)
             {
             	for(j = piCurEraseBlockStart; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) 
                {
		
 		    AmdFlashEraseSector(pInfo,pulSectorBase);
                
                    //
                    //#if 1
		    for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[i].block_size>>1); iIdx++)
             	    {
            	        if(*(ptr16 + (pulSectorBase >> 1) + iIdx) != 0xffff)
            	        {
              	    	    return 1;
            	        }
 
   	    	    }
   	    	    //#endif
   	    	     		
 		    pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size;

                }
             }
             else if(i==piCurEraseRegionEnd)
             {
              	for(j = 0; j<= piCurEraseBlockEnd; j++) 
                {
		
 		    AmdFlashEraseSector(pInfo,pulSectorBase);
                
                    //
                    //#if 1
		    for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[i].block_size>>1); iIdx++)
             	    {
            	        if(*(ptr16 + (pulSectorBase >> 1) + iIdx) != 0xffff)
            	        {
              	    	    return 1;
            	        }
 
   	    	    }
   	    	    //#endif
   	    	     		
 		    pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size;

                }            	
             }
             else
             {
             	for(j = 0; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) 
                {
		
 		    AmdFlashEraseSector(pInfo,pulSectorBase);
                
                    //
                    //#if 1
		    for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[i].block_size>>1); iIdx++)
             	    {
            	        if(*(ptr16 + (pulSectorBase >> 1) + iIdx) != 0xffff)
            	        {
              	    	    return 1;
            	        }
 
   	    	    }
   	    	    //#endif
   	    	     		
 		    pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size;

                }             
             }
            }
        }
        else
        {
      	    for(j = piCurEraseBlockStart; j<= piCurEraseBlockEnd; j++) 
            {
	
	        AmdFlashEraseSector(pInfo,pulSectorBase);
        
                //
                //#if 1
	        for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[piCurEraseRegionStart].block_size>>1); iIdx++)
     	        {
    	            if(*(ptr16 + (pulSectorBase >> 1) + iIdx) != 0xffff)
    	            {
      	    	        return 1;
    	            }

    	        }
    	        //#endif
    	     		
	        pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[piCurEraseRegionStart].block_size;

            }         	
        	
        }
        
        return 0; 
    }   
    //
    //32 bit
    //
    else if (usByteWidth == 2)
    {
	if(piCurEraseRegionStart!=piCurEraseRegionEnd)
	{
 	
            for(i = piCurEraseRegionStart; i <= piCurEraseRegionEnd; i++) 
            {             
                 if(i==piCurEraseRegionStart)
                 {
             	    for(j = piCurEraseBlockStart; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) 
                    {
		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
懂色一区二区三区免费观看| 亚洲大片精品永久免费| 在线看国产日韩| 国产麻豆成人精品| 日韩经典中文字幕一区| 亚洲成人动漫在线观看| 国产精品自拍三区| av中文字幕不卡| 春色校园综合激情亚洲| 成人理论电影网| 日韩亚洲欧美在线观看| 91精品国产综合久久小美女| 3d动漫精品啪啪一区二区竹菊 | 国产尤物一区二区| 欧美日韩国产一二三| 3d成人h动漫网站入口| 亚洲人成网站色在线观看| 中文字幕制服丝袜一区二区三区 | 自拍视频在线观看一区二区| 亚洲人成人一区二区在线观看| 国产最新精品精品你懂的| 国产二区国产一区在线观看| 91视频xxxx| 日韩午夜在线播放| 日韩精品一区第一页| 欧美日韩国产免费一区二区| 一区二区三区资源| 日韩专区一卡二卡| 欧美日韩亚洲高清一区二区| 欧美一区二区三区在线| 国产日产欧美一区二区三区| 国产精品乱人伦| 视频一区二区三区入口| 欧美视频在线一区| 中文字幕乱码久久午夜不卡| 一区二区三区成人在线视频| 色综合久久88色综合天天6| 欧美浪妇xxxx高跟鞋交| 国产精品美女久久久久久久| 国产成人精品午夜视频免费| 欧美激情自拍偷拍| 成人黄色a**站在线观看| 欧美日韩一级二级三级| 亚洲午夜一二三区视频| 成人网男人的天堂| 中文字幕永久在线不卡| 调教+趴+乳夹+国产+精品| 成人小视频在线| 国产免费成人在线视频| aaa国产一区| 一区二区在线观看不卡| 高清在线成人网| 中文字幕一区二区三| 色偷偷久久一区二区三区| 亚洲高清一区二区三区| 精品国产免费一区二区三区香蕉| 亚洲视频网在线直播| 91国偷自产一区二区开放时间| 成人免费一区二区三区在线观看 | 日本韩国欧美三级| 天天免费综合色| 久久久影视传媒| 日本人妖一区二区| 欧美自拍偷拍一区| 免费观看在线综合色| 欧美男女性生活在线直播观看| 另类人妖一区二区av| 欧美精品电影在线播放| 国产一区二区三区免费看| 亚洲日穴在线视频| 日韩一区国产二区欧美三区| 成人激情动漫在线观看| 午夜精品一区二区三区三上悠亚 | 欧美大度的电影原声| 亚洲第一精品在线| 国产喂奶挤奶一区二区三区| 成人综合在线网站| 天天综合天天综合色| 中文字幕乱码一区二区免费| 日韩一区二区三区在线| 92精品国产成人观看免费 | 99精品黄色片免费大全| 日韩不卡免费视频| 亚洲天堂免费看| 久久视频一区二区| 国产在线精品一区二区不卡了 | 黄色资源网久久资源365| 专区另类欧美日韩| 久久久久亚洲蜜桃| 欧美日韩一区二区三区在线| 成人激情电影免费在线观看| 久久精品99国产精品日本| 亚洲国产精品久久久久婷婷884 | 国产精一品亚洲二区在线视频| 伊人婷婷欧美激情| 国产精品电影一区二区| 精品国产一区二区三区不卡| 欧美亚洲一区三区| aaa欧美日韩| 丁香网亚洲国际| 久热成人在线视频| 天天爽夜夜爽夜夜爽精品视频| 国产精品久久看| 国产亚洲综合性久久久影院| 欧美成人vps| 99精品黄色片免费大全| 国产成人久久精品77777最新版本| 美女视频黄 久久| 中文字幕在线不卡国产视频| 国产欧美视频一区二区| 久久综合给合久久狠狠狠97色69| 欧美日本一区二区| 欧美综合一区二区| 欧美日韩高清一区二区三区| 色悠悠久久综合| 欧美日韩在线播放一区| 在线视频国内自拍亚洲视频| 欧美中文字幕一二三区视频| 欧洲中文字幕精品| 欧美在线观看一区二区| 欧美日韩一区成人| 欧美一区二视频| 欧美成人video| 国产亚洲成av人在线观看导航| 久久九九99视频| 欧美国产日本视频| 自拍av一区二区三区| 一区二区三区国产精品| 亚洲超碰精品一区二区| 日本欧美在线观看| 韩国一区二区在线观看| 国产精品1区2区3区| 成人黄页毛片网站| 欧美中文一区二区三区| 欧美大片在线观看一区| 亚洲国产精品精华液ab| 亚洲免费观看视频| 日韩vs国产vs欧美| 成人自拍视频在线| 在线精品亚洲一区二区不卡| 欧美日本在线视频| 国产日韩欧美精品在线| 亚洲精品亚洲人成人网 | 欧美日韩国产系列| 久久一区二区三区国产精品| 亚洲人亚洲人成电影网站色| 亚洲国产中文字幕在线视频综合| 奇米一区二区三区| 波多野结衣亚洲一区| 欧美片网站yy| 国产蜜臀97一区二区三区| 一区二区久久久| 久久精品久久综合| 91网上在线视频| 日韩欧美中文字幕精品| 国产女人18毛片水真多成人如厕 | 免费高清不卡av| 成人av在线资源网站| 欧美一区二区三区婷婷月色| 亚洲欧洲精品成人久久奇米网| 五月天婷婷综合| 丁香六月综合激情| 日韩一区二区三区四区五区六区| 1区2区3区国产精品| 精品亚洲aⅴ乱码一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 国产成人av网站| 欧美大白屁股肥臀xxxxxx| 亚洲女同一区二区| 福利一区二区在线| 精品免费日韩av| 日本vs亚洲vs韩国一区三区| 色综合色狠狠综合色| 国产人妖乱国产精品人妖| 日产国产高清一区二区三区| 91国产丝袜在线播放| 中文字幕一区二区在线观看| 国内精品嫩模私拍在线| 91麻豆精品久久久久蜜臀| 伊人一区二区三区| 99精品国产91久久久久久| 国产午夜久久久久| 九九热在线视频观看这里只有精品| 色天使色偷偷av一区二区| 国产精品福利在线播放| 免费成人av在线| 777精品伊人久久久久大香线蕉| 亚洲欧美偷拍三级| 成人美女视频在线观看18| 久久久99精品免费观看不卡| 国产一本一道久久香蕉| 欧美电影精品一区二区| 午夜欧美视频在线观看| 欧美私模裸体表演在线观看| 亚洲人成亚洲人成在线观看图片| 99久久久久久| 亚洲视频在线一区| 99麻豆久久久国产精品免费| 国产精品女主播av| 成人h动漫精品一区二|