3. 添加自定义主板支持

任务说明

本案例以一块虚拟主板 vlab-qemu 为目标,在 Coreboot 源码树中为其添加基本的设备树(devicetree)与 Kconfig 配置,使 Coreboot 在编译时能够识别该主板并生成对应的 config 与 static.c 设备初始化代码。完成后通过 make menuconfig 选择该主板并成功编译,即可验证主板支持已生效。

环境与前置条件

  • Coreboot 源码(版本 ≥ 4.11),已安装构建依赖(gcc、make、flex、bison、libncurses-dev 等)
  • 本案例基于 QEMU 虚拟环境,无需真实硬件;使用默认的 qemu-i440fx 作为芯片组参考

实现步骤

在 Coreboot 源码根目录下依次创建以下文件。主板目录结构遵循 Coreboot 标准布局:src/mainboard/vendor/boardname/。

1. 创建主板目录与 Kconfig

mkdir -p src/mainboard/vlab/qemu

创建 src/mainboard/vlab/qemu/Kconfig:

config BOARD_VLAB_QEMU
    bool "VLab QEMU Virtual Board"
    select SOC_INTEL_I440FX
    select NORTHBRIDGE_INTEL_I440LX
    select SOUTHBRIDGE_INTEL_I82371EB
    select SUPERIO_NONE
    select HAVE_ACPI_TABLES
    select HAVE_OPTION_TABLE
    select HAVE_PIRQ_TABLE

config MAINBOARD_DIR
    string
    default "vlab/qemu"

config MAINBOARD_PART_NUMBER
    string
    default "VLab-QEMU"

config MAINBOARD_VENDOR
    string
    default "VLab"

config MAINBOARD_FAMILY
    string
    default "Virtual"

config MAX_CPUS
    int
    default 1

config VGA_BIOS
    bool
    default n

2. 创建设备树 devicetree.cb

创建 src/mainboard/vlab/qemu/devicetree.cb,描述虚拟主板的设备拓扑:

chip northbridge/intel/i440lx
    device cpu_cluster 0 on end
    device pci_domain 0 on
        chip southbridge/intel/i82371eb
            device pci 00.0 on end  # Host bridge
            device pci 01.0 on end  # ISA bridge
            device pci 01.1 on end  # IDE controller
            device pci 01.2 on end  # USB controller
            device pci 01.3 on end  # Power management
        end
    end
end

3. 创建 Kconfig.name 与 board_info.txt

创建 src/mainboard/vlab/qemu/Kconfig.name:

config BOARD_VLAB_QEMU
    bool

创建 src/mainboard/vlab/qemu/board_info.txt:

Category: virtual
Board URL: https://example.com/vlab-qemu
ROM package: qemu

4. 创建最小 romstage 入口

创建 src/mainboard/vlab/qemu/romstage.c,提供最基本的初始化入口:

#include <arch/io.h>
#include <device/pci_ops.h>
#include <console/console.h>

void mainboard_romstage_entry(void)
{
    /* 虚拟主板无需实际硬件初始化,仅确认入口被调用 */
    printk(BIOS_INFO, "VLab-QEMU: romstage entry\n");
}

5. 创建 Kconfig 主菜单关联

编辑 src/mainboard/Kconfig,在末尾添加:

source "src/mainboard/vlab/Kconfig"

创建 src/mainboard/vlab/Kconfig:

config VENDOR_VLAB
    bool "VLab"
    select HAVE_MAINBOARD_RESOURCES

source "src/mainboard/vlab/*/Kconfig.name"

构建与验证

# 在 Coreboot 根目录执行
make menuconfig

# 进入 Mainboard -> Mainboard vendor 选择 VLab
# 进入 Mainboard -> Mainboard model 选择 VLab QEMU Virtual Board
# 保存退出

# 开始编译
make -j$(nproc)

验证通过条件:

  1. make menuconfig 中能够看到并选择 VLab 厂商及 VLab QEMU Virtual Board 型号;
  2. 编译无错误结束,生成 build/coreboot.rom 文件;
  3. 检查 build/mainboard/vlab/qemu/static.c 存在,且内容包含 devicetree.cb 中定义的设备节点(如 pci_domain、cpu_cluster 等),说明设备树已被正确解析并生成初始化代码。

常见问题

  • menuconfig 中看不到新主板:确认 src/mainboard/Kconfig 中 source 路径正确,且 Kconfig.name 文件存在。
  • 编译报错缺少 romstage 入口:检查 romstage.c 中函数名是否为 mainboard_romstage_entry,且已包含必要的头文件。
  • 设备树语法错误:运行 make devicetree 可单独验证 devicetree.cb 语法是否正确。