📄 amd.c
字号:
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 + -