⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amd.c

📁 嵌入式系统 EP93xx处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
 		        AmdFlashEraseSector(pInfo,pulSectorBase);                	                //	                //#if 1			for(iIdx = 0; iIdx < ((pInfo->pQuery->sBlockInfo[i].block_size*2)>>2); iIdx++)	             	{	            	    if(*(ptr32 + (pulSectorBase >> 2) + iIdx) != 0xffffffff)	            	    {	              	    	return 1;	            	    }	 	   	    	}	   	    	//#endif	   	    	     			 		pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size*2;                    }                 }                 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*2)>>2); iIdx++)	             	{	            	    if(*(ptr32 + (pulSectorBase >> 2) + iIdx) != 0xffffffff)	            	    {	              	    	return 1;	            	    }	 	   	    	}	   	    	//#endif	   	    	     			 		pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size*2;                    }            	                 }                 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*2)>>2); iIdx++)	             	{	            	    if(*(ptr32 + (pulSectorBase >> 2) + iIdx) != 0xffffffff)	            	    {	              	    	return 1;	            	    }	 	   	    	}	   	    	//#endif	   	    	     			 		pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[i].block_size*2;                    }                              }            }        }        else        {      	    for(j = piCurEraseBlockStart; j<= piCurEraseBlockEnd; j++)             {		        AmdFlashEraseSector(pInfo,pulSectorBase);                        //                //#if 1		for(iIdx = 0; iIdx < ((pInfo->pQuery->sBlockInfo[piCurEraseRegionStart].block_size*2)>>2); iIdx++)             	{            	    if(*(ptr32 + (pulSectorBase >> 2) + iIdx) != 0xffffffff)            	    {              	    	return 1;            	    }    	    	}   	    	//#endif   	    	     		 		pulSectorBase = pulSectorBase + pInfo->pQuery->sBlockInfo[piCurEraseRegionStart].block_size*2;            }         	        	        }                return 0;     }      else    {        // No such parameter.        return 1;    }    return 0;    }/*int AmdFlashErase(struct FlashInfo *pInfo, int iOffset, int len){	unsigned short usByteWidth = pInfo->ByteWidth;	int i, j;        int iEraseLen = len;	int iEraseBase = iOffset;		if (usByteWidth == 1)	{            for(i = 0; i < pInfo->pQuery->NumEraseBlocks; i++)             {                for(j = 0; j< pInfo->pQuery->sBlockInfo[i].blocks; j++)                {                    if(iEraseLen > pInfo->pQuery->sBlockInfo[i].block_size)                     {                        iEraseLen = iEraseLen - pInfo->pQuery->sBlockInfo[i].block_size;                                            if(AmdFlashEraseSector(pInfo,iEraseBase)!=0)                        {                            //program fail                    	    return 1;                        }                        //program sucess                        iEraseBase=iEraseBase + pInfo->pQuery->sBlockInfo[i].block_size;                    }                     else                     {			if(AmdFlashEraseSector(pInfo,iEraseBase)!=0)			{			    //program fail			    return 1;			}			else			{			    //program sucess			    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(iEraseLen > (pInfo->pQuery->sBlockInfo[i].block_size << 1))                    {                        iEraseLen = iEraseLen - (pInfo->pQuery->sBlockInfo[i].block_size << 1);                                            if(AmdFlashEraseSector(pInfo,iEraseBase)!=0)                        {                            //program sucess                            return 1;                        }                        //program sucess                        iEraseBase=iEraseBase + (pInfo->pQuery->sBlockInfo[i].block_size << 1);                    }                     else                     {			if(AmdFlashEraseSector(pInfo,iEraseBase)!=0)			{			    return 1;			}			else			{			    return 0;			}		    }			        }	    }    	} 	else	{	    // No such parameter.            return 1;        }            return 1;}*///****************************************************************************// Name       : AmdFlashProgramSector// Description: This routine program the specified sector of amd.// Arguments  : iOffset - the offset address.//              len  - the length.// Return     : 0 - succuss.//              1 - failure.// Note(s)    ://****************************************************************************int AmdFlashProgramSector(struct FlashInfo *pInfo, int iOffset, void *data, int len){    volatile unsigned short *ptr16 = (volatile unsigned short *)pInfo->FlashBase;    volatile unsigned long *ptr32 = (volatile unsigned long *)pInfo->FlashBase;    unsigned short *pusData16 =(unsigned short *)data;    unsigned long *pulData32 =(unsigned long *)data;		unsigned short usByteWidth = pInfo->ByteWidth;	int iIdx;	int iResult = FLASH_ERR_OK;	int timeout = 50000;	if (usByteWidth == 1){	    for(iIdx = 0; iIdx < (len>>1); iIdx++){    	    // Send program block command - four step sequence            *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_CODE1;            *(ptr16 + AMD_SETUP_ADDR2) = AMD_SETUP_CODE2;            *(ptr16 + AMD_SETUP_ADDR1) = AMD_PROGRAM;            *(ptr16 + (iOffset >> 1) + iIdx) = *(pusData16 + iIdx);                        timeout = 10000000;            while (1) {                if (*(pusData16 + iIdx) == *(ptr16 + (iOffset >> 1) + iIdx))                    break;                // Can't check for FLASH_Err since it'll fail in parallel                // configurations.                if (--timeout == 0) {                    iResult = FLASH_ERR_DRV_TIMEOUT;                    break;                }            }            if (FLASH_ERR_OK != iResult)                *ptr16 = AMD_RESET;                	    // Read-back verification after writing data to flash            if (*(ptr16 + (iOffset >> 1) + iIdx) != *(pusData16 + iIdx)) {                                if (FLASH_ERR_OK == iResult) iResult = FLASH_ERR_DRV_VERIFY;                break;            }        }	} else if (usByteWidth == 2){	    for(iIdx = 0; iIdx < (len>>2); iIdx++){    	    // Send program block command - four 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_PROGRAM << 16) | AMD_PROGRAM;            *(ptr32 + (iOffset >> 2) + iIdx) = *(pulData32 + iIdx);                        timeout = 10000000;            while (1) {                if (*(pulData32 + iIdx) == *(ptr32 + (iOffset >> 2) + iIdx))                    break;                // Can't check for FLASH_Err since it'll fail in parallel                // configurations.                if (--timeout == 0) {                    iResult = FLASH_ERR_DRV_TIMEOUT;                    break;                }            }            if (FLASH_ERR_OK != iResult)                *ptr32 =  (AMD_RESET << 16) | AMD_RESET;	    // Read-back verification after writing data to flash            if (*(ptr32 + (iOffset >> 2) + iIdx) != *(pulData32 + iIdx)) {                                if (FLASH_ERR_OK == iResult) iResult = FLASH_ERR_DRV_VERIFY;                break;            }        }                	} else{	    // No such parameter.        return 1;    }    			return iResult;}//****************************************************************************// Name       : AmdFlashProgramSector// Description: This routine program the specified sector of amd.// Arguments  : iOffset - the offset address.//              len  - the length.// Return     : 0 - succuss.//              1 - failure.// Note(s)    ://****************************************************************************int AmdFlashProgram(struct FlashInfo *pInfo, int iOffset, void *data, int len){    volatile unsigned short *ptr16 = (volatile unsigned short *)pInfo->FlashBase;    volatile unsigned long *ptr32 = (volatile unsigned long *)pInfo->FlashBase;    unsigned short *pusData16 =(unsigned short *)data;    unsigned long *pulData32 =(unsigned long *)data;		unsigned short usByteWidth = pInfo->ByteWidth;	int iIdx;	int iResult = FLASH_ERR_OK;	int timeout = 50000;	if (usByteWidth == 1)	{	    for(iIdx = 0; iIdx < (len>>1); iIdx++)	    {    	    // Send program block command - four step sequence            *(ptr16 + AMD_SETUP_ADDR1) = AMD_SETUP_CODE1;            *(ptr16 + AMD_SETUP_ADDR2) = AMD_SETUP_CODE2;            *(ptr16 + AMD_SETUP_ADDR1) = AMD_PROGRAM;            *(ptr16 + (iOffset >> 1) + iIdx) = *(pusData16 + iIdx);                        timeout = 10000000;            while (1)             {                if (*(pusData16 + iIdx) == *(ptr16 + (iOffset >> 1) + iIdx))                    break;                // Can't check for FLASH_Err since it'll fail in parallel                // configurations.                if (--timeout == 0)                 {                    iResult = FLASH_ERR_DRV_TIMEOUT;                    break;                }            }            if (FLASH_ERR_OK != iResult)                *ptr16 = AMD_RESET;                	    // Read-back verification after writing data to flash            if (*(ptr16 + (iOffset >> 1) + iIdx) != *(pusData16 + iIdx))             {                                if (FLASH_ERR_OK == iResult)                 {                    iResult = FLASH_ERR_DRV_VERIFY;                }                break;            }                        }	} else if (usByteWidth == 2){	    for(iIdx = 0; iIdx < (len>>2); iIdx++){    	    // Send program block command - four 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_PROGRAM << 16) | AMD_PROGRAM;            *(ptr32 + (iOffset >> 2) + iIdx) = *(pulData32 + iIdx);                        timeout = 10000000;            while (1) {                if (*(pulData32 + iIdx) == *(ptr32 + (iOffset >> 2) + iIdx))                    break;                // Can't check for FLASH_Err since it'll fail in parallel                // configurations.                if (--timeout == 0) {                    iResult = FLASH_ERR_DRV_TIMEOUT;                    break;                }            }            if (FLASH_ERR_OK != iResult)                *ptr32 =  (AMD_RESET << 16) | AMD_RESET;	    // Read-back verification after writing data to flash            if (*(ptr32 + (iOffset >> 2) + iIdx) != *(pulData32 + iIdx)) {                                if (FLASH_ERR_OK == iResult) iResult = FLASH_ERR_DRV_VERIFY;                break;            }        }                	} else{	    // No such parameter.        return 1;    }    			return iResult;}//****************************************************************************// Name       : AmdFlashProgram// Description: This routine program the amd flash.// Arguments  : iOffset - the offset address.//              data - the data pointer.//              len  - the length.// Return     : 1 - succuss.//              0 - failure.// Note(s)    ://****************************************************************************int AmdFlashProgram_old(struct FlashInfo *pInfo, int iOffset, void *data, int len){    unsigned short usByteWidth = pInfo->ByteWidth;	int i, j;    int iProgramLen = len;	int iProgramBase = 0;	if (usByteWidth == 1){        for(i = 0; i < pInfo->pQuery->NumEraseBlocks; i++) {            for(j = 0; j< pInfo->pQuery->sBlockInfo[i].blocks; j++) {                                if(iProgramLen > pInfo->pQuery->sBlockInfo[i].block_size) {                    iProgramLen = iProgramLen - pInfo->pQuery->sBlockInfo[i].block_size;                    AmdFlashProgramSector(pInfo, iOffset,                        (void *)((unsigned char *)data + iProgramBase),                        pInfo->pQuery->sBlockInfo[i].block_size);                    iProgramBase=iProgramBase + pInfo->pQuery->sBlockInfo[i].block_size;                } else {                    AmdFlashProgramSector(pInfo, iOffset,                        (void *)((unsigned char *)data + iProgramBase),                        iProgramLen);					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(iProgramLen > (pInfo->pQuery->sBlockInfo[i].block_size << 1)) {                    iProgramLen = iProgramLen - (pInfo->pQuery->sBlockInfo[i].block_size << 1);                    AmdFlashProgramSector(pInfo, iOffset,                        (void *)((unsigned char *)data + iProgramBase),                        pInfo->pQuery->sBlockInfo[i].block_size);                    iProgramBase=iProgramBase + (pInfo->pQuery->sBlockInfo[i].block_size << 1);                } else {                    AmdFlashProgramSector(pInfo, iOffset,                        (void *)((unsigned char *)data + iProgramBase),                        iProgramLen);					return 0;				}					}		}  	} else{	    // No such parameter.        return 1;    }        return 1;}//****************************************************************************// End//****************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -