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

📄 cmdline.c

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

extern dword DOCAddress;
extern dword DOCLowAddress;
extern dword DOCHighAddress;
extern EXCHAR *exUtilCommands[];
extern EXBYTE bPrintLevel;
#ifdef ENVIRONMENT_VARS
extern unsigned char flUse8Bit;
#endif

EXDWORD  ext_busConfig=0;

byte LogFileName[MAX_NAME];
byte ImgFileName[MAX_NAME];

/*------------------------------------------------------------------*/
void PrintUsage(void)
{

  DinfoPrint( EX_TEXT("\nUsage: Dinfo [/flags]\n"));
  DinfoPrint( EX_TEXT("    /WIN:address   - DISKONCHIP WINDOW ADDRESS\n"));
  DinfoPrint( EX_TEXT("    /WINL:address  - DISKONCHIP LOW LIMIT WINDOW ADDRESS\n"));
  DinfoPrint( EX_TEXT("    /WINH:address  - DISKONCHIP HIGH LIMIT WINDOW ADDRESS\n"));
  DinfoPrint( EX_TEXT("    /SHIFT:shift    - THE ADDRESS BUS SHIFT (0,1,2)\n"));
  DinfoPrint( EX_TEXT("    /WIDTH:data bus - THE AVAILABLE DATA BUS WIDTH (any combination of 8,16,32)\n"));
  DinfoPrint( EX_TEXT("    /BBT           - GET INFORMATION ABOUT THE BAD BLOCK TABLE\n"));
  DinfoPrint( EX_TEXT("    /IPL           - GET INFORMATION ABOUT THE IPL\n"));
  DinfoPrint( EX_TEXT("    /OTP           - GET INFORMATION ABOUT THE CUSTOMER OTP\n"));
  DinfoPrint( EX_TEXT("    /BDK           - GET INFORMATION ABOUT THE BINARY PARTITION\n"));
  DinfoPrint( EX_TEXT("    /BDTL          - GET INFORMATION ABOUT THE BDTL PARTITION\n"));
/*  DinfoPrint( EX_TEXT("    /EXB           - GET INFORMATION ABOUT THE FIRMWARE\n")); */
/*  DinfoPrint( EX_TEXT("    /REG           - GET INFORMATION ABOUT THE REGISTERS\n")); */
/*  DinfoPrint( EX_TEXT("    /MORE          - PRINT ONE PAGE SCREEN AT A TIME\n")); */
  DinfoPrint( EX_TEXT("    /LOG:logfile   - SAVE THE INFORMATION IN A LOG FILE\n"));
  DinfoPrint( EX_TEXT("    /H (or) ?      - PRINT HELP SCREEN\n"));
/*  DinfoPrint( EX_TEXT("    /CFG           - GET INFORMATION ABOUT THE DISKONCHIP CONFIGURATION\n")); */
/*  DinfoPrint( EX_TEXT("    /IMG:imgfile   - WORK WITH IMAGE FILE\n")); */
/*  DinfoPrint( EX_TEXT("    /PRINT:number  - OUTPUT LEVEL, BETWEEN 0 TO 3\n")); */
}


/*------------------------------------------------------------------*/
void InitCmdLine()
{

  /*
   * initialize the Media struct variable
   */
  ExMemSet( &Media, 0x00, sizeof( Media_t) );
  Media.MediaSize = -1;
  /*
   * initialize the Option struct variable
   */
  ExMemSet( &Option, 0x00, sizeof( Option_t ) );

  Option.LogFileName = NULL;
  Option.LogFileHandle = -1;
  Option.ImageFile.ImgFileSize = 0;
  Option.ImageFile.ImgFileName = NULL;
  Option.Moreflag = EXFALSE;
  Option.Extraflag = EXFALSE;
}



/*------------------------------------------------------------------*/
ExStatus AnalyzeCmdLine()
{
  EXBYTE							iArgc;
  CommandLineStruct		cmlRecord;
  EXCHAR*             err = EXNULL;


  InitCmdLine();

  for( iArgc = 0 ; iArgc < exArgc ; iArgc++ )
  {
    if( ParseCommandLine( &cmlRecord, iArgc, exUtilCommands ) != EX_OK )
      return EX_COMMAND_LINE_ERROR;

    if( cmlRecord.bCommandNumber == 0xff )
      return EX_COMMAND_LINE_ERROR;

    if( ( cmlRecord.fSlash == EXFALSE ) && ExMemCmp( cmlRecord.pCommand, "?", 1 ) != 0 )
      return EX_COMMAND_LINE_ERROR;

    ExMakeUpperCase( cmlRecord.pCommand );

	 if( ExMemCmp( cmlRecord.pCommand, "LOG:", 4 ) == 0 )
    {
      /* malloc removed :  Option.LogFileName = ( EXBYTE* )ExMemAlloc( MAX_NAME ); */
		Option.LogFileName = &LogFileName[0];
      ExMemCpy( Option.LogFileName, cmlRecord.pArg, cmlRecord.bArgLen + 1 );
    }

    else if( ExMemCmp( cmlRecord.pCommand, "BBT", 3 ) == 0 )
    {
      Option.BBTflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "SHIFT:", 6 ) == 0 )
    {
       EXDWORD dwTmp = ExAtoi( &(exArgv[iArgc][7]) );

       switch(dwTmp)
       {
          case 0 :
             Option.busConfig |= FL_NO_ADDR_SHIFT;
             break;
          case 1:
             Option.busConfig |= FL_SINGLE_ADDR_SHIFT;
             break;
          case 2:
             Option.busConfig |= FL_DOUBLE_ADDR_SHIFT;
             break;
          default:
             return EX_COMMAND_LINE_ERROR;
       }
    }

    else if( ExMemCmp( cmlRecord.pCommand, "WIDTH:", 6 ) == 0 )
    {
       EXDWORD dwTmp = ExAtoi( &(exArgv[iArgc][7]) );
       if(dwTmp&8)
       {
          Option.busConfig |= FL_BUS_HAS_8BIT_ACCESS;
       }

       if(dwTmp&16)
       {
          Option.busConfig |= FL_BUS_HAS_16BIT_ACCESS;
       }

       if(dwTmp&32)
       {
             Option.busConfig |= FL_BUS_HAS_32BIT_ACCESS;
       }
    }

    else if( ExMemCmp( cmlRecord.pCommand, "IPL", 3 ) == 0 )
    {
      Option.IPLflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "OTP", 3 ) == 0 )
    {
      Option.OTPflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "CFG", 3 ) == 0 )
    {
      Option.CFGflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "BDK", 3 ) == 0 )
    {
      Option.BDKflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "BDTL", 4 ) == 0 )
    {
      Option.BDTLflag = 1;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "EXB", 3 ) == 0 )
    {
      Option.EXBflag = 1;
    }

		else if( ExMemCmp( cmlRecord.pCommand, "REG", 3 ) == 0 )
    {
      Option.REGflag = 1;
    }

		else if( ExMemCmp( cmlRecord.pCommand, "EXTRA", 5 ) == 0 )
    {
      Option.Extraflag = EXTRUE;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "WINL", 4 ) == 0 )
    {
		Option.DocLowLimit = ExStrtol( cmlRecord.pArg, &err, 16 ) ;
      DOCLowAddress = Option.DocLowLimit;
		/* if DOCHighAddress was set , and DOCLowAddress < DOCHighAddress */
		/* its an error.																	*/
		if ((DOCHighAddress != 0) && (DOCLowAddress > DOCHighAddress))
			return EX_LOW_LIMIT_BIGGER_THAN_HIGH_LIMIT_ERROR;
    }
    else if( ExMemCmp( cmlRecord.pCommand, "WINH", 4 ) == 0 )
    {
		Option.DocHighLimit = ExStrtol( cmlRecord.pArg, &err, 16 ) ;
      DOCHighAddress = Option.DocHighLimit;
		/* if DOCHighAddress was set , and DOCLowAddress < DOCHighAddress */
		/* its an error.																	*/
		if ((DOCLowAddress != 0) && (DOCLowAddress > DOCHighAddress))
			return EX_LOW_LIMIT_BIGGER_THAN_HIGH_LIMIT_ERROR;
    }
    else if( ExMemCmp( cmlRecord.pCommand, "WIN", 3 ) == 0 )
    {

		  Option.DocWindow = ExStrtol( cmlRecord.pArg, &err, 16 ) ;

      /* prev implementation assumed segment was entered and shifted it 4 times left */
      /* Option.DocWindow = ExStrtol( cmlRecord.pArg, &err, 16 ) << 4; */
      DOCAddress = Option.DocWindow;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "IMG:", 4 ) == 0 )
    {
      /* malloc removed : Option.ImageFile.ImgFileName = ( EXBYTE* )ExMemAlloc( MAX_NAME ); */
		Option.ImageFile.ImgFileName = &ImgFileName[0];
      ExMemCpy( Option.ImageFile.ImgFileName, cmlRecord.pArg, cmlRecord.bArgLen + 1 );
    }

    /* print level */
    else if ( ExMemCmp( cmlRecord.pCommand, "LEVEL:", 6 ) == 0 )
    {
       /* Option.OutputLevel = exArgv[iArgc][7] - '0'; */
       Option.OutputLevel = (FLByte) ExAtoi( &(exArgv[iArgc][7]) );
       bPrintLevel = Option.OutputLevel;
	   if (bPrintLevel > 63)
       {
            DinfoPrint( EX_TEXT(" print level should be between 0 and 63 .\n"));
            return EX_COMMAND_LINE_ERROR;
       }


    }

    /* fast */
    else if ( ExMemCmp( cmlRecord.pCommand, "FAST", 4 ) == 0 )
    {
#ifdef ENVIRONMENT_VARS
        flUse8Bit=0;
#endif
    }


    else if( ExMemCmp( cmlRecord.pCommand, "MORE", 4 ) == 0 )
    {
      Option.Moreflag = TRUE;
    }

    else if( ExMemCmp( cmlRecord.pCommand, "H", 1 ) == 0 )
    {
      return EX_HELP_SCREEN_ERROR;
    }

    else
    {
      return EX_COMMAND_LINE_ERROR;

    }
	}

	return EX_OK;
}

⌨️ 快捷键说明

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