Example #1
0
/**
  Attempt to print help from a dynamically added command.

  @param[in]  CommandToGetHelpOn  The unicode name of the command that help is
                                  requested on.
  @param[in]  SectionToGetHelpOn  Pointer to the section specifier(s).
  @param[in]  PrintCommandText    Print the command followed by the help content
                                  or just help.

  @retval EFI_SUCCESS             The help was displayed
  @retval EFI_NOT_FOUND           The command name could not be found
  @retval EFI_DEVICE_ERROR        The help data format was incorrect.
**/
EFI_STATUS
EFIAPI
PrintDynamicCommandHelp(
  IN CHAR16  *CommandToGetHelpOn,
  IN CHAR16  *SectionToGetHelpOn,
  IN BOOLEAN  PrintCommandText
 )
{
  EFI_STATUS                          Status;
  BOOLEAN                             Found;
  EFI_HANDLE                          *CommandHandleList;
  EFI_HANDLE                          *NextCommand;
  EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL  *DynamicCommand;

  Status = EFI_NOT_FOUND;
  Found = FALSE;
  CommandHandleList = NULL;

  CommandHandleList = GetHandleListByProtocol(&gEfiShellDynamicCommandProtocolGuid);

  if (CommandHandleList == NULL) {
    //
    // not found or out of resources
    //
    return Status;
  }

  for (NextCommand = CommandHandleList; *NextCommand != NULL; NextCommand++) {
    Status = gBS->HandleProtocol(
      *NextCommand,
      &gEfiShellDynamicCommandProtocolGuid,
      (VOID **)&DynamicCommand
      );

    if (EFI_ERROR(Status)) {
      continue;
    }

    //
    // Check execution break flag when printing multiple command help information.
    //
    if (ShellGetExecutionBreakFlag ()) {
      break;
    }

    if ((gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, CommandToGetHelpOn)) ||
      (gEfiShellProtocol->GetAlias (CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {
      // Print as Shell Help if in ManPage format.
      Status = ShellPrintHelp (DynamicCommand->CommandName, SectionToGetHelpOn,
                              PrintCommandText);
      if (Status == EFI_DEVICE_ERROR) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV),
                        gShellLevel3HiiHandle, DynamicCommand->CommandName);
      } else if (EFI_ERROR(Status)) {
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF),
                        gShellLevel3HiiHandle, DynamicCommand->CommandName);
      } else {
        Found = TRUE;
      }
    }
  }

  return (Found ? EFI_SUCCESS : Status);

}
EFI_STATUS
GpioE6xxMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
  CONST CHAR16 * Command;
  UINTN CommandIndex;
  UINT64 ControllerNumber;
  BOOLEAN DisplayHelp;
  UINTN GpioBaseAddress;
  UINT64 MaxPortNumber;
  UINT64 PortNumber;
  EFI_STATUS Status;
  UINT64 Value;

  //
  //  Validate the arrays
  //
  ASSERT ( DIM ( mMaxPorts ) == DIM ( mPortType ));
  ASSERT ( DIM ( mMaxPorts ) == DIM ( mPinNames ));

  //
  //  Get the HII handle
  //
  GpioE6xxGetHiiHandle ( );
  ASSERT ( NULL != gGpioE6xxHiiHandle );

  //
  //  Assume success
  //
  Status = EFI_SUCCESS;
  DisplayHelp = (BOOLEAN)( 2 > Argc );

  //
  //  Determinte the command index
  //
  Command = NULL;
  PortNumber = (UINT64)-1;
  Value = 0;
  CommandIndex = DIM ( mCommands );
  if ( !DisplayHelp ) {
    for ( CommandIndex = 0; DIM ( mCommands ) > CommandIndex; CommandIndex += 1 ) {
      Command = mCommands [ CommandIndex ].Command;
      if ( 0 == StrCmp ( Argv [ 1 ], Command )) {
        break;
      }
    }
    if ( DIM ( mCommands ) <= CommandIndex ) {
      ShellPrintHiiEx ( -1,
                        -1,
                        NULL,
                        STRING_TOKEN (STR_UNSUPPORTED_COMMAND),
                        gGpioE6xxHiiHandle );
      DisplayHelp = TRUE;
      Status = EFI_UNSUPPORTED;
    }
    else {
      //
      //  Validate the parameter count
      //
      if ( Argc > ( 2 + mCommands [ CommandIndex ].MaxParameters )) {
        ShellPrintHiiEx ( -1,
                          -1,
                          NULL,
                          STRING_TOKEN (STR_TOO_MANY_PARAMETERS),
                          gGpioE6xxHiiHandle );
        DisplayHelp = TRUE;
        Status = EFI_INVALID_PARAMETER;
      }
      else if ( Argc < ( 2 + mCommands [ CommandIndex ].RequiredParameters )) {
        ShellPrintHiiEx ( -1,
                          -1,
                          NULL,
                          STRING_TOKEN (STR_TOO_FEW_PARAMETERS),
                          gGpioE6xxHiiHandle );
        DisplayHelp = TRUE;
        Status = EFI_INVALID_PARAMETER;
      }
    }
  }

  //
  //  Get the controller number
  //
  MaxPortNumber = 0;
  ControllerNumber = DIM ( mMaxPorts );
  if ( 3 <= Argc ) {
    Status = ShellConvertStringToUint64 ( Argv [ 2 ], &ControllerNumber, FALSE, FALSE );
    if ( EFI_ERROR ( Status )) {
      ShellPrintHiiEx ( -1,
                        -1,
                        NULL,
                        STRING_TOKEN (STR_BAD_CONTROLLER_NUMBER),
                        gGpioE6xxHiiHandle,
                        Status );
      DisplayHelp = TRUE;
    }
    else {
      if ( DIM ( mMaxPorts ) <= ControllerNumber )
      {
        ShellPrintHiiEx ( -1,
                          -1,
                          NULL,
                          STRING_TOKEN (STR_INVALID_CONTROLLER),
                          gGpioE6xxHiiHandle,
                          DIM ( mMaxPorts ));
        Status = EFI_INVALID_PARAMETER;
      }
      else {
        MaxPortNumber = mMaxPorts [ ControllerNumber ];
      }
    }
  }
