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

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

?? amd.c

?? 嵌入式系統 EP93xx處理器
?? 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 3static 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一区二区三区免费野_久草精品视频
国产欧美一区在线| 亚洲在线视频网站| 亚洲已满18点击进入久久| 日韩精品1区2区3区| av一本久道久久综合久久鬼色| 欧美日韩精品欧美日韩精品 | 丝瓜av网站精品一区二区| 99精品偷自拍| 欧美色图片你懂的| 国产亚洲一二三区| 蜜桃视频第一区免费观看| 99精品欧美一区二区三区小说| 日韩西西人体444www| 天堂午夜影视日韩欧美一区二区| 成人精品国产福利| 国产无人区一区二区三区| 麻豆传媒一区二区三区| 欧美日韩视频专区在线播放| 亚洲免费看黄网站| 99精品视频中文字幕| 国产欧美视频一区二区| 国产一区二区调教| 精品成人免费观看| 激情丁香综合五月| 精品福利一区二区三区免费视频| 日韩精品国产精品| 日韩欧美国产一区二区在线播放 | 国产成人精品亚洲777人妖| 日韩一区二区麻豆国产| 天堂va蜜桃一区二区三区漫画版 | 成人av动漫在线| 国产精品三级电影| voyeur盗摄精品| 亚洲色欲色欲www| 99久久99久久免费精品蜜臀| 国产精品色呦呦| 波多野结衣视频一区| 国产精品女上位| 91福利精品第一导航| 国产传媒欧美日韩成人| 日韩女优视频免费观看| 国产一区二区美女诱惑| 久久精品免费在线观看| 成人精品高清在线| 亚洲精品你懂的| 在线91免费看| 精品伊人久久久久7777人| 日韩精品一区在线| 国产精品一级在线| 中文字幕一区二区在线播放 | 国产精品久久久久三级| 国产精品伦理在线| 一本大道av一区二区在线播放| 亚洲免费在线电影| 欧美日本免费一区二区三区| 日韩电影在线免费看| 精品国产一区二区三区不卡| 高清不卡一区二区在线| 一区二区三区在线视频观看| 欧美日本国产一区| 国产一区在线不卡| 亚洲午夜精品17c| 久久久不卡网国产精品一区| www.性欧美| 日韩精品三区四区| 欧美国产一区在线| 欧美日韩国产另类一区| 国产在线不卡一区| 亚洲综合色网站| 精品蜜桃在线看| 91免费版在线看| 久久精品噜噜噜成人88aⅴ| 国产精品对白交换视频| 欧美日韩亚洲国产综合| 国产麻豆视频精品| 五月天激情小说综合| 国产欧美日韩麻豆91| 欧美精品 日韩| av一区二区三区四区| 激情久久久久久久久久久久久久久久| 国产精品久久久久久久久搜平片| 欧美一区二区在线观看| 色综合久久综合网| 成人免费视频视频在线观看免费 | 国产精品看片你懂得 | 在线视频国产一区| 韩国三级电影一区二区| 亚洲高清视频中文字幕| 国产精品女人毛片| 久久久久成人黄色影片| 欧美高清视频www夜色资源网| 国产成人精品午夜视频免费| 天堂久久久久va久久久久| √…a在线天堂一区| 日韩欧美在线不卡| 欧美精品色综合| 欧美伊人久久久久久久久影院 | 激情综合色综合久久综合| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品二区一区二区aⅴ污介绍| 日韩欧美久久久| 欧美美女激情18p| 欧美三区在线观看| 在线视频国产一区| 欧美视频在线观看一区二区| 91香蕉视频mp4| av网站免费线看精品| 成人福利电影精品一区二区在线观看 | 97久久超碰国产精品电影| 国内一区二区在线| 国产一区二区h| 国产一区二区三区精品欧美日韩一区二区三区| 一区二区国产视频| 亚洲精品欧美激情| 亚洲一区二区三区四区的| 一区二区免费看| 午夜精品久久久久影视| 婷婷综合久久一区二区三区| 亚洲福利一二三区| 天堂成人国产精品一区| 蜜臀久久99精品久久久久久9| 日本美女一区二区三区视频| 日韩一区欧美二区| 热久久免费视频| 久久爱www久久做| 国产91丝袜在线18| av成人动漫在线观看| 色94色欧美sute亚洲13| 欧美日本一区二区| 精品国产伦理网| 欧美—级在线免费片| 综合久久综合久久| 天天综合天天做天天综合| 久久国产乱子精品免费女| 国产suv精品一区二区6| 91美女蜜桃在线| 欧美伦理视频网站| 精品处破学生在线二十三| 2024国产精品| 国产精品免费网站在线观看| 一级做a爱片久久| 蜜臀久久99精品久久久久久9 | 午夜精品久久久久| 国产精品自拍在线| 91视频一区二区| 日韩一区二区三区在线| 国产欧美日韩另类一区| 亚洲国产日韩a在线播放性色| 无码av免费一区二区三区试看| 国产一区在线观看视频| 92国产精品观看| 91精品国产高清一区二区三区| 欧美激情资源网| 亚洲成人av一区二区三区| 五月天精品一区二区三区| 日本美女一区二区三区视频| 免费成人结看片| 麻豆免费看一区二区三区| 最新欧美精品一区二区三区| 午夜精品久久久久久久蜜桃app| 欧美一区永久视频免费观看| 国产三级久久久| 欧美一区二区三区免费大片| 欧美精选一区二区| 国产日韩欧美一区二区三区综合| 亚洲欧美综合色| 久久精品国内一区二区三区| 色婷婷精品大在线视频 | 国产精品美女视频| 日本欧美大码aⅴ在线播放| 91亚洲午夜精品久久久久久| 欧美成人欧美edvon| 亚洲国产精品天堂| 99国产精品久久久久久久久久久 | 国产精品护士白丝一区av| 欧美成人精品福利| 一区二区三区在线视频观看58| 国产一区二区三区电影在线观看| 欧美在线综合视频| 国产农村妇女毛片精品久久麻豆 | 亚洲国产视频直播| av影院午夜一区| 亚洲国产精品av| 国模大尺度一区二区三区| 欧美日韩在线播放一区| 成人欧美一区二区三区1314| 国产精品白丝av| 国产婷婷色一区二区三区| 精品一区二区三区不卡| 欧美一区二区黄色| 麻豆精品视频在线观看免费| 欧美高清视频一二三区 | 成人黄色软件下载| 中文字幕二三区不卡| 国产盗摄女厕一区二区三区| 久久奇米777| 国产美女娇喘av呻吟久久| 国产日韩av一区| 成人精品国产免费网站| 亚洲欧美日韩国产成人精品影院|