4. 添加自定义主板配置

任务目标

在Coreboot源码树中为一块新的自定义主板添加完整的构建配置,使该主板能够被make menuconfig识别并生成对应的.config,最终可通过make启动编译流程。本案例以虚拟主板example/custom_board为例,演示从创建目录到生成可编译配置的完整最小路径。

前置条件

  • 已克隆Coreboot源码树并完成make crossgcc-i386(或所需架构工具链)
  • 当前目录为Coreboot源码根目录
  • 主板依赖的芯片组/CPU已有现成的Coreboot支持(本例使用QEMU/Q35作为验证目标,避免真实硬件依赖)

实现步骤

自定义主板配置的核心是创建src/mainboard/<vendor>/<board_name>/目录,并在其中放置Kconfig、Kconfig.name和board_info.txt三个必要文件。其中Kconfig.name负责让主板出现在menuconfig列表中,Kconfig定义主板的依赖与默认选择,board_info.txt提供构建系统所需的元信息。

关键完整代码

以下为src/mainboard/example/custom_board/目录下三个文件的完整内容:

# Kconfig.name — 使主板在menuconfig中可见
config BOARD_EXAMPLE_CUSTOM_BOARD
    bool "Custom Board"
    select BOARD_ROMSIZE_KB_8192
    select SOC_INTEL_QEMU_Q35

# Kconfig — 主板配置定义
if BOARD_EXAMPLE_CUSTOM_BOARD

config MAINBOARD_DIR
    string
    default "example/custom_board"

config MAINBOARD_PART_NUMBER
    string
    default "Custom Board v1.0"

config MAINBOARD_VENDOR
    string
    default "Example"

config MAINBOARD_FAMILY
    string
    default "Custom_Series"

config DEVICETREE
    string
    default "devicetree.cb"

config OVERRIDE_DEVICETREE
    string
    default ""

config CBFS_SIZE
    hex
    default 0x800000

config HEAP_SIZE
    hex
    default 0x4000

endif # BOARD_EXAMPLE_CUSTOM_BOARD

# board_info.txt — 构建系统元信息
Vendor name: Example
Board name: Custom Board
Category: eval
ROM protocol: SPI
ROM socket: SOIC-8
ROM package: DIP-8
ROM voltage: 3.3V
ROM protocol: SPI
Flashrom support: yes

同时需要在src/mainboard/example/custom_board/下创建最小devicetree.cb(设备树配置),否则构建会在解析设备树阶段失败:

chip soc/intel/qemu_q35
    device domain 0 on
        device pci 00.0 on end  # 宿 bridge
        device pci 1f.0 on end  # LPC
    end
end

构建与验证

  1. 将上述文件放入正确路径后,在Coreboot根目录执行:
make menuconfig

在Mainboard → Mainboard vendor中选择Example,随后Mainboard model中应出现Custom Board选项。选择后保存退出。

  1. 确认生成的.config包含以下关键行:
CONFIG_BOARD_EXAMPLE_CUSTOM_BOARD=y
CONFIG_MAINBOARD_DIR="example/custom_board"
CONFIG_MAINBOARD_PART_NUMBER="Custom Board v1.0"
  1. 执行编译验证配置完整性:
make

通过判定标准:编译过程能够通过Kconfig解析、设备树解析并进入实际编译阶段(即开始编译romstage/ramstage等组件),不出现Kconfig: symbol not found或devicetree.cb: parse error类错误。由于QEMU目标不需要真实固件烧录,编译生成build/coreboot.rom即视为配置链路完整可用。

常见问题

  • menuconfig中看不到新主板:检查Kconfig.name中bool后的字符串是否非空,且文件位于src/mainboard/example/custom_board/下;执行make menuconfig前无需额外注册,Kconfig构建系统会自动扫描该目录。
  • 编译报错缺少芯片组支持:本案例使用SOC_INTEL_QEMU_Q35,若需真实硬件,需将select行替换为实际芯片组对应的Kconfig符号,并确保该芯片组在Coreboot中已有支持。
  • devicetree.cb语法错误:最小设备树必须包含chip根节点和至少一个device条目,且chip路径必须与Kconfig中select的SoC符号对应。