⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bdtlinfo.c

📁 M-System DOC(Disk on a Chip) Flash芯片的诊断工具, 可以从Flash芯片中获取特定的数据信息, 用于判断芯片当前的状态.
💻 C
字号:
#include "bdtlinfo.h"
#include "saftl.h"


FLStatus DINFO_BDTL(EXBYTE handle)
{
  IOreq ioreq;
  FLStatus Status = flOK;
  FLStatus MountStatus = flOK;
  EXBYTE part_cnt,noOfVolumes;
  VolumeInfoRecord volInfo;
  EXDWORD capacity;
  FLExtendedDiskInfo info;

  ioreq.irHandle = handle;

  DinfoPrint( EX_TEXT("\n BDTL (DISK) INFO.\n") );
  ExPrintLine( 18 );

  Status = DINFO_flCountVolumes(&ioreq);
  if(STATUS_OK)
  {
    noOfVolumes = ioreq.irFlags;
    if (noOfVolumes>1)
      DinfoPrint( EX_TEXT("The Media is divided to %d disk-partitions\n\n"),noOfVolumes );
    else
      DinfoPrint( EX_TEXT("There is only one disk-partition\n\n") );
  }
  else
  {
    DinfoPrint( EX_TEXT("Can't Count Volumes on Socket %d (with status %s)\n"),handle,TranslateFLStatus(Status) );
    return Status;
  }

  for (part_cnt=0;part_cnt<noOfVolumes;part_cnt++)
  {
    DinfoPrint( EX_TEXT("BDTL Partition No. %d information:\n"),part_cnt);
    

    /*******************************/
    /* Print the protection Status */
    /*******************************/

    DinfoPrint( EX_TEXT("   Protection Status     :  "));
    ioreq.irHandle	 = handle | (part_cnt<<4) ;
    Status = DINFO_flIdentifyProtection(&ioreq);
    switch(Status)
    {
       case flOK:
          PrintProtectionType((EXWORD)ioreq.irFlags);
          break;

       case flNotProtected:
       case flFeatureNotSupported:
          DinfoPrint( EX_TEXT("Not Protected\n"));
          Status = flOK;
          break;

       default:
          DinfoPrint( EX_TEXT("Failed getting protection information (with status %s)\n"),TranslateFLStatus(Status) );
          return Status;
    }

    /**************************/
    /* Try mounting the media */
    /**************************/

    ioreq.irHandle = handle | (part_cnt<<4) ;

    Status = flMountVolume(&ioreq);
    if(STATUS_OK)
    {
       DinfoPrint( EX_TEXT("   Format Type           :  Fat Format\n"));
       Status = DINFO_flAbsMountVolume(&ioreq); /* to know if partition is formated */
       if(Status != flOK)
       {
          DinfoPrint( EX_TEXT("\n   Error - failed in abs mount after full mount (with status %s)\n"),TranslateFLStatus(Status) );
          return Status;
       }
    }
    else /* No FAT format present , H/W PROTECTED or bad format */
    {
       Status = DINFO_flAbsMountVolume(&ioreq); /* to know if partition is formated */

       if (Status==flHWProtection)
       {
          DinfoPrint( EX_TEXT("\nMedia is HW protected and can not be mounted\n"));
          MountStatus = flHWProtection;
          Status = flOK; /* so we will continue to process '/' after we get out from here */
       }

	   /* There are 2 posibilities of failure: flHWProtection or None Fat Format */
       if(MountStatus != flHWProtection)
       {
           DinfoPrint( EX_TEXT("   Format Type           :  None Fat Format\n"));
       }
    }

    ioreq.irHandle = handle | (part_cnt<<4) ;
    ioreq.irData	 = &volInfo;
	Status = DINFO_flVolumeInfo(&ioreq);
    if(STATUS_OK)
    {
       capacity = (unsigned long)(((unsigned long)volInfo.cylinders)* ((unsigned long)volInfo.heads)* ((unsigned long)volInfo.sectors)*((unsigned long)FL_SECTOR_SIZE));
       DinfoPrint( EX_TEXT("   Size                  :  %lu Bytes (%.1f MB)\n"),capacity,(float)capacity/EXMBYTE);
       DinfoPrint( EX_TEXT("   Sectors               :  %ld\n"),volInfo.sectors);
       DinfoPrint( EX_TEXT("   Heads                 :  %ld\n"),volInfo.heads);
       DinfoPrint( EX_TEXT("   Cylinders             :  %ld\n"),volInfo.cylinders);
	   DinfoPrint( EX_TEXT("   Virtual Sectors       :  %ld\n"),volInfo.logicalSectors);
    }
    else if (Status==flNotMounted)
    {
       Status = flOK;
       MountStatus = flHWProtection;
    }

    if( Option.Extraflag )
		{
       /*****************************************************/
       /* Get info on partition using flGetExtendedDiskInfo */
       /*****************************************************/

       info.dwStructSize = sizeof(info);
       ioreq.irData     = &info;
       ioreq.irLength   = FL_ALL_FLOORS;
       ioreq.irHandle	  = handle   ;
       ioreq.irCount    = part_cnt ; /* partition number */
       ioreq.irFlags    = FL_DISK_PARTITION;
       Status = flGetExtendedDiskInfo( &ioreq );
       if( Status != flOK )
       {
          DinfoPrint( EX_TEXT("flGetExtendedDiskInfo failed (with status %s)\n"),TranslateFLStatus(Status) );
		      return Status;
       }

       if(MountStatus != flHWProtection)
       {
            DinfoPrint( EX_TEXT("   Free units            :  %ld\n"),info.dwFreeUnits );
            DinfoPrint( EX_TEXT("   Needed free units     :  %d\n"),info.bNeededFreeUnits );
            DinfoPrint( EX_TEXT("   Sectors for folding   :  %d\n"),info.bMinSectorsForFolding );
            DinfoPrint( EX_TEXT("   Sectors for next write:  %d\n"),info.bMinSectorsForNextWrite );
            DinfoPrint( EX_TEXT("   Used units            :  %ld\n"),info.dwUsedUnits );
            DinfoPrint( EX_TEXT("   TL unit size          :  %ld\n"),info.dwTLUnitSize);
       }

       DinfoPrint( EX_TEXT("   Virtual units         :  %ld\n"),info.dwVirtualUnits );
       DinfoPrint( EX_TEXT("   First Quick Mount unit:  %ld\n"),info.dwFirstQuickMountUnit );
       DinfoPrint( EX_TEXT("   First unit            :  %ld\n"),info.dwFirstUnit );
       DinfoPrint( EX_TEXT("   Last unit             :  %ld\n"),info.dwLastUnit );
       DinfoPrint( EX_TEXT("   Spare units           :  %ld\n"),info.dwSpareUnits );
       DinfoPrint( EX_TEXT("   Transfer units        :  %ld\n"),info.dwTransferUnits );

		if (info.dwPartitionFlags & SAFTL_BDTL)
          DinfoPrint( EX_TEXT("   Partition flags       :  BDTL \n") );
		if (info.dwPartitionFlags & SAFTL_LAST)
          DinfoPrint( EX_TEXT("   Partition flags       :  LAST \n") );
		if (info.dwPartitionFlags & SAFTL_QUICK_MOUNT)
          DinfoPrint( EX_TEXT("   Partition flags       :  QUICK MOUNT \n") );

     	if (info.dwPartitionFlags & SAFTL_ADVANCED_MATCHING)
          DinfoPrint( EX_TEXT("   Partition flags       :  ADVANCED MATCHING \n") );
    	if (info.dwPartitionFlags & SAFTL_REL_PARTITION)
          DinfoPrint( EX_TEXT("   Partition flags       :  TYPE A PARTITION \n") );
    	if (info.dwPartitionFlags & SAFTL_FAST_PARTITION)
          DinfoPrint( EX_TEXT("   Partition flags       :  TYPE B PARTITION \n") );
   	    if (info.dwPartitionFlags & SAFTL_NO_MATCHING)
          DinfoPrint( EX_TEXT("   Partition flags       :  TYPE C PARTITION \n") );

      /*
	   	if (info.dwPartitionFlags & SAFTL_RUGGEDIZED)
        DinfoPrint( EX_TEXT("   Partition flags       :  RUGGEDIZED \n") );
		  if (info.dwPartitionFlags & SAFTL_BINARY)
		DinfoPrint( EX_TEXT("   Partition flags       :  BINARY \n") );
	  */
	} /* End if extra information should be displayed */
  } /* End loop over partitions */
  DinfoPrint( EX_TEXT("\n"));
  if (part_cnt%2)
  {
  }
  return Status;
}


void  PrintProtectionType( EXWORD pType )
{
  if( pType & PROTECTABLE )
    DinfoPrint( EX_TEXT("/Protectable"));

  if( pType & READ_PROTECTED )
    DinfoPrint( EX_TEXT("/Read Protected"));

  if( pType & WRITE_PROTECTED )
    DinfoPrint( EX_TEXT("/Write Protected"));

  if( pType & LOCK_ENABLED )
    DinfoPrint( EX_TEXT("/Lock Enabled"));

  if( pType & LOCK_ASSERTED )
    DinfoPrint( EX_TEXT("/Lock Asserted"));

  if( pType & KEY_INSERTED )
    DinfoPrint( EX_TEXT("/Key Inserted"));

  if( pType & CHANGEABLE_PROTECTION )
    DinfoPrint( EX_TEXT("/Changeable"));


  if( pType & OTW_PROTECTED )
    DinfoPrint( EX_TEXT("/OTW Protected"));

  if( pType & STICKY_LOCK_ASSERTED )
    DinfoPrint( EX_TEXT("/Sticky lock active"));

  DinfoPrint( EX_TEXT("\n"));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -