之前的文章【参考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/