📄 intel.c
字号:
{
IntelFlashEraseSector(pInfo,iEraseBase);
//
//for(iIdx = 0; iIdx < (pInfo->pQuery->sBlockInfo[i].block_size>>1); iIdx++)
//{
// if(*(ptr16 + (iEraseBase >> 1) + iIdx) != 0xffff)
// {
// return 1;;
//}
//}
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*2) {
iEraseLen = iEraseLen - (pInfo->pQuery->sBlockInfo[i].block_size *2);
IntelFlashEraseSector(pInfo,iEraseBase);
iEraseBase=iEraseBase + (pInfo->pQuery->sBlockInfo[i].block_size *2);
} else {
IntelFlashEraseSector(pInfo,iEraseBase);
return 0;
}
}
}
} else{
// No such parameter.
return 1;
}
return 1;
}
*/
//****************************************************************************
// Name : IntelFlashEraseChip
// Description: This routine erase the flash chip.
// Arguments :
// Return : 0 - succuss.
// 1 - failure.
// Note(s) :
//****************************************************************************
int IntelFlashEraseChip(struct FlashInfo *pInfo)
{
if(!(IntelFlashErase(pInfo, 0, pInfo->pQuery->DeviceSize))) return 1;
else return 0;
}
//****************************************************************************
// Name : IntelFlashProgramSector
// 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 IntelFlashProgramSector(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 = 0;
if (usByteWidth == 1){
for(iIdx = 0; iIdx < (len>>1); iIdx++){
// Write the program word command.
*(ptr16+(iOffset >> 1))= CMD_PROGRAM_SETUP;
// Write one 16bit width word.
*(ptr16 + (iOffset >> 1) + iIdx) = *(pusData16 + iIdx);
// Wait until the data word has been programmed.
IntelFlashWaitUntilForProgram(pInfo, 0);
}
// Put the FLASH into read array mode.
*ptr16= CMD_READ_ARRAY;
//Read-back verification after writing data to flash
for(iIdx = 0; iIdx < (len>>1); iIdx++)
{
if(*(ptr16 + (iOffset >> 1) + iIdx) != *(pusData16 + iIdx))
{
iResult = 1;
break;
}
else
{
iResult = 0;
}
}
} else if (usByteWidth == 2){
for(iIdx = 0; iIdx < (len>>2); iIdx++){
// Write the program word command.
*(ptr32+(iOffset >> 2))= (CMD_PROGRAM_SETUP << 16) | CMD_PROGRAM_SETUP;
// Write one 32bit width word.
*(ptr32 + (iOffset >> 2) + iIdx) = *(pulData32 + iIdx);
// Wait until the data word has been programmed.
IntelFlashWaitUntilForProgram(pInfo, 0);
}
// Put the FLASH into read array mode.
*ptr32= (CMD_READ_ARRAY << 16) | CMD_READ_ARRAY;
//Read-back verification after writing data to flash
for(iIdx = 0; iIdx < (len>>2); iIdx++)
{
if(*(pulData32+iIdx)!=*(ptr32+(iOffset >> 2)+iIdx))
{
iResult = 1;
break;
}
else
{
iResult = 0;
}
}
} else{
// No such parameter.
return 1;
}
return iResult;
}
//****************************************************************************
// Name : IntelFlashProgramSector
// 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 IntelFlashProgram(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=0;
int iResult = 0;
if (usByteWidth == 1){
for(iIdx = 0; iIdx < (len>>1); iIdx++){
// Write the program word command.
*(ptr16+(iOffset >> 1))= CMD_PROGRAM_SETUP;
// Write one 16bit width word.
*(ptr16 + (iOffset >> 1) + iIdx) = *(pusData16 + iIdx);
// Wait until the data word has been programmed.
IntelFlashWaitUntilForProgram(pInfo, 0);
}
// Put the FLASH into read array mode.
*ptr16= CMD_READ_ARRAY;
//Read-back verification after writing data to flash
for(iIdx = 0; iIdx < (len>>1); iIdx++)
{
if(*(ptr16 + (iOffset >> 1) + iIdx) != *(pusData16 + iIdx))
{
iResult = 1;
break;
}
else
{
iResult = 0;
}
}
} else if (usByteWidth == 2){
for(iIdx = 0; iIdx < (len>>2); iIdx++){
// Write the program word command.
*(ptr32+(iOffset >> 2))= (CMD_PROGRAM_SETUP << 16) | CMD_PROGRAM_SETUP;
// Write one 32bit width word.
*(ptr32 + (iOffset >> 2) + iIdx) = *(pulData32 + iIdx);
// Wait until the data word has been programmed.
IntelFlashWaitUntilForProgram(pInfo, 0);
}
// Put the FLASH into read array mode.
*ptr32= (CMD_READ_ARRAY << 16) | CMD_READ_ARRAY;
//Read-back verification after writing data to flash
for(iIdx = 0; iIdx < (len>>2); iIdx++)
{
if(*(pulData32+iIdx)!=*(ptr32+(iOffset >> 2)+iIdx))
{
iResult = 1;
break;
}
else
{
iResult = 0;
}
}
} else{
// No such parameter.
return 1;
}
return iResult;
}
//****************************************************************************
// Name : IntelFlashProgram
// Description: This routine program the intel flash.
// Arguments : iOffset - the offset address.
// data - the data pointer.
// len - the length.
// Return : 0 - succuss.
// 1 - failure.
// Note(s) :
//****************************************************************************
int IntelFlashProgram_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;
if(1==IntelFlashProgramSector(pInfo, iOffset,
(void *)((unsigned char *)data + iProgramBase),
pInfo->pQuery->sBlockInfo[i].block_size)){
//program fail
return 1;
}
// program success
iProgramBase=iProgramBase + pInfo->pQuery->sBlockInfo[i].block_size;
}
else {
if(1==IntelFlashProgramSector(pInfo, iOffset,
(void *)((unsigned char *)data + iProgramBase),
iProgramLen)){
//program fail
return 1;
}
//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(iProgramLen > pInfo->pQuery->sBlockInfo[i].block_size*2)
{
iProgramLen = iProgramLen - (pInfo->pQuery->sBlockInfo[i].block_size *2);
if(1==IntelFlashProgramSector(pInfo, iOffset,
(void *)((unsigned char *)data + iProgramBase),
pInfo->pQuery->sBlockInfo[i].block_size))
{
//program fail
return 1;
}
//program sucess
iProgramBase=iProgramBase + (pInfo->pQuery->sBlockInfo[i].block_size *2);
}
else
{
if(1==IntelFlashProgramSector(pInfo, iOffset,
(void *)((unsigned char *)data + iProgramBase),
iProgramLen))
{
//program fail
return 1;
}
//program sucess
return 0;
}
}
}
}
else{
// No such parameter.
return 1;
}
return 1;
}
//****************************************************************************
// End
//****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -