通常情况下,我们在通过串口进行 Debug Message 输出的时候通常直接对 0x3F8 Port进行编程,但是这种方式并不符合 UEFI 规范。正规的做法是通过 EFI_DEBUGPORT_PROTOCOL来实现。在 UEFI 规范中有如下定义:
针对这个 Protocol 编写的测试代码如下:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Protocol/DebugPort.h>
#include <Library/UefiBootServicesTableLib.h> //global gST gBS gImageHandle
EFI_GUID gEfiDebugPortProtocolGuid = EFI_DEBUGPORT_PROTOCOL_GUID;
int
EFIAPI
main (
IN int Argc,
IN char **Argv
)
{
EFI_STATUS Status;
EFI_DEBUGPORT_PROTOCOL *DebugPort = NULL;
CHAR8 *TestMessage="www.lab-z.com";
Status = gBS->LocateProtocol(
&gEfiDebugPortProtocolGuid,
NULL,
(VOID **) &DebugPort);
if (EFI_ERROR(Status))
{
Print(L"Can't load DebugPortProtocol error!\n");
return EFI_SUCCESS;
}
UINTN Length=AsciiStrLen(TestMessage);
DebugPort->Write(
DebugPort,
1000,
&Length,
(VOID *)TestMessage
);
gBS->CloseProtocol (
DebugPort,
&gEfiDebugPortProtocolGuid,
gImageHandle,
NULL );
return EFI_SUCCESS;
}
运行之后主机端的串口程序中可以看到有字符串的输出:
完整代码: