/** 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; }
/** 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); }