Description
Source
Call Graph
Start Line: 202
unsigned char intel_Program(struct NorFlashInfo *pNorFlashInfo, unsigned int address, unsigned int data)
{
unsigned int status;
unsigned int datain;
volatile unsigned int busAddress;
unsigned char done = 0;
unsigned char busWidth;
busWidth = NorFlash_GetDataBusWidth(pNorFlashInfo);
intel_Reset(pNorFlashInfo, address);
busAddress = NorFlash_GetAddressInChip(pNorFlashInfo, address);
// Check if the data already have been erased.
ReadRawData(busWidth, busAddress, (unsigned char*)&datain);
if((datain & data)!= data) {
return NorCommon_ERROR_CANNOTWRITE;
}
// Word programming operations are initiated by writing the Word Program Setup command to the device.
WriteCommand(busWidth, busAddress, INTEL_CMD_PROGRAM_WORD);
// This is followed by a second write to the device with the address and data to be programmed.
WriteRawData(busWidth, busAddress, (unsigned char*)&data);
// Status register polling
do {
status = intel_ReadStatus(pNorFlashInfo,address);
// Check if the device is ready.
if ((status & INTEL_STATUS_DWS) == INTEL_STATUS_DWS ) {
// check if VPP within acceptable limits during program or erase operation.
if ((status & INTEL_STATUS_VPPS) == INTEL_STATUS_VPPS ) {
return NorCommon_ERROR_CANNOTWRITE;
}
// Check if the erase block operation is completed.
if ((status & INTEL_STATUS_PS) == INTEL_STATUS_PS ) {
return NorCommon_ERROR_CANNOTWRITE;
}
// check if Block locked during program or erase, operation aborted.
else if ((status & INTEL_STATUS_BLS) == INTEL_STATUS_BLS ) {
return NorCommon_ERROR_CANNOTWRITE;
}
else {
done = 1;
}
}
} while (!done);
intel_ClearStatus(pNorFlashInfo);
intel_Reset(pNorFlashInfo, address);
return 0;
}