From 2ef2b01e07c02db339f34004445734a2dbdd80e1 Mon Sep 17 00:00:00 2001 From: AJFISH Date: Sun, 6 Dec 2009 01:57:05 +0000 Subject: Adding support for BeagleBoard. ArmPkg - Supoprt for ARM specific things that can change as the architecture changes. Plus semihosting JTAG drivers. EmbeddedPkg - Generic support for an embeddded platform. Including a light weight command line shell. BeagleBoardPkg - Platform specifics for BeagleBoard. SD Card works, but USB has issues. Looks like a bug in the open source USB stack (Our internal stack works fine). git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9518 6f19259b-4bc3-4df7-8a09-765794883524 --- EmbeddedPkg/EblExternCmd/EntryPointGlue.c | 152 ++++++++++++++++++++++++++++++ EmbeddedPkg/EblExternCmd/Main.c | 52 ++++++++++ 2 files changed, 204 insertions(+) create mode 100644 EmbeddedPkg/EblExternCmd/EntryPointGlue.c create mode 100644 EmbeddedPkg/EblExternCmd/Main.c (limited to 'EmbeddedPkg/EblExternCmd') diff --git a/EmbeddedPkg/EblExternCmd/EntryPointGlue.c b/EmbeddedPkg/EblExternCmd/EntryPointGlue.c new file mode 100644 index 0000000000..1e26fb5159 --- /dev/null +++ b/EmbeddedPkg/EblExternCmd/EntryPointGlue.c @@ -0,0 +1,152 @@ +/** @file + Glue code that contains the EFI entry point and converts it to an EBL + ASCII Argc, Argv sytle entry point + + + Copyright (c) 2007, Intel Corporation
+ Portions copyright (c) 2008-2009, Apple Inc. All rights reserved. + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +**/ + +#define CMD_SEPERATOR ';' +#define MAX_ARGS 32 + +EFI_STATUS +EblMain ( + IN UINTN Argc, + IN CHAR8 **Argv + ); + + +/// +/// EdkExternCmdEntry() & ParseArguments() convert the standard EFI entry point +/// into Argc, Argv form that calls EblMain(). +/// + + +/** + Parse the CmdLine and break it up into Argc (arg count) and Argv (array of + pointers to each argument). The Cmd buffer is altered and seperators are + converted to string terminators. This allows Argv to point into CmdLine. + A CmdLine can support multiple commands. The next command in the command line + is returned if it exists. + + @param CmdLine String to parse for a set of commands + @param CmdLineSize Size of CmdLine in bytes + @param Argc Returns the number of arguments in the CmdLine current command + @param Argv Argc pointers to each string in CmdLine + + @return Next Command in the command line or NULL if non exists +**/ +VOID +ParseArguments ( + IN CHAR8 *CmdLine, + IN UINTN CmdLineSize, + OUT UINTN *Argc, + OUT CHAR8 **Argv + ) +{ + UINTN Arg; + CHAR8 *Char; + BOOLEAN LookingForArg; + BOOLEAN InQuote; + UINTN Index; + + *Argc = 0; + if ((CmdLineSize == 0) || (AsciiStrLen (CmdLine) == 0)) { + // basic error checking failed on the arguments + return; + } + + // Walk a single command line. A CMD_SEPERATOR allows mult commands on a single line + InQuote = FALSE; + LookingForArg = TRUE; + for (Char = CmdLine, Arg = 0, Index = 0; *Char != '\0' && *Char != CMD_SEPERATOR; Char++, Index++) { + // Perform any text coversion here + if (*Char == '\t') { + // TAB to space + *Char = ' '; + } + + if (LookingForArg) { + // Look for the beging of an Argv[] entry + if (*Char == '"') { + Argv[Arg++] = ++Char; + LookingForArg = FALSE; + InQuote = TRUE; + } else if (*Char != ' ') { + Argv[Arg++] = Char; + LookingForArg = FALSE; + } + } else { + // Looking for the terminator of an Argv[] entry + if ((InQuote && (*Char == '"')) || (!InQuote && (*Char == ' '))) { + *Char = '\0'; + LookingForArg = TRUE; + } + } + + if ((Arg >= MAX_ARGS) || (Index > CmdLineSize)) { + // Error check buffer and exit since it does not look valid + break; + } + } + + *Argc = Arg; + + if (*Char == CMD_SEPERATOR) { + // Replace the command delimeter with null + *Char = '\0'; + } + + return; +} + + + + +/** + Embedded Boot Loader (EBL) - A simple EFI command line application for embedded + devices. PcdEmbeddedAutomaticBootCommand is a complied in commnad line that + gets executed automatically. The ; seperator allows multiple commands + for each command line. + + @param ImageHandle EFI ImageHandle for this application. + @param SystemTable EFI system table + + @return EFI status of the applicaiton + +**/ +EFI_STATUS +EFIAPI +EdkExternCmdEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_LOADED_IMAGE_PROTOCOL *ImageInfo; + UINTN Argc; + CHAR8 *Argv[MAX_ARGS]; + + Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&ImageInfo); + if (EFI_ERROR (Status)) { + Argc = 0; + } else { + // Looks like valid commands were passed in. + ParseArguments (ImageInfo->LoadOptions, ImageInfo->LoadOptionsSize, &Argc, Argv); + } + + return EblMain (Argc, Argv); +} + + diff --git a/EmbeddedPkg/EblExternCmd/Main.c b/EmbeddedPkg/EblExternCmd/Main.c new file mode 100644 index 0000000000..04f1eab600 --- /dev/null +++ b/EmbeddedPkg/EblExternCmd/Main.c @@ -0,0 +1,52 @@ +/** @file + Example of an external EBL command. It's loaded via EBL start command. + Argc and Argv are passed in via "" of the EBL command line. + + Start fs0:\EdkExternCmd.efi "Argv[0] Argv[1] 2" + + will launch this command with + Argv[0] = "Argv[0]" + Argv[1] = "Argv[2]" + Argv[2] = "3" + + Copyright (c) 2007, Intel Corporation
+ Portions copyright (c) 2008-2009, Apple Inc. All rights reserved. + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + +**/ + + +/** + Entry point with Argc, Argv. Put your code here. + + @param Argc Number of command arguments in Argv + @param Argv Array of strings that represent the parsed command line. + Argv[0] is the comamnd name + + @return EFI_SUCCESS + +**/ +EFI_STATUS +EblMain ( + IN UINTN Argc, + IN CHAR8 **Argv + ) +{ + UINTN Index; + + AsciiPrint ("Hello World\n"); + for (Index = 0; Index < Argc; Index++) { + AsciiPrint ("Argv[%d] = %a\n", Index, Argv[Index]); + } + + return EFI_SUCCESS; +} + -- cgit v1.2.3