//Print ( L"ControllerNumber: %d\r\n", ControllerNumber );
//Print ( L"MaxPortNumber: %d\r\n", MaxPortNumber );

  //
  //  Get the port number
  //
  if ( 4 <= Argc ) {
    Status = ShellConvertStringToUint64 ( Argv [ 3 ], &PortNumber, FALSE, FALSE );
    if ( EFI_ERROR ( Status )) {
      ShellPrintHiiEx ( -1,
                        -1,
                        NULL,
                        STRING_TOKEN (STR_BAD_PORT_NUMBER),
                        gGpioE6xxHiiHandle,
                        Status );
      DisplayHelp = TRUE;
    }
    else {
      if ( MaxPortNumber <= PortNumber ) {
        ShellPrintHiiEx ( -1,
                          -1,
                          NULL,
                          STRING_TOKEN (STR_INVALID_PORT),
                          gGpioE6xxHiiHandle,
                          MaxPortNumber );
        Status = EFI_INVALID_PARAMETER;
      }
    }
  }
//Print ( L"PortNumber: %d\r\n", PortNumber );

  //
  //  Get the new value
  //
  if ( 5 <= Argc ) {
    Status = ShellConvertStringToUint64 ( Argv [ 4 ], &Value, FALSE, FALSE );
    if ( EFI_ERROR ( Status )) {
      ShellPrintHiiEx ( -1,
                        -1,
                        NULL,
                        STRING_TOKEN (STR_BAD_VALUE),
                        gGpioE6xxHiiHandle,
                        Status );
      DisplayHelp = TRUE;
    }
    else if ( 1 < Value ) {
      ShellPrintHiiEx ( -1,
                        -1,
                        NULL,
                        STRING_TOKEN (STR_UNSUPPORTED_VALUE),
                        gGpioE6xxHiiHandle );
      DisplayHelp = TRUE;
      Status = EFI_INVALID_PARAMETER;
    }
  }
//Print ( L"Value: %d\r\n", Value );

  //
  //  Display the help text
  //
  if ( DisplayHelp ) {
    ShellPrintHelp ( Argv [ 0 ], NULL, FALSE );
/*
    ShellPrintHiiEx ( -1,
                      -1,
                      NULL,
                      STRING_TOKEN (STR_GET_HELP_GPIO_E6XX),
                      gGpioE6xxHiiHandle );
*/
  }
  
  //
  //  Exit for help or errors
  //
  if (( !DisplayHelp ) && ( !EFI_ERROR ( Status ))) {
    //
    //  Process the command
    //
    if ( 0 == StrCmp ( L"addr", Command )) {
      Status = E6xxGpioBaseAddress ( ControllerNumber, &GpioBaseAddress );
      if ( !EFI_ERROR ( Status )) {
        Print ( L"GPIO base address: 0x%016Lx\r\n", (UINT64)GpioBaseAddress );
      }
    }
    else if ( 0 == StrCmp ( L"config", Command )) {
      if ( -1 == PortNumber ) {
        //
        //  Display the configuration for all of the GPIO ports
        //
        for ( PortNumber = 0; mMaxPorts [ ControllerNumber ] > PortNumber; PortNumber += 1 ) {
          Status = GpioE6xxConfig ( ControllerNumber,
                                    PortNumber,
                                    mPortType [ ControllerNumber ],
                                    ( mPinNames [ ControllerNumber ]) [ PortNumber ]);
          if ( EFI_ERROR ( Status )) {
            break;
          }
        }
      }
      else {
        //
        //  Display the configuration for the specific GPIO port
        //
        Status = GpioE6xxConfig ( ControllerNumber,
                                  PortNumber,
                                  mPortType [ ControllerNumber ],
                                  ( mPinNames [ ControllerNumber ]) [ PortNumber ]);
      }
    }
    else if ( 0 == StrCmp ( L"dir", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioDirectionInput ( ControllerNumber,
                                                         PortNumber )
                              : E6xxGpioDirectionOutput ( ControllerNumber,
                                                          PortNumber );
    }
    else if ( 0 == StrCmp ( L"gpe", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioGpeEnable ( ControllerNumber,
                                                    PortNumber )
                              : E6xxGpioGpeDisable ( ControllerNumber,
                                                     PortNumber );
    }
    else if ( 0 == StrCmp ( L"neg", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioNegativeEdgeEnable ( ControllerNumber,
                                                             PortNumber )
                              : E6xxGpioNegativeEdgeDisable ( ControllerNumber,
                                                              PortNumber );
    }
    else if ( 0 == StrCmp ( L"output", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioOutputSet ( ControllerNumber,
                                                    PortNumber )
                              : E6xxGpioOutputClear ( ControllerNumber,
                                                      PortNumber );
    }
    else if ( 0 == StrCmp ( L"port", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioPortEnable ( ControllerNumber,
                                                     PortNumber )
                              : E6xxGpioPortDisable ( ControllerNumber,
                                                      PortNumber );
    }
    else if ( 0 == StrCmp ( L"pos", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioPositiveEdgeEnable ( ControllerNumber,
                                                             PortNumber )
                              : E6xxGpioPositiveEdgeDisable ( ControllerNumber,
                                                              PortNumber );
    }
    else if ( 0 == StrCmp ( L"smi", Command )) {
      Status = ( 0 != Value ) ? E6xxGpioSmiEnable ( ControllerNumber,
                                                    PortNumber )
                              : E6xxGpioSmiDisable ( ControllerNumber,
                                                     PortNumber );
    }
  }

  //
  //  Return the command status
  //
  return (INTN)Status;
}
Example #3
0
/**
  Function for 'help' command.

  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
**/
SHELL_STATUS
EFIAPI
ShellCommandRunHelp (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  EFI_STATUS          Status;
  LIST_ENTRY          *Package;
  CHAR16              *ProblemParam;
  SHELL_STATUS        ShellStatus;
  CONST COMMAND_LIST  *CommandList;
  CONST COMMAND_LIST  *Node;
  CHAR16              *CommandToGetHelpOn;
  CHAR16              *SectionToGetHelpOn;
  CHAR16              *HiiString;
  BOOLEAN             Found;
  BOOLEAN             PrintCommandText;

  PrintCommandText    = TRUE;
  ProblemParam        = NULL;
  ShellStatus         = SHELL_SUCCESS;
  CommandToGetHelpOn  = NULL;
  SectionToGetHelpOn  = NULL;
  Found               = FALSE;

  //
  // initialize the shell lib (we must be in non-auto-init...)
  //
  Status = ShellInitialize();
  ASSERT_EFI_ERROR(Status);

  Status = CommandInit();
  ASSERT_EFI_ERROR(Status);

  //
  // parse the command line
  //
  Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
  if (EFI_ERROR(Status)) {
    if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"help", ProblemParam);  
      FreePool(ProblemParam);
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      ASSERT(FALSE);
    }
  } else {
    //
    // Check for conflicting parameters.
    //
    if (ShellCommandLineGetFlag(Package, L"-usage")
      &&ShellCommandLineGetFlag(Package, L"-section")
      &&(ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v"))
     ){
      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle, L"help");  
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {
      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"help");  
      ShellStatus = SHELL_INVALID_PARAMETER;
    } else {
      //
      // Get the command name we are getting help on
      //
      ASSERT(CommandToGetHelpOn == NULL);
      StrnCatGrow(&CommandToGetHelpOn, NULL, ShellCommandLineGetRawValue(Package, 1), 0);
      if (CommandToGetHelpOn == NULL && ShellCommandLineGetFlag(Package, L"-?")) {
        //
        // If we dont have a command and we got a simple -?
        // we are looking for help on help command.
        //
        StrnCatGrow(&CommandToGetHelpOn, NULL, L"help", 0);
      }

      if (CommandToGetHelpOn == NULL) {
        StrnCatGrow(&CommandToGetHelpOn, NULL, L"*", 0);
        ASSERT(SectionToGetHelpOn == NULL);
        StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);
      } else {
        PrintCommandText = FALSE;
        ASSERT(SectionToGetHelpOn == NULL);
        //
        // Get the section name for the given command name
        //
        if (ShellCommandLineGetFlag(Package, L"-section")) {
          StrnCatGrow(&SectionToGetHelpOn, NULL, ShellCommandLineGetValue(Package, L"-section"), 0);
        } else if (ShellCommandLineGetFlag(Package, L"-usage")) {
          StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS", 0);
        } else if (ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v")) {
        } else {
          //
          // The output of help <command> will display NAME, SYNOPSIS, OPTIONS, DESCRIPTION, and EXAMPLES sections.
          //
          StrnCatGrow (&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS,OPTIONS,DESCRIPTION,EXAMPLES", 0);
        }
      }

      if (gUnicodeCollation->StriColl(gUnicodeCollation, CommandToGetHelpOn, L"special") == 0) {
        //
        // we need info on the special characters
        //
        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle);
        HiiString = HiiGetString(gShellLevel3HiiHandle, STRING_TOKEN(STR_HELP_SC_DATA), NULL);
        ShellPrintEx(-1, -1, L"%s", HiiString);
        FreePool(HiiString);
        Found = TRUE;
      } else {
        CommandList = ShellCommandGetCommandList(TRUE);
        ASSERT(CommandList != NULL);
        for ( Node = (COMMAND_LIST*)GetFirstNode(&CommandList->Link)
            ; CommandList != NULL && !IsListEmpty(&CommandList->Link) && !IsNull(&CommandList->Link, &Node->Link)
            ; Node = (COMMAND_LIST*)GetNextNode(&CommandList->Link, &Node->Link)
           ){
          //
          // Checking execution break flag when print multiple command help information.
          //
          if (ShellGetExecutionBreakFlag ()) {
            break;
          } 
          if ((gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, CommandToGetHelpOn)) ||
             (gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {
            //
            // We have a command to look for help on.
            //
            Status = ShellPrintHelp(Node->CommandString, SectionToGetHelpOn, PrintCommandText);
            if (Status == EFI_DEVICE_ERROR) {
                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, Node->CommandString);
            } else if (EFI_ERROR(Status)) {
                ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, Node->CommandString);
            } else {
                Found = TRUE;
            }
          }
        }

        //
        // now try to match against the dynamic command list and print help
        //
        Status = PrintDynamicCommandHelp (CommandToGetHelpOn, SectionToGetHelpOn,
                                          PrintCommandText);
        if (!EFI_ERROR(Status)) {
          Found = TRUE;
        }

        //
        // Search the .man file for Shell applications (Shell external commands).
        //
        if (!Found) {
          Status = ShellPrintHelp(CommandToGetHelpOn, SectionToGetHelpOn, FALSE);
          if (Status == EFI_DEVICE_ERROR) {
              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CommandToGetHelpOn);
          } else if (EFI_ERROR(Status)) {
              ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn);
          } else {
            Found = TRUE;
          }
        }
      }

      if (!Found) {
        ShellStatus = SHELL_NOT_FOUND;
      }

      //
      // free the command line package
      //
      ShellCommandLineFreeVarList (Package);
    }
  }

  if (CommandToGetHelpOn != NULL && StrCmp(CommandToGetHelpOn, L"*") == 0){
    //
    // If '*' then the command entered was 'Help' without qualifiers, This footer
    // provides additional info on help switches
    //
    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_FOOTER), gShellLevel3HiiHandle);
  }
  if (CommandToGetHelpOn != NULL) {
    FreePool(CommandToGetHelpOn);
  }
  if (SectionToGetHelpOn != NULL) {
    FreePool(SectionToGetHelpOn);
  }

  return (ShellStatus);
}