mirror of https://github.com/acidanthera/audk.git
ArmPlatformPkg/ArmVExpressPkg: Added Android FastBoot support
That includes an implementation of FASTBOOT_PLATFORM_PROTOCOL for ARM Versatile Express. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15317 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
d3f99770c0
commit
81f2915669
|
@ -133,6 +133,13 @@ READ_LOCK_STATUS = TRUE
|
||||||
#
|
#
|
||||||
INF EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
INF EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
||||||
|
|
||||||
|
#
|
||||||
|
# Android Fastboot
|
||||||
|
#
|
||||||
|
INF EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf
|
||||||
|
INF EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf
|
||||||
|
INF ArmPlatformPkg/ArmVExpressPkg/ArmVExpressFastBootDxe/ArmVExpressFastBootDxe.inf
|
||||||
|
|
||||||
# ACPI Support
|
# ACPI Support
|
||||||
INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
|
INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,13 @@ READ_LOCK_STATUS = TRUE
|
||||||
#
|
#
|
||||||
INF EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
INF EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
||||||
|
|
||||||
|
#
|
||||||
|
# Android Fastboot
|
||||||
|
#
|
||||||
|
INF EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf
|
||||||
|
INF EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf
|
||||||
|
INF ArmPlatformPkg/ArmVExpressPkg/ArmVExpressFastBootDxe/ArmVExpressFastBootDxe.inf
|
||||||
|
|
||||||
#
|
#
|
||||||
# UEFI application (Shell Embedded Boot Loader)
|
# UEFI application (Shell Embedded Boot Loader)
|
||||||
#
|
#
|
||||||
|
|
|
@ -323,12 +323,16 @@
|
||||||
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|20000
|
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiBootServicesData|20000
|
||||||
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|20
|
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderCode|20
|
||||||
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0
|
gEmbeddedTokenSpaceGuid.PcdMemoryTypeEfiLoaderData|0
|
||||||
|
|
||||||
|
# Device path of block device on which Android Fastboot should flash
|
||||||
|
# partitions. We just use the SD card on VExpress.
|
||||||
|
gArmVExpressTokenSpaceGuid.PcdAndroidFastbootNvmDevicePath|L"VenHw(09831032-6FA3-4484-AF4F-0A000A8D3A82)"
|
||||||
|
|
||||||
#
|
#
|
||||||
# ARM Pcds
|
# ARM Pcds
|
||||||
#
|
#
|
||||||
gArmTokenSpaceGuid.PcdArmUncachedMemoryMask|0x0000000000000000
|
gArmTokenSpaceGuid.PcdArmUncachedMemoryMask|0x0000000000000000
|
||||||
|
|
||||||
#
|
#
|
||||||
# ARM PrimeCell
|
# ARM PrimeCell
|
||||||
#
|
#
|
||||||
|
@ -377,3 +381,10 @@
|
||||||
|
|
||||||
# ISP1761 USB OTG Controller
|
# ISP1761 USB OTG Controller
|
||||||
EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
EmbeddedPkg/Drivers/Isp1761UsbDxe/Isp1761UsbDxe.inf
|
||||||
|
|
||||||
|
#
|
||||||
|
# Android Fastboot
|
||||||
|
#
|
||||||
|
EmbeddedPkg/Application/AndroidFastboot/AndroidFastbootApp.inf
|
||||||
|
EmbeddedPkg/Drivers/AndroidFastbootTransportUsbDxe/FastbootTransportUsbDxe.inf
|
||||||
|
ArmPlatformPkg/ArmVExpressPkg/ArmVExpressFastBootDxe/ArmVExpressFastBootDxe.inf
|
||||||
|
|
|
@ -0,0 +1,451 @@
|
||||||
|
/** @file
|
||||||
|
|
||||||
|
Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Implementation of the Android Fastboot Platform protocol, to be used by the
|
||||||
|
Fastboot UEFI application, for ARM Versatile Express platforms.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Protocol/AndroidFastbootPlatform.h>
|
||||||
|
#include <Protocol/BlockIo.h>
|
||||||
|
#include <Protocol/DiskIo.h>
|
||||||
|
|
||||||
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/DevicePathLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
|
||||||
|
#define FLASH_DEVICE_PATH_SIZE(DevPath) ( GetDevicePathSize (DevPath) - \
|
||||||
|
sizeof (EFI_DEVICE_PATH_PROTOCOL))
|
||||||
|
|
||||||
|
#define PARTITION_NAME_MAX_LENGTH 72/2
|
||||||
|
|
||||||
|
#define IS_ALPHA(Char) (((Char) <= L'z' && (Char) >= L'a') || \
|
||||||
|
((Char) <= L'Z' && (Char) >= L'Z'))
|
||||||
|
|
||||||
|
typedef struct _FASTBOOT_PARTITION_LIST {
|
||||||
|
LIST_ENTRY Link;
|
||||||
|
CHAR16 PartitionName[PARTITION_NAME_MAX_LENGTH];
|
||||||
|
EFI_HANDLE PartitionHandle;
|
||||||
|
} FASTBOOT_PARTITION_LIST;
|
||||||
|
|
||||||
|
STATIC LIST_ENTRY mPartitionListHead;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Helper to free the partition list
|
||||||
|
*/
|
||||||
|
STATIC
|
||||||
|
VOID
|
||||||
|
FreePartitionList (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FASTBOOT_PARTITION_LIST *Entry;
|
||||||
|
FASTBOOT_PARTITION_LIST *NextEntry;
|
||||||
|
|
||||||
|
Entry = (FASTBOOT_PARTITION_LIST *) GetFirstNode (&mPartitionListHead);
|
||||||
|
while (!IsNull (&mPartitionListHead, &Entry->Link)) {
|
||||||
|
NextEntry = (FASTBOOT_PARTITION_LIST *) GetNextNode (&mPartitionListHead, &Entry->Link);
|
||||||
|
|
||||||
|
RemoveEntryList (&Entry->Link);
|
||||||
|
FreePool (Entry);
|
||||||
|
|
||||||
|
Entry = NextEntry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Read the PartitionName fields from the GPT partition entries, putting them
|
||||||
|
into an allocated array that should later be freed.
|
||||||
|
*/
|
||||||
|
STATIC
|
||||||
|
EFI_STATUS
|
||||||
|
ReadPartitionEntries (
|
||||||
|
IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
|
||||||
|
OUT EFI_PARTITION_ENTRY **PartitionEntries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN EntrySize;
|
||||||
|
UINTN NumEntries;
|
||||||
|
UINTN BufferSize;
|
||||||
|
UINT32 MediaId;
|
||||||
|
EFI_PARTITION_TABLE_HEADER *GptHeader;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
MediaId = BlockIo->Media->MediaId;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Read size of Partition entry and number of entries from GPT header
|
||||||
|
//
|
||||||
|
|
||||||
|
GptHeader = AllocatePool (BlockIo->Media->BlockSize);
|
||||||
|
if (GptHeader == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = BlockIo->ReadBlocks (BlockIo, MediaId, 1, BlockIo->Media->BlockSize, (VOID *) GptHeader);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check there is a GPT on the media
|
||||||
|
if (GptHeader->Header.Signature != EFI_PTAB_HEADER_ID ||
|
||||||
|
GptHeader->MyLBA != 1) {
|
||||||
|
DEBUG ((EFI_D_ERROR,
|
||||||
|
"Fastboot platform: No GPT on flash. "
|
||||||
|
"Fastboot on Versatile Express does not support MBR.\n"
|
||||||
|
));
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntrySize = GptHeader->SizeOfPartitionEntry;
|
||||||
|
NumEntries = GptHeader->NumberOfPartitionEntries;
|
||||||
|
|
||||||
|
FreePool (GptHeader);
|
||||||
|
|
||||||
|
ASSERT (EntrySize != 0);
|
||||||
|
ASSERT (NumEntries != 0);
|
||||||
|
|
||||||
|
BufferSize = ALIGN_VALUE (EntrySize * NumEntries, BlockIo->Media->BlockSize);
|
||||||
|
*PartitionEntries = AllocatePool (BufferSize);
|
||||||
|
if (PartitionEntries == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = BlockIo->ReadBlocks (BlockIo, MediaId, 2, BufferSize, (VOID *) *PartitionEntries);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
FreePool (PartitionEntries);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Initialise: Open the Android NVM device and find the partitions on it. Save them in
|
||||||
|
a list along with the "PartitionName" fields for their GPT entries.
|
||||||
|
We will use these partition names as the key in
|
||||||
|
ArmFastbootPlatformFlashPartition.
|
||||||
|
*/
|
||||||
|
EFI_STATUS
|
||||||
|
ArmFastbootPlatformInit (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *FlashDevicePath;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *FlashDevicePathDup;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *NextNode;
|
||||||
|
HARDDRIVE_DEVICE_PATH *PartitionNode;
|
||||||
|
UINTN NumHandles;
|
||||||
|
EFI_HANDLE *AllHandles;
|
||||||
|
UINTN LoopIndex;
|
||||||
|
EFI_HANDLE FlashHandle;
|
||||||
|
EFI_BLOCK_IO_PROTOCOL *FlashBlockIo;
|
||||||
|
EFI_PARTITION_ENTRY *PartitionEntries;
|
||||||
|
FASTBOOT_PARTITION_LIST *Entry;
|
||||||
|
|
||||||
|
InitializeListHead (&mPartitionListHead);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get EFI_HANDLES for all the partitions on the block devices pointed to by
|
||||||
|
// PcdFastbootFlashDevicePath, also saving their GPT partition labels.
|
||||||
|
// There's no way to find all of a device's children, so we get every handle
|
||||||
|
// in the system supporting EFI_BLOCK_IO_PROTOCOL and then filter out ones
|
||||||
|
// that don't represent partitions on the flash device.
|
||||||
|
//
|
||||||
|
|
||||||
|
FlashDevicePath = ConvertTextToDevicePath ((CHAR16*)FixedPcdGetPtr (PcdAndroidFastbootNvmDevicePath));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Open the Disk IO protocol on the flash device - this will be used to read
|
||||||
|
// partition names out of the GPT entries
|
||||||
|
//
|
||||||
|
// Create another device path pointer because LocateDevicePath will modify it.
|
||||||
|
FlashDevicePathDup = FlashDevicePath;
|
||||||
|
Status = gBS->LocateDevicePath (&gEfiBlockIoProtocolGuid, &FlashDevicePathDup, &FlashHandle);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Warning: Couldn't locate Android NVM device (status: %r)\n", Status));
|
||||||
|
// Failing to locate partitions should not prevent to do other Android FastBoot actions
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
FlashHandle,
|
||||||
|
&gEfiBlockIoProtocolGuid,
|
||||||
|
(VOID **) &FlashBlockIo,
|
||||||
|
gImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Fastboot platform: Couldn't open Android NVM device (status: %r)\n", Status));
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read the GPT partition entry array into memory so we can get the partition names
|
||||||
|
Status = ReadPartitionEntries (FlashBlockIo, &PartitionEntries);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Warning: Failed to read partitions from Android NVM device (status: %r)\n", Status));
|
||||||
|
// Failing to locate partitions should not prevent to do other Android FastBoot actions
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get every Block IO protocol instance installed in the system
|
||||||
|
Status = gBS->LocateHandleBuffer (
|
||||||
|
ByProtocol,
|
||||||
|
&gEfiBlockIoProtocolGuid,
|
||||||
|
NULL,
|
||||||
|
&NumHandles,
|
||||||
|
&AllHandles
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
// Filter out handles that aren't children of the flash device
|
||||||
|
for (LoopIndex = 0; LoopIndex < NumHandles; LoopIndex++) {
|
||||||
|
// Get the device path for the handle
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
AllHandles[LoopIndex],
|
||||||
|
&gEfiDevicePathProtocolGuid,
|
||||||
|
(VOID **) &DevicePath,
|
||||||
|
gImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
// Check if it is a sub-device of the flash device
|
||||||
|
if (!CompareMem (DevicePath, FlashDevicePath, FLASH_DEVICE_PATH_SIZE (FlashDevicePath))) {
|
||||||
|
// Device path starts with path of flash device. Check it isn't the flash
|
||||||
|
// device itself.
|
||||||
|
NextNode = NextDevicePathNode (DevicePath);
|
||||||
|
if (IsDevicePathEndType (NextNode)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert that this device path node represents a partition.
|
||||||
|
ASSERT (NextNode->Type == MEDIA_DEVICE_PATH &&
|
||||||
|
NextNode->SubType == MEDIA_HARDDRIVE_DP);
|
||||||
|
|
||||||
|
PartitionNode = (HARDDRIVE_DEVICE_PATH *) NextNode;
|
||||||
|
|
||||||
|
// Assert that the partition type is GPT. ReadPartitionEntries checks for
|
||||||
|
// presence of a GPT, so we should never find MBR partitions.
|
||||||
|
// ("MBRType" is a misnomer - this field is actually called "Partition
|
||||||
|
// Format")
|
||||||
|
ASSERT (PartitionNode->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER);
|
||||||
|
|
||||||
|
// The firmware may install a handle for "partition 0", representing the
|
||||||
|
// whole device. Ignore it.
|
||||||
|
if (PartitionNode->PartitionNumber == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Add the partition handle to the list
|
||||||
|
//
|
||||||
|
|
||||||
|
// Create entry
|
||||||
|
Entry = AllocatePool (sizeof (FASTBOOT_PARTITION_LIST));
|
||||||
|
if (Entry == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
FreePartitionList ();
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy handle and partition name
|
||||||
|
Entry->PartitionHandle = AllHandles[LoopIndex];
|
||||||
|
StrnCpy (
|
||||||
|
Entry->PartitionName,
|
||||||
|
PartitionEntries[PartitionNode->PartitionNumber - 1].PartitionName, // Partition numbers start from 1.
|
||||||
|
PARTITION_NAME_MAX_LENGTH
|
||||||
|
);
|
||||||
|
InsertTailList (&mPartitionListHead, &Entry->Link);
|
||||||
|
|
||||||
|
// Print a debug message if the partition label is empty or looks like
|
||||||
|
// garbage.
|
||||||
|
if (!IS_ALPHA (Entry->PartitionName[0])) {
|
||||||
|
DEBUG ((EFI_D_ERROR,
|
||||||
|
"Warning: Partition %d doesn't seem to have a GPT partition label. "
|
||||||
|
"You won't be able to flash it with Fastboot.\n",
|
||||||
|
PartitionNode->PartitionNumber
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Exit:
|
||||||
|
FreePool (PartitionEntries);
|
||||||
|
FreePool (FlashDevicePath);
|
||||||
|
FreePool (AllHandles);
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
ArmFastbootPlatformUnInit (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
FreePartitionList ();
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ArmFastbootPlatformFlashPartition (
|
||||||
|
IN CHAR8 *PartitionName,
|
||||||
|
IN UINTN Size,
|
||||||
|
IN VOID *Image
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||||
|
EFI_DISK_IO_PROTOCOL *DiskIo;
|
||||||
|
UINT32 MediaId;
|
||||||
|
UINTN PartitionSize;
|
||||||
|
FASTBOOT_PARTITION_LIST *Entry;
|
||||||
|
CHAR16 PartitionNameUnicode[60];
|
||||||
|
BOOLEAN PartitionFound;
|
||||||
|
|
||||||
|
AsciiStrToUnicodeStr (PartitionName, PartitionNameUnicode);
|
||||||
|
|
||||||
|
PartitionFound = FALSE;
|
||||||
|
Entry = (FASTBOOT_PARTITION_LIST *) GetFirstNode (&(mPartitionListHead));
|
||||||
|
while (!IsNull (&mPartitionListHead, &Entry->Link)) {
|
||||||
|
// Search the partition list for the partition named by PartitionName
|
||||||
|
if (StrCmp (Entry->PartitionName, PartitionNameUnicode) == 0) {
|
||||||
|
PartitionFound = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry = (FASTBOOT_PARTITION_LIST *) GetNextNode (&mPartitionListHead, &(Entry)->Link);
|
||||||
|
}
|
||||||
|
if (!PartitionFound) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
Entry->PartitionHandle,
|
||||||
|
&gEfiBlockIoProtocolGuid,
|
||||||
|
(VOID **) &BlockIo,
|
||||||
|
gImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Fastboot platform: couldn't open Block IO for flash: %r\n", Status));
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check image will fit on device
|
||||||
|
PartitionSize = (BlockIo->Media->LastBlock + 1) * BlockIo->Media->BlockSize;
|
||||||
|
if (PartitionSize < Size) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "Partition not big enough.\n"));
|
||||||
|
DEBUG ((EFI_D_ERROR, "Partition Size:\t%d\nImage Size:\t%d\n", PartitionSize, Size));
|
||||||
|
|
||||||
|
return EFI_VOLUME_FULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
MediaId = BlockIo->Media->MediaId;
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
Entry->PartitionHandle,
|
||||||
|
&gEfiDiskIoProtocolGuid,
|
||||||
|
(VOID **) &DiskIo,
|
||||||
|
gImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
|
Status = DiskIo->WriteDisk (DiskIo, MediaId, 0, Size, Image);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockIo->FlushBlocks(BlockIo);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ArmFastbootPlatformErasePartition (
|
||||||
|
IN CHAR8 *Partition
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ArmFastbootPlatformGetVar (
|
||||||
|
IN CHAR8 *Name,
|
||||||
|
OUT CHAR8 *Value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (AsciiStrCmp (Name, "product")) {
|
||||||
|
AsciiStrCpy (Value, FixedPcdGetPtr (PcdFirmwareVendor));
|
||||||
|
} else {
|
||||||
|
*Value = '\0';
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
ArmFastbootPlatformOemCommand (
|
||||||
|
IN CHAR8 *Command
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CHAR16 CommandUnicode[65];
|
||||||
|
|
||||||
|
AsciiStrToUnicodeStr (Command, CommandUnicode);
|
||||||
|
|
||||||
|
if (AsciiStrCmp (Command, "Demonstrate") == 0) {
|
||||||
|
DEBUG ((EFI_D_ERROR, "ARM OEM Fastboot command 'Demonstrate' received.\n"));
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
} else {
|
||||||
|
DEBUG ((EFI_D_ERROR,
|
||||||
|
"VExpress: Unrecognised Fastboot OEM command: %s\n",
|
||||||
|
CommandUnicode
|
||||||
|
));
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FASTBOOT_PLATFORM_PROTOCOL mPlatformProtocol = {
|
||||||
|
ArmFastbootPlatformInit,
|
||||||
|
ArmFastbootPlatformUnInit,
|
||||||
|
ArmFastbootPlatformFlashPartition,
|
||||||
|
ArmFastbootPlatformErasePartition,
|
||||||
|
ArmFastbootPlatformGetVar,
|
||||||
|
ArmFastbootPlatformOemCommand
|
||||||
|
};
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ArmAndroidFastbootPlatformEntryPoint (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
gImageHandle = ImageHandle;
|
||||||
|
|
||||||
|
return gBS->InstallProtocolInterface (
|
||||||
|
&ImageHandle,
|
||||||
|
&gAndroidFastbootPlatformProtocolGuid,
|
||||||
|
EFI_NATIVE_INTERFACE,
|
||||||
|
&mPlatformProtocol
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
#/** @file
|
||||||
|
#
|
||||||
|
# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#**/
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = ArmVExpressFastBootDxe
|
||||||
|
FILE_GUID = 4004e454-89a0-11e3-89aa-97ef9d942abc
|
||||||
|
MODULE_TYPE = UEFI_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
ENTRY_POINT = ArmAndroidFastbootPlatformEntryPoint
|
||||||
|
|
||||||
|
[Sources.common]
|
||||||
|
ArmVExpressFastBoot.c
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
BaseLib
|
||||||
|
BaseMemoryLib
|
||||||
|
DebugLib
|
||||||
|
DevicePathLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
PcdLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
UefiDriverEntryPoint
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gAndroidFastbootPlatformProtocolGuid
|
||||||
|
gEfiBlockIoProtocolGuid
|
||||||
|
gEfiDiskIoProtocolGuid
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
EmbeddedPkg/EmbeddedPkg.dec
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||||
|
ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec
|
||||||
|
ArmPkg/ArmPkg.dec
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gArmGlobalVariableGuid
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gArmVExpressTokenSpaceGuid.PcdAndroidFastbootNvmDevicePath
|
||||||
|
gArmPlatformTokenSpaceGuid.PcdFirmwareVendor
|
|
@ -50,3 +50,8 @@
|
||||||
gArmVExpressTokenSpaceGuid.PcdPL111LcdMaxMode|3|UINT32|0x00000003
|
gArmVExpressTokenSpaceGuid.PcdPL111LcdMaxMode|3|UINT32|0x00000003
|
||||||
gArmVExpressTokenSpaceGuid.PcdPL111LcdVideoModeOscId|1|UINT32|0x00000004
|
gArmVExpressTokenSpaceGuid.PcdPL111LcdVideoModeOscId|1|UINT32|0x00000004
|
||||||
gArmVExpressTokenSpaceGuid.PcdHdLcdVideoModeOscId|0|UINT32|0x00000009
|
gArmVExpressTokenSpaceGuid.PcdHdLcdVideoModeOscId|0|UINT32|0x00000009
|
||||||
|
|
||||||
|
#
|
||||||
|
# Device path of block device on which Fastboot will flash partitions
|
||||||
|
#
|
||||||
|
gArmVExpressTokenSpaceGuid.PcdAndroidFastbootNvmDevicePath|""|VOID*|0x00000001
|
||||||
|
|
Loading…
Reference in New Issue