📄 intel.c
字号:
}
}
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 : IntelFlashErase
// Description: This routine erase the sectors of intel.
// Arguments : iOffset - the offset address.
// len - the length.
// Return : 0 - succuss.
// 1 - failure.
// Note(s) :
//****************************************************************************
int IntelFlashErase(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(GetSectorIndex(pInfo,iOffset,&pulSectorBase,
&piCurEraseRegionStart, &piCurEraseBlockStart)==1)
return 1;
if(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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++)
{
IntelFlashEraseSector(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 IntelFlashErase(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;
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;
IntelFlashEraseSector(pInfo,iEraseBase);
//
//for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[i].block_size>>1); iIdx++)
//{
// if(*(ptr16 + (iEraseBase >> 1) + iIdx) != 0xffff)
// {
// return 1;;
// }
//}
iEraseBase=iEraseBase + pInfo->pQuery->sBlockInfo[i].block_size;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -