?? norflashcfi.c
字號:
unsigned int sector)
{
unsigned short i;
unsigned short j;
unsigned short numBlockRegion,numBlockPerRegion;
unsigned int block = 0;
numBlockRegion = pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.numEraseRegion;
for (i = 0; i < numBlockRegion; i++) {
numBlockPerRegion = (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i]).Y + 1;
for (j = 0; j < numBlockPerRegion; j++) {
if (block == sector) {
return (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i].Z) * 256 ;
}
block++;
}
}
return 0;
}
//------------------------------------------------------------------------------
/// Returns secort number on specified memory offset.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
/// \param memoryOffset Memory offset.
//------------------------------------------------------------------------------
unsigned short NorFlash_GetDeviceSectorInRegion(
struct NorFlashInfo *pNorFlashInfo,
unsigned int memoryOffset)
{
unsigned short numBlockRegion,numBlockPerRegion;
unsigned short sectorId = 0;
unsigned int size = 0;
unsigned char done = 0;
unsigned short i , j;
numBlockRegion = pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.numEraseRegion;
for (i = 0; i < numBlockRegion; i++) {
numBlockPerRegion = (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i]).Y + 1;
for (j = 0; j < numBlockPerRegion; j++) {
size+= (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i].Z) * 256 ;
if(size >= memoryOffset) {
done = 1;
break;
}
sectorId++;
}
if (done) break;
}
return sectorId;
}
//------------------------------------------------------------------------------
/// Returns start address of specified sector number.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
/// \param sector Sector number.
//------------------------------------------------------------------------------
unsigned int NorFlash_GetDeviceSectorAddress(
struct NorFlashInfo *pNorFlashInfo,
unsigned int sector)
{
unsigned short numBlockRegion,numBlockPerRegion;
unsigned short sectorId = 0;
unsigned int address = 0;
unsigned char done = 0;
unsigned short i , j;
numBlockRegion = pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.numEraseRegion;
for (i = 0; i < numBlockRegion; i++) {
numBlockPerRegion = (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i]).Y + 1;
for (j = 0; j < numBlockPerRegion; j++) {
if (sector == sectorId) {
done = 1;
break;
}
address+= (pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.eraseRegionInfo[i].Z) * 256 ;
sectorId++;
}
if (done) break;
}
return address;
}
//------------------------------------------------------------------------------
/// Convert address to byte addressing.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
/// \Param offset Address offset
//------------------------------------------------------------------------------
unsigned int NorFlash_GetByteAddress(
struct NorFlashInfo *pNorFlashInfo, unsigned int offset)
{
return (offset * pNorFlashInfo-> deviceChipWidth);
}
//------------------------------------------------------------------------------
/// Convert address to byte addressing and return the address in chip.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
/// \Param offset Address offset
//------------------------------------------------------------------------------
unsigned int NorFlash_GetByteAddressInChip(
struct NorFlashInfo *pNorFlashInfo, unsigned int offset)
{
return (pNorFlashInfo->baseAddress + (offset * pNorFlashInfo-> deviceChipWidth));
}
//------------------------------------------------------------------------------
/// Returns the address in chip.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
/// \Param offset Address offset
//------------------------------------------------------------------------------
unsigned int NorFlash_GetAddressInChip(struct NorFlashInfo *pNorFlashInfo, unsigned int offset)
{
return (pNorFlashInfo->baseAddress + offset);
}
//------------------------------------------------------------------------------
/// Returns bus width in bits of giving device.
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
//------------------------------------------------------------------------------
unsigned char NorFlash_GetDataBusWidth( struct NorFlashInfo *pNorFlashInfo)
{
return (pNorFlashInfo->deviceChipWidth * 8);
}
//------------------------------------------------------------------------------
/// Returns the size of the whole device in bytes
/// \param pNorFlashInfo Pointer to a NorFlashInfo instance.
//------------------------------------------------------------------------------
unsigned long NorFlash_GetDeviceSizeInBytes(
struct NorFlashInfo *pNorFlashInfo)
{
return ((unsigned long) 2 << ((pNorFlashInfo->cfiDescription.norFlashCfiDeviceGeometry.deviceSize) - 1));
}
//------------------------------------------------------------------------------
/// Looks for query struct in Norflash common flash interface.
/// If found, the model variable is filled with the correct values.
/// This function returns 0 if a matching model has been found; otherwise it
/// returns NorCommon_ERROR_UNKNOWNMODEL.
//------------------------------------------------------------------------------
unsigned char NorFlash_CFI_Detect(
struct NorFlash *pNorFlash,
unsigned char hardwareBusWidth)
{
unsigned char i;
unsigned char *pCfi = (unsigned char*)(&(pNorFlash->norFlashInfo.cfiDescription));
unsigned int address;
pNorFlash->norFlashInfo.cfiCompatible = 0;
pNorFlash->norFlashInfo.deviceChipWidth = hardwareBusWidth;
address = CFI_QUERY_OFFSET;
for(i = 0; i< sizeof(struct NorFlashInfo) ; i++){
WriteCommand(8, NorFlash_GetByteAddressInChip(&(pNorFlash->norFlashInfo), CFI_QUERY_ADDRESS), CFI_QUERY_COMMAND);
ReadRawData(8, NorFlash_GetByteAddressInChip(&(pNorFlash->norFlashInfo), address), pCfi);
address++;
pCfi++;
}
// Check the query-unique ASCII string "QRY"
if( (pNorFlash->norFlashInfo.cfiDescription.norFlashCfiQueryInfo.queryUniqueString[0] != 'Q' )
|| (pNorFlash->norFlashInfo.cfiDescription.norFlashCfiQueryInfo.queryUniqueString[1] != 'R')
|| (pNorFlash->norFlashInfo.cfiDescription.norFlashCfiQueryInfo.queryUniqueString[2] != 'Y') ) {
return NorCommon_ERROR_UNKNOWNMODEL;
}
#ifdef DUMP_CFI
NorFlash_CFI_DumpConfigruation(&(pNorFlash->norFlashInfo.cfiDescription));
#endif
if (pNorFlash->norFlashInfo.cfiDescription.norFlashCfiQueryInfo.primaryCode == CMD_SET_AMD) {
pNorFlash->pOperations = &amdOperations;
}
else if (pNorFlash->norFlashInfo.cfiDescription.norFlashCfiQueryInfo.primaryCode == CMD_SET_INTEL_EXT) {
pNorFlash->pOperations = &intelOperations;
}
else {
return NorCommon_ERROR_UNKNOWNMODEL;
}
pNorFlash->norFlashInfo.cfiCompatible = 1;
NORFLASH_Reset(pNorFlash, 0);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -