cfginfo.c
来自「M-System DOC(Disk on a Chip) Flash芯片的诊断工」· C语言 代码 · 共 244 行
C
244 行
#include "unitinc.h"
#include "cfginfo.h"
#include "saftl.h"
PhysicalInfo PhysicalInfo_struct;
VolumeInfoRecord VolumeInfoRecord_struct;
FLStatus DINFO_CONFIG(EXBYTE handle)
{
/* Start to gather Infromation about the DOC */
IOreq ioreq;
FLStatus Status;
VolumeInfoRecord* volInfo = NULL;
PhysicalInfo * pInfo = NULL;
EXBOOL unformat_flag = FALSE;
EXBOOL protected_flag = FALSE;
EXWORD noOfVolumes;
EXWORD i,j;
EXWORD lastHandle;
ioreq.irHandle = handle ;
i = handle;
/* Try To Mount */
Status = DINFO_flAbsMountVolume(&ioreq);
if(STATUS_ERROR)
{
/* only in case of first partition is read protected */
/* so try to mount other partitions */
if (Status==flHWProtection)
{
Status = DINFO_flCountVolumes(&ioreq);
if(STATUS_OK)
{
noOfVolumes = ioreq.irFlags;
for (j=0;j<noOfVolumes;j++)
{
ioreq.irHandle = handle;
ioreq.irHandle |= (j<<4) ;
Status = DINFO_flAbsMountVolume(&ioreq);
if (Status==flOK)
break;
}
if(STATUS_ERROR)
{
pInfo = &PhysicalInfo_struct;
ioreq.irHandle = handle; /* When calling GetPhysicalInfo, Partition number must be 0 */
ioreq.irData = pInfo;
DinfoPrint( EX_TEXT("\n Media is HW protected \n"));
Status = DINFO_flGetPhysicalInfo(&ioreq);
if (Status!= flOK)
pInfo = NULL;
protected_flag = TRUE;
}
}
}
else
{
pInfo = &PhysicalInfo_struct;
ioreq.irData = pInfo;
Status = DINFO_flGetPhysicalInfo(&ioreq);
if(STATUS_OK)
{
/* DinfoPrint(( EX_TEXT("Can`t Mount Media, only Physical Info will be displayed...\n") ); */
unformat_flag = TRUE;
}
else
{
/* ExMemFree(pInfo); */
pInfo = NULL;
DinfoPrint( EX_TEXT("Bad Media on Socket %d (with status %s)\n"),i,TranslateFLStatus(Status) );
}
}
}
/* If the Media is neither Unformatted nor protected */
if ((!unformat_flag) & (!protected_flag))
{
volInfo = &VolumeInfoRecord_struct;
ioreq.irData = volInfo;
Status = DINFO_flVolumeInfo(&ioreq);
if(STATUS_ERROR)
{
DinfoPrint( EX_TEXT("Cannot Get Volume information Socket %d (with status %s)\n"),i,TranslateFLStatus(Status) );
/* ExMemFree(volInfo); */
volInfo = NULL;
}
Status = DINFO_flDismountVolume(&ioreq);
if(STATUS_ERROR)
return Status;
/* Find the Physical Data */
pInfo = &PhysicalInfo_struct;
ioreq.irData = pInfo;
lastHandle = ioreq.irHandle;
ioreq.irHandle &= 0xff0f;
Status = DINFO_flGetPhysicalInfo(&ioreq);
ioreq.irHandle = lastHandle;
if( Status != flOK )
{
/* ExMemFree( pInfo ); */
pInfo = NULL;
Status = flOK;
}
}
PRINT_CONFIG_DATA(handle, volInfo, pInfo);
if( unformat_flag )
{
DinfoPrint( "\n Unformatted DiskOnChip.\n\n" );
return flUnknownMedia;
}
return Status;
}
void PRINT_CONFIG_DATA( EXBYTE handle, VolumeInfoRecord* volInfo, PhysicalInfo* pInfo)
{
IOreq ioreq;
FLStatus Status;
FLExtendedDiskInfo info;
EXBYTE ver_name[4];
EXBYTE i;
/* Prepare calling the flGetExtendedDiskInfo() function */
ioreq.irHandle = handle;
ioreq.irData = &info;
ioreq.irLength = FL_ALL_FLOORS;
ioreq.irCount = 0;
ioreq.irFlags = FL_DISK_PARTITION;
info.dwStructSize = sizeof(info);
Status = flGetExtendedDiskInfo( &ioreq );
if( Status != flOK )
{
/* if flGetExtendedDiskInfo failed , print the info you have in *pInfo */
DinfoPrint( EX_TEXT(" Unit Size : %ld Bytes (%d KB)\n"),pInfo->unitSize, pInfo->unitSize/EXKBYTE);
DinfoPrint( EX_TEXT(" Media Size : %ld Bytes (%d MB)\n"),pInfo->mediaSize,pInfo->mediaSize/EXMBYTE);
DinfoPrint( EX_TEXT(" Chip Size : %ld Bytes (%d MB)\n"),pInfo->chipSize,pInfo->chipSize/EXMBYTE);
DinfoPrint( EX_TEXT(" No Of Chips : %d\n"),pInfo->mediaSize/pInfo->chipSize);
DinfoPrint( EX_TEXT(" Interleaving : %d\n"),pInfo->interleaving);
return;
}
if (volInfo)
{
if( Option.Extraflag )
{
DinfoPrint( EX_TEXT(" Flash Type : %s\n"), TranslateFlashId( volInfo->flashType ) );
DinfoPrint( EX_TEXT(" Vendor Type : %s\n"), TransVendorType( volInfo->flashType ) );
}
ver_name[0] = (byte)info.dwTrueFFSVersion;
ver_name[1] = (byte)(info.dwTrueFFSVersion >> 8);
ver_name[2] = (byte)(info.dwTrueFFSVersion >> 16);
ver_name[3] = (byte)(info.dwTrueFFSVersion >> 24);
DinfoPrint( EX_TEXT(" TrueFFS version : %c.%c.%c\n"),ver_name[0],ver_name[1],ver_name[2] );
/* DinfoPrint( EX_TEXT(" Block Size : %u Bytes (%d KB)\n"),volInfo->physicalUnitSize, volInfo->physicalUnitSize/KBYTE); */
/* DinfoPrint( EX_TEXT(" Physical Size : %ld (%d MB)\n"),volInfo->physicalSize,volInfo->physicalSize/MBYTE); */
if( Option.Extraflag )
{
DinfoPrint( EX_TEXT(" Life Time : %d/10\n"),volInfo->lifeTime);
}
}
if(pInfo)
{
DinfoPrint( EX_TEXT(" Unit Size : %ld Bytes (%d KB)\n"),pInfo->unitSize, pInfo->unitSize/EXKBYTE);
DinfoPrint( EX_TEXT(" Media Size : %ld Bytes (%d MB)\n"),pInfo->mediaSize,pInfo->mediaSize/EXMBYTE);
if( Option.Extraflag )
{
DinfoPrint( EX_TEXT(" Chip Size : %ld Bytes (%d MB)\n"),pInfo->chipSize,pInfo->chipSize/EXMBYTE);
DinfoPrint( EX_TEXT(" No Of Chips : %d\n"),pInfo->mediaSize/pInfo->chipSize);
DinfoPrint( EX_TEXT(" Interleaving : %d\n"),pInfo->interleaving);
DinfoPrint( EX_TEXT(" Number of planes : %d\n"),curFlash->noOfPlanes );
DinfoPrint( EX_TEXT(" Number of banks : %d\n"), curFlash->noOfBanks );
DinfoPrint( EX_TEXT(" Number of floors : %d\n"),info.bNoOfFloors );
DinfoPrint( EX_TEXT(" Data bus width : %d\n"),info.bDataBusWidth );
DinfoPrint( EX_TEXT(" Sectors per page : %d\n"),info.bSectorsPerPage );
DinfoPrint( EX_TEXT(" IPL size : %d\n"),info.dwIPLSize );
DinfoPrint( EX_TEXT(" Total protected areas : %d\n"),info.btotalProtectedAreas );
DinfoPrint( EX_TEXT(" Units in first floor : %d\n"),info.dwUnitsInFirstFloor );
DinfoPrint( EX_TEXT(" No of binaries : %d\n"),info.bNoOfBinaryPartitions );
DinfoPrint( EX_TEXT(" No of disk partitions : %d\n"),info.bNoOfDiskPartitions );
DinfoPrint( EX_TEXT(" Block multiplier bits : %d\n"),info.bBlockMultiplierBits );
DinfoPrint( EX_TEXT(" Percent used : %d\n"),info.dwPercentUsed );
DinfoPrint( EX_TEXT(" Media Header units : %d\n"),info.bHeaderUnits );
DinfoPrint( EX_TEXT(" Media Header location : %d\n"),info.wHeaderLocation );
DinfoPrint( EX_TEXT(" Num of protection areas capable of changing: %d\n"),info.bChangeableProtectedAreas );
DinfoPrint( EX_TEXT(" Worst bad blocks percentage,guaranteed by vendor: %d\n"),info.dwMaxBadPercentage );
if (info.dwFlashTechnology & FL_SUPPORT_MLC)
DinfoPrint( EX_TEXT(" Flash technology : SUPPORT MLC \n") );
if (info.dwFlashTechnology & FL_SUPPORT_MLC)
DinfoPrint( EX_TEXT(" Flash technology : SUPPORT RELIABLE \n") );
if (info.dwFlashTechnology & FL_SUPPORT_FAST)
DinfoPrint( EX_TEXT(" Flash technology : SUPPORT FAST \n") );
if (info.dwFlashTechnology & FL_SUPPORT_NO_MATCHING)
DinfoPrint( EX_TEXT(" Flash technology : SUPPORT NO MATCHING \n") );
if (info.dwTLType & SUSPEND_FOR_WRITE)
DinfoPrint( EX_TEXT(" TL format : SUSPEND FOR WRITE \n") );
if (info.dwTLType & NFTL_ENABLED)
DinfoPrint( EX_TEXT(" TL format : NFTL ENABLED \n") );
if (info.dwTLType & INFTL_ENABLED)
DinfoPrint( EX_TEXT(" TL format : INFTL ENABLED \n") );
if (info.dwTLType & EXTERNAL_EPROM)
DinfoPrint( EX_TEXT(" TL format : EXTERNAL EPROM \n") );
if (info.dwTLType & SAFTL_ENABLED)
DinfoPrint( EX_TEXT(" TL format : SAFTL ENABLED \n") );
DinfoPrint( EX_TEXT(" Programmer Name : "));
for (i=0;i<4;i++)
DinfoPrint( EX_TEXT("%c"),info.bProgrammerNamePtr[i] );
DinfoPrint( EX_TEXT("\n"));
DinfoPrint( EX_TEXT(" Programmer Version : "),info.bProgrammerVersionPtr[i] );
for (i=0;i<4;i++)
DinfoPrint( EX_TEXT("%c"),info.bProgrammerVersionPtr[i] );
DinfoPrint( EX_TEXT("\n"));
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?