2. 配置串口调试输出

任务目标

在 coreboot 的早期启动阶段(romstage)启用串口作为调试输出通道,使日志能够通过 UART 输出到终端。本案例以 QEMU x86 平台为验证环境,完成从配置到日志输出的最小闭环。

环境与依赖

  • coreboot 源码树(建议版本 4.21 或更新)
  • QEMU(x86_64 模拟器)
  • 构建工具:gcc、make、flex、bison、libncurses-dev 等(coreboot 标准构建依赖)

实现步骤

coreboot 的串口调试输出由 CONSOLE_SERIAL_UART 配置项控制,同时需要指定 UART 端口地址。在 QEMU 环境中,默认使用 I/O 端口 0x3F8(COM1)。

进入 coreboot 源码根目录,执行以下配置命令:

make menuconfig

在菜单中依次设置:

  1. Console → Serial console → 勾选 Enable serial console
  2. Console → Serial console → UART for console → 选择 0x3F8
  3. Console → Serial console → Console buffer size → 保持默认(256)
  4. Chipset → South Bridge → 确认 Enable UART 已勾选(QEMU 平台默认开启)

保存配置后,构建固件:

make -j$(nproc)

构建产物位于 build/coreboot.rom。

验证方法

使用 QEMU 启动固件,并将串口重定向到标准输出:

qemu-system-x86_64 -bios build/coreboot.rom -serial stdio -display none

通过条件:终端出现 coreboot 启动日志,包含类似以下内容:

coreboot-4.21-xxxx Mon Jan 01 00:00:00 UTC 2024 starting...
...

若日志正常输出,说明串口调试通道已成功启用。若终端无输出,请检查:

  • UART 端口地址是否与 QEMU 默认 COM1(0x3F8)一致
  • 串口控制台是否在 romstage 阶段即被启用(可在 src/console/Kconfig 中确认 CONSOLE_SERIAL_UART 默认值)

关键配置说明

coreboot 的串口初始化代码位于 src/console/uart.c,其核心逻辑为:

void uart_init(void)
{
    uart_platform_init(CONFIG_UART_FOR_CONSOLE);
}

该函数在 romstage 早期被调用,完成波特率设置与 FIFO 配置。波特率默认 115200,可通过 CONFIG_UART_BAUDRATE 调整。

若需在自定义主板上启用串口,需在 devicetree.cb 中确认南桥 UART 控制器已启用,并正确设置 CONFIG_UART_FOR_CONSOLE 为对应端口地址。