Added a PCD to turn on/off probing Block IO devices to detect add/remove/change. FAT driver does not do this so if the shell does not do this you will get dir hits on an SD Card that has been removed. Default is ON. I moved this feature from device command to main command loop so it gets done after you type return before your command is processed.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10479 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
andrewfish 2010-05-11 00:09:48 +00:00
parent 9f6b977f66
commit 884366cf56
4 changed files with 48 additions and 22 deletions

View File

@ -99,6 +99,7 @@
gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable
gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd
gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd
gEmbeddedTokenSpaceGuid.PcdEmbeddedProbeRemovable
[FixedPcd.common]
gEmbeddedTokenSpaceGuid.PcdEmbeddedAutomaticBootCommand

View File

@ -210,34 +210,13 @@ EblDeviceCmd (
UINTN Index;
UINTN CurrentRow;
UINTN Max;
EFI_OPEN_FILE *File;
CurrentRow = 0;
// Need to call here to make sure Device Counts are valid
EblUpdateDeviceLists ();
//
// Probe for media insertion/removal in removable media devices
//
Max = EfiGetDeviceCounts (EfiOpenBlockIo);
if (Max != 0) {
for (Index = 0; Index < Max; Index++) {
File = EfiDeviceOpenByType (EfiOpenBlockIo, Index);
if (File != NULL) {
if (File->FsBlockIoMedia->RemovableMedia) {
// Probe to see if media is present (or not) or media changed
// this causes the ReinstallProtocolInterface() to fire in the
// block io driver to update the system about media change events
File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL);
}
EfiClose (File);
}
}
}
// Now we can print out the info...
Max = EfiGetDeviceCounts (EfiOpenFirmwareVolume);
if (Max != 0) {
AsciiPrint ("Firmware Volume Devices:\n");

View File

@ -455,6 +455,45 @@ EblPrintStartupBanner (
}
/**
Send null requests to all removable media block IO devices so the a media add/remove/change
can be detected in real before we execute a command.
This is mainly due to the fact that the FAT driver does not do this today so you can get stale
dir commands after an SD Card has been removed.
**/
VOID
EblProbeRemovableMedia (
VOID
)
{
UINTN Index;
UINTN Max;
EFI_OPEN_FILE *File;
//
// Probe for media insertion/removal in removable media devices
//
Max = EfiGetDeviceCounts (EfiOpenBlockIo);
if (Max != 0) {
for (Index = 0; Index < Max; Index++) {
File = EfiDeviceOpenByType (EfiOpenBlockIo, Index);
if (File != NULL) {
if (File->FsBlockIoMedia->RemovableMedia) {
// Probe to see if media is present (or not) or media changed
// this causes the ReinstallProtocolInterface() to fire in the
// block io driver to update the system about media change events
File->FsBlockIo->ReadBlocks (File->FsBlockIo, File->FsBlockIo->Media->MediaId, (EFI_LBA)0, 0, NULL);
}
EfiClose (File);
}
}
}
}
/**
Print the prompt for the EBL.
**/
@ -611,6 +650,11 @@ EdkBootLoaderEntry (
EblPrompt ();
GetCmd (CmdLine, MAX_CMD_LINE);
SetCmdHistory (CmdLine);
if (FeaturePcdGet (PcdEmbeddedProbeRemovable)) {
// Probe removable media devices to see if media has been inserted or removed.
EblProbeRemovableMedia ();
}
}
}

View File

@ -65,6 +65,8 @@
gEmbeddedTokenSpaceGuid.PcdEmbeddedIoEnable|FALSE|BOOLEAN|0x00000005
gEmbeddedTokenSpaceGuid.PcdEmbeddedScriptCmd|FALSE|BOOLEAN|0x00000006
gEmbeddedTokenSpaceGuid.PcdEmbeddedPciDebugCmd|FALSE|BOOLEAN|0x00000041
gEmbeddedTokenSpaceGuid.PcdEmbeddedProbeRemovable|TRUE|BOOLEAN|0x00000050
gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|FALSE|BOOLEAN|0x0000001b
gEmbeddedTokenSpaceGuid.PcdCacheEnable|FALSE|BOOLEAN|0x00000042
gEmbeddedTokenSpaceGuid.PcdGdbSerial|FALSE|BOOLEAN|0x0000004d
@ -74,7 +76,7 @@
gEmbeddedTokenSpaceGuid.PcdEmbeddedAutomaticBootCommand|L""|VOID*|0x00000007
gEmbeddedTokenSpaceGuid.PcdEmbeddedDefaultTextColor|0x07|UINT32|0x00000008
gEmbeddedTokenSpaceGuid.PcdEmbeddedMemVariableStoreSize|0x10000|UINT32|0x00000009
gEmbeddedTokenSpaceGuid.PcdEmbeddedPrompt|"Ebl"|VOID*|0x00000034
gEmbeddedTokenSpaceGuid.PcdEmbeddedPrompt|"Ebl %a"|VOID*|0x00000034
gEmbeddedTokenSpaceGuid.PcdPrePiHobBase|131072|UINT32|0x00000040
gEmbeddedTokenSpaceGuid.PcdPrePiStackBase|0|UINT32|0x0000000b