测试0x3F8 串口输出的 UEFI Application

之前的文章【参考1】介绍过,初始化 Legacy COM Port 为 115200 的方法。这次编写一个 UEFI Shell Application,初始化这个 COM port 之后输出 www.lab-z.com字符。

#include  <Uefi.h>
#include  <Library/UefiLib.h>
#include  <Library/ShellCEntryLib.h>
#include  <Library/IoLib.h>

void init_serial(UINTN Port) {
	IoWrite8(Port + 1, 0x00); // Disable all interrupts
	IoWrite8(Port + 3, 0x80); // Enable DLAB (set baud rate divisor)
	IoWrite8(Port + 0, 0x01); // Set divisor to 1 (lo byte) 115200 baud
	IoWrite8(Port + 1, 0x00); // (hi byte)
	IoWrite8(Port + 3, 0x03); // 8 bits, no parity, one stop bit
	IoWrite8(Port + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold
	IoWrite8(Port + 4, 0x0B); // IRQs enabled, RTS/DSR set
}

INTN
EFIAPI
ShellAppMain (
  IN UINTN Argc,
  IN CHAR16 **Argv
  )
{
	CHAR8 TestString[]="www.lab-z.com";
	init_serial(0x3F8);
	for (UINTN i=0;i<sizeof(TestString);i++) {
		IoWrite8(0x3F8,TestString[i]);
	}
	return(0);
}

虽然有很多BIOS 的调试方法,但是BIOS 工程师最常见的方法仍然是串口输出 Log,唯一的原因是:足够简单和直接。用户无需为了调试BIOS而去调试工具。

源代码和编译后的 EFI Application:

参考:

1. https://www.lab-z.com/ocuart/