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
This commit is contained in:
70
BeagleBoardPkg/Bds/Bds.inf
Normal file
70
BeagleBoardPkg/Bds/Bds.inf
Normal file
@@ -0,0 +1,70 @@
|
||||
#%HEADER%
|
||||
#/** @file
|
||||
#
|
||||
# Component discription file for Bds module
|
||||
#
|
||||
# Copyright (c) 2009 Apple, Inc. All rights reserved.
|
||||
#
|
||||
# This document is the property of Apple, Inc.
|
||||
# It is considered confidential and proprietary.
|
||||
#
|
||||
# This document may not be reproduced or transmitted in any form,
|
||||
# in whole or in part, without the express written permission of
|
||||
# Apple, Inc.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = BeagleBoardBds
|
||||
FILE_GUID = 934431fe-5745-402e-913d-17b4434eb0f3
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = BdsInitialize
|
||||
|
||||
[Sources.common]
|
||||
BdsEntry.c
|
||||
FirmwareVolume.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
DevicePathLib
|
||||
BaseLib
|
||||
HobLib
|
||||
UefiRuntimeServicesTableLib
|
||||
ReportStatusCodeLib
|
||||
PerformanceLib
|
||||
DxeServicesTableLib
|
||||
MemoryAllocationLib
|
||||
UefiLib
|
||||
UefiBootServicesTableLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
PrintLib
|
||||
UefiDriverEntryPoint
|
||||
|
||||
[Guids]
|
||||
|
||||
|
||||
[Protocols]
|
||||
gEfiBdsArchProtocolGuid
|
||||
gEfiSimpleTextInProtocolGuid
|
||||
gEfiSimpleTextOutProtocolGuid
|
||||
gEfiSerialIoProtocolGuid
|
||||
gEfiDevicePathProtocolGuid
|
||||
gEfiSimpleFileSystemProtocolGuid
|
||||
gEfiUsbIoProtocolGuid
|
||||
gEfiFirmwareVolume2ProtocolGuid
|
||||
|
||||
|
||||
[FeaturePcd]
|
||||
|
||||
[FixedPcd]
|
||||
gEmbeddedTokenSpaceGuid.PcdPrePiStackSize
|
||||
|
||||
[Depex]
|
||||
TRUE
|
240
BeagleBoardPkg/Bds/BdsEntry.c
Normal file
240
BeagleBoardPkg/Bds/BdsEntry.c
Normal file
@@ -0,0 +1,240 @@
|
||||
/** @file
|
||||
The entry of the embedded BDS. This BDS does not follow the Boot Manager requirements
|
||||
of the UEFI specification as it is designed to implement an embedded systmes
|
||||
propriatary boot scheme.
|
||||
|
||||
This template assume a DXE driver produces a SerialIo protocol not using the EFI
|
||||
driver module and it will attempt to connect a console on top of this.
|
||||
|
||||
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.
|
||||
|
||||
**/
|
||||
|
||||
#include "BdsEntry.h"
|
||||
|
||||
|
||||
BOOLEAN gConsolePresent = FALSE;
|
||||
|
||||
|
||||
EFI_HANDLE mBdsImageHandle = NULL;
|
||||
EFI_BDS_ARCH_PROTOCOL gBdsProtocol = {
|
||||
BdsEntry,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
This function uses policy data from the platform to determine what operating
|
||||
system or system utility should be loaded and invoked. This function call
|
||||
also optionally make the use of user input to determine the operating system
|
||||
or system utility to be loaded and invoked. When the DXE Core has dispatched
|
||||
all the drivers on the dispatch queue, this function is called. This
|
||||
function will attempt to connect the boot devices required to load and invoke
|
||||
the selected operating system or system utility. During this process,
|
||||
additional firmware volumes may be discovered that may contain addition DXE
|
||||
drivers that can be dispatched by the DXE Core. If a boot device cannot be
|
||||
fully connected, this function calls the DXE Service Dispatch() to allow the
|
||||
DXE drivers from any newly discovered firmware volumes to be dispatched.
|
||||
Then the boot device connection can be attempted again. If the same boot
|
||||
device connection operation fails twice in a row, then that boot device has
|
||||
failed, and should be skipped. This function should never return.
|
||||
|
||||
@param This The EFI_BDS_ARCH_PROTOCOL instance.
|
||||
|
||||
@return None.
|
||||
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
BdsEntry (
|
||||
IN EFI_BDS_ARCH_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN NoHandles;
|
||||
EFI_HANDLE *Buffer;
|
||||
EFI_HANDLE FvHandle;
|
||||
EFI_HANDLE ImageHandle;
|
||||
EFI_HANDLE UsbDeviceHandle;
|
||||
EFI_GUID NameGuid;
|
||||
UINTN Size;
|
||||
UINTN HandleCount;
|
||||
UINTN OldHandleCount;
|
||||
EFI_HANDLE *HandleBuffer;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *LoadImageDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FileSystemDevicePath;
|
||||
|
||||
//
|
||||
// Now do the EFI stuff
|
||||
//
|
||||
Size = 0x100;
|
||||
gST->FirmwareVendor = AllocateRuntimePool (Size);
|
||||
ASSERT (gST->FirmwareVendor != NULL);
|
||||
|
||||
UnicodeSPrint (gST->FirmwareVendor, Size, L"BeagleBoard EFI %a %a", __DATE__, __TIME__);
|
||||
|
||||
//
|
||||
// Now we need to setup the EFI System Table with information about the console devices.
|
||||
// This code is normally in the console spliter driver on platforms that support multiple
|
||||
// consoles at the same time
|
||||
//
|
||||
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSimpleTextOutProtocolGuid, NULL, &NoHandles, &Buffer);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
// Use the first SimpleTextOut we find and update the EFI System Table
|
||||
gST->ConsoleOutHandle = Buffer[0];
|
||||
gST->StandardErrorHandle = Buffer[0];
|
||||
Status = gBS->HandleProtocol (Buffer[0], &gEfiSimpleTextOutProtocolGuid, (VOID **)&gST->ConOut);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
gST->StdErr = gST->ConOut;
|
||||
|
||||
gST->ConOut->OutputString (gST->ConOut, L"BDS: Console Started!!!!\n\r");
|
||||
FreePool (Buffer);
|
||||
|
||||
gConsolePresent = TRUE;
|
||||
}
|
||||
|
||||
|
||||
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSimpleTextInProtocolGuid, NULL, &NoHandles, &Buffer);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
// Use the first SimpleTextIn we find and update the EFI System Table
|
||||
gST->ConsoleInHandle = Buffer[0];
|
||||
Status = gBS->HandleProtocol (Buffer[0], &gEfiSimpleTextInProtocolGuid, (VOID **)&gST->ConIn);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
FreePool (Buffer);
|
||||
}
|
||||
|
||||
//
|
||||
// We now have EFI Consoles up and running. Print () will work now. DEBUG () and ASSERT () worked
|
||||
// prior to this point as they were configured to use a more primative output scheme.
|
||||
//
|
||||
|
||||
//
|
||||
//Perform Connect
|
||||
//
|
||||
HandleCount = 0;
|
||||
while (1) {
|
||||
OldHandleCount = HandleCount;
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
AllHandles,
|
||||
NULL,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (HandleCount == OldHandleCount) {
|
||||
break;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
//Locate handles for SimpleFileSystem protocol
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiSimpleFileSystemProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
//Get the device path
|
||||
FileSystemDevicePath = DevicePathFromHandle(HandleBuffer[Index]);
|
||||
if (FileSystemDevicePath == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//Check if UsbIo is on any handles in the device path.
|
||||
Status = gBS->LocateDevicePath(&gEfiUsbIoProtocolGuid, &FileSystemDevicePath, &UsbDeviceHandle);
|
||||
if (EFI_ERROR(Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//Check if Usb stick has a magic EBL file.
|
||||
LoadImageDevicePath = FileDevicePath(HandleBuffer[Index], L"Ebl.efi");
|
||||
Status = gBS->LoadImage (TRUE, gImageHandle, LoadImageDevicePath, NULL, 0, &ImageHandle);
|
||||
if (EFI_ERROR(Status)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//Boot to Shell on USB stick.
|
||||
Status = gBS->StartImage (ImageHandle, NULL, NULL);
|
||||
if (EFI_ERROR(Status)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Normal UEFI behavior is to process Globally Defined Variables as defined in Chapter 3
|
||||
// (Boot Manager) of the UEFI specification. For this embedded system we don't do this.
|
||||
//
|
||||
|
||||
//
|
||||
// Search all the FVs for an application with a UI Section of Ebl. A .FDF file can be used
|
||||
// to control the names of UI sections in an FV.
|
||||
//
|
||||
Status = FindApplicationMatchingUiSection (L"Ebl", &FvHandle, &NameGuid);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
|
||||
//Boot to Shell.
|
||||
Status = LoadPeCoffSectionFromFv (FvHandle, &NameGuid);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
DEBUG((EFI_D_ERROR, "Boot from Shell failed. Status: %r\n", Status));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// EFI does not define the behaviour if all boot attemps fail and the last one returns.
|
||||
// So we make a policy choice to reset the system since this BDS does not have a UI.
|
||||
//
|
||||
gRT->ResetSystem (EfiResetShutdown, Status, 0, NULL);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BdsInitialize (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
mBdsImageHandle = ImageHandle;
|
||||
|
||||
//
|
||||
// Install protocol interface
|
||||
//
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&mBdsImageHandle,
|
||||
&gEfiBdsArchProtocolGuid, &gBdsProtocol,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
65
BeagleBoardPkg/Bds/BdsEntry.h
Normal file
65
BeagleBoardPkg/Bds/BdsEntry.h
Normal file
@@ -0,0 +1,65 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>
|
||||
|
||||
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.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __BDS_ENTRY_H__
|
||||
#define __BDS_ENTRY_H__
|
||||
|
||||
#include <PiDxe.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/DxeServicesTableLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
|
||||
#include <Protocol/Bds.h>
|
||||
#include <Protocol/SerialIo.h>
|
||||
#include <Protocol/FirmwareVolume2.h>
|
||||
#include <Protocol/SimpleTextIn.h>
|
||||
#include <Protocol/SimpleTextOut.h>
|
||||
#include <Protocol/EmbeddedDevice.h>
|
||||
#include <Protocol/DevicePath.h>
|
||||
#include <Protocol/SimpleFileSystem.h>
|
||||
#include <Protocol/UsbIo.h>
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
LoadPeCoffSectionFromFv (
|
||||
IN EFI_HANDLE FvHandle,
|
||||
IN EFI_GUID *NameGuid
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
FindApplicationMatchingUiSection (
|
||||
IN CHAR16 *UiString,
|
||||
OUT EFI_HANDLE *FvHandle,
|
||||
OUT EFI_GUID *NameGuid
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
BdsEntry (
|
||||
IN EFI_BDS_ARCH_PROTOCOL *This
|
||||
);
|
||||
|
||||
#endif
|
||||
|
150
BeagleBoardPkg/Bds/FirmwareVolume.c
Normal file
150
BeagleBoardPkg/Bds/FirmwareVolume.c
Normal file
@@ -0,0 +1,150 @@
|
||||
/** @file
|
||||
The entry of the embedded BDS. This BDS does not follow the Boot Manager requirements
|
||||
of the UEFI specification as it is designed to implement an embedded systmes
|
||||
propriatary boot scheme.
|
||||
|
||||
This template assume a DXE driver produces a SerialIo protocol not using the EFI
|
||||
driver module and it will attempt to connect a console on top of this.
|
||||
|
||||
|
||||
Copyright (c) 2009 Apple, Inc. All rights reserved.
|
||||
Portions copyright (c) 2008-2009, Apple Inc. All rights reserved.
|
||||
|
||||
|
||||
This document is the property of Apple, Inc.
|
||||
It is considered confidential and proprietary.
|
||||
|
||||
This document may not be reproduced or transmitted in any form,
|
||||
in whole or in part, without the express written permission of
|
||||
Apple, Inc.
|
||||
|
||||
**/
|
||||
|
||||
#include "BdsEntry.h"
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
FindApplicationMatchingUiSection (
|
||||
IN CHAR16 *UiString,
|
||||
OUT EFI_HANDLE *FvHandle,
|
||||
OUT EFI_GUID *NameGuid
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS NextStatus;
|
||||
UINTN NoHandles;
|
||||
EFI_HANDLE *Buffer;
|
||||
UINTN Index;
|
||||
EFI_FV_FILETYPE FileType;
|
||||
EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
|
||||
VOID *Key;
|
||||
EFI_FV_FILE_ATTRIBUTES Attributes;
|
||||
UINTN Size;
|
||||
UINTN UiStringLen;
|
||||
CHAR16 *UiSection;
|
||||
UINT32 Authentication;
|
||||
|
||||
|
||||
UiStringLen = 0;
|
||||
if (UiString != NULL) {
|
||||
DEBUG ((DEBUG_ERROR, "UiString %s\n", UiString));
|
||||
UiStringLen = StrLen (UiString);
|
||||
}
|
||||
|
||||
Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, NULL, &NoHandles, &Buffer);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
for (Index = 0; Index < NoHandles; Index++) {
|
||||
Status = gBS->HandleProtocol (Buffer[Index], &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&Fv);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Key = AllocatePool (Fv->KeySize);
|
||||
ASSERT (Key != NULL);
|
||||
ZeroMem (Key, Fv->KeySize);
|
||||
|
||||
FileType = EFI_FV_FILETYPE_APPLICATION;
|
||||
|
||||
do {
|
||||
NextStatus = Fv->GetNextFile (Fv, Key, &FileType, NameGuid, &Attributes, &Size);
|
||||
if (!EFI_ERROR (NextStatus)) {
|
||||
if (UiString == NULL) {
|
||||
//
|
||||
// If UiString is NULL match first application we find.
|
||||
//
|
||||
*FvHandle = Buffer[Index];
|
||||
FreePool (Key);
|
||||
return Status;
|
||||
}
|
||||
|
||||
UiSection = NULL;
|
||||
Status = Fv->ReadSection (
|
||||
Fv,
|
||||
NameGuid,
|
||||
EFI_SECTION_USER_INTERFACE,
|
||||
0,
|
||||
(VOID **)&UiSection,
|
||||
&Size,
|
||||
&Authentication
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (StrnCmp (UiString, UiSection, UiStringLen) == 0) {
|
||||
//
|
||||
// We found a UiString match.
|
||||
//
|
||||
*FvHandle = Buffer[Index];
|
||||
FreePool (Key);
|
||||
FreePool (UiSection);
|
||||
return Status;
|
||||
}
|
||||
FreePool (UiSection);
|
||||
}
|
||||
}
|
||||
} while (!EFI_ERROR (NextStatus));
|
||||
|
||||
FreePool (Key);
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (Buffer);
|
||||
}
|
||||
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
EFI_DEVICE_PATH *
|
||||
FvFileDevicePath (
|
||||
IN EFI_HANDLE FvHandle,
|
||||
IN EFI_GUID *NameGuid
|
||||
)
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
MEDIA_FW_VOL_FILEPATH_DEVICE_PATH NewNode;
|
||||
|
||||
DevicePath = DevicePathFromHandle (FvHandle);
|
||||
|
||||
EfiInitializeFwVolDevicepathNode (&NewNode, NameGuid);
|
||||
|
||||
return AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&NewNode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
LoadPeCoffSectionFromFv (
|
||||
IN EFI_HANDLE FvHandle,
|
||||
IN EFI_GUID *NameGuid
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE ImageHandle;
|
||||
|
||||
DevicePath = FvFileDevicePath (FvHandle, NameGuid);
|
||||
|
||||
Status = gBS->LoadImage (TRUE, gImageHandle, DevicePath, NULL, 0, &ImageHandle);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = gBS->StartImage (ImageHandle, NULL, NULL);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
Reference in New Issue
Block a user