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 + -
显示快捷键?