☰
coreboot 移植实战:Kontron COMe-mAL10 平台的构建、刷写与硬件监控配置指南
2026/10/14 21:06:23 网站建设 项目流程
  • 固件
  • 嵌入式
  • 操作系统
  • 驱动开发

【免费下载链接】coreboot

Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.

项目地址:https://gitcode.com/gh_mirrors/co/coreboot
点击查看免费下载

本文以 coreboot 官方文档 Documentation/mainboard/kontron/mal10.md 为主体,结合仓库中 src/mainboard/kontron/mal10 的完整板级源码,系统讲解 Kontron COMe-mAL10 嵌入式模块在 coreboot 下的构建流程、SPI 刷写方法、NCT7802Y 硬件监控驱动配置,以及 CPLD/EC 与 FSP 电源管理等底层实现细节。读完本文,你将掌握如何为这块基于 Intel Atom E3900 系列的迷你 COMe 模块编译与刷写 coreboot 固件,并能读懂其设备树与初始化代码的每一处关键配置。

平台概述:Atom E3900 驱动的迷你 COMe 模块

Kontron mAL10 是一块信用卡大小的 Computer-on-Modules(COMe)平台,采用 mini pin-out type 10 接口,核心 SoC 为 Intel Atom 系列(含 Pentium 与 Celeron 衍生型号)。其完整技术规格如下表(摘自原文档):

技术项规格
COMe 类型mini pin-out type 10
SoCIntel Atom x5-E3940(4 核)
GPUIntel HD Graphics 500
协处理器Intel TXE 3.0
RAM8GB DDR3L
eMMC Flash32GB eMMC pSLC
USB3x2
USB2x6
SATAx2
LANIntel I210IT、I211AT
Super IO/ECKontron CPLD/EC
HWMNCT7802

板卡信息在 src/mainboard/kontron/mal10/board_info.txt 中登记为:Vendor 为 Kontron,Category 为 mini,ROM 协议为 SPI、不可插座化(ROM socketed: n)、支持 flashrom 刷写(Flashrom support: y),发布于 2019 年。

值得注意的硬件细节是:Apollo Lake 系列 Pentium/Celeron/Atom 处理器不支持 PECI,因此 CPU 温度无法通过 PECI 接口读取,而是取自紧贴 CPU 放置的热敏电阻(NTC)。

板级源码结构:variant 与 carrier 双层组织

从仓库源码看,mAL10 的移植采用 coreboot 常见的 "模块(variant)+ 载板(carrier)" 双层结构,目录 src/mainboard/kontron/mal10 下包含:

  • variants/mal10/:COMe 模块本体的设备树、GPIO、VBT 与 libgfxinit 显示配置;
  • carriers/t10-tni/:Kontron 官方参考载板 Ref.Carrier-i T10-TNI 的 override 设备树与 GPIO;
  • 公共的bootblock.c、romstage.c、ramstage.c、mal10.fmd、cmos.layout与 DSDT。

这种拆分在 Kconfig 中有明确体现:板卡选项为BOARD_KONTRON_COME_MAL10,下方提供choice让用户在构建时选择载板(默认BOARD_KONTRON_T10_TNI,即 Kontron Ref.Carrier-i T10-TNI),并分别通过CONFIG_VARIANT_DIR与CONFIG_CARRIER_DIR决定DEVICETREE与OVERRIDE_DEVICETREE指向哪个目录。这意味着未来新增其他载板时,只需在carriers/下添加新目录并扩展该 choice 即可(源码中也留有# TODO: Add a new carrier boards here注释)。

构建 coreboot:命令、Kconfig 依赖与替代路径

原文档给出的三行构建命令即可产出可用镜像:

make distclean make defconfig KBUILD_DEFCONFIG=configs/config.kontron_mal10 make

需要说明的适用前提:文档引用的configs/config.kontron_mal10defconfig 文件并未收录在当前镜像仓库的 configs 目录中,因此如果你克隆的是本仓库,可改用等价的交互式方式构建,即:

make distclean make menuconfig # 在 Mainboard 菜单中选中 "Kontron COMe-mAL10" make

选中板卡后,Kconfig 中的BOARD_SPECIFIC_OPTIONS会自动拉取一组关键依赖,帮助理解该板移植的技术栈:

  • SOC_INTEL_APOLLOLAKE:Apollo Lake SoC 支持;
  • BOARD_ROMSIZE_KB_16384:16MB 板载 SPI Flash;
  • DRIVERS_I2C_NCT7802Y:硬件监控驱动;
  • EC_KONTRON_KEMPLD:Kontron CPLD/EC 驱动;
  • HAVE_ACPI_TABLES/HAVE_ACPI_RESUME:ACPI 表与 S3 恢复支持;
  • INTEL_GMA_HAVE_VBT与MAINBOARD_HAS_LIBGFXINIT:Intel 显卡 VBT 与 libgfxinit 初始化路径;
  • ONBOARD_VGA_IS_PRIMARY:板载图形作为主显示;
  • CRB_TPM:TPM 2.0 支持。

支持的 Payload

原文档明确列出三种可选的 payload:

  • SeaBIOS;
  • edk2;
  • 以 Linux 作为 payload 直接引导内核。

Flash 布局(FMAP)

16MB SPI Flash 的布局定义在 mal10.fmd,可直接看出固件分区策略:SI_DESC(0x1000 描述符区)、SI_BIOS(0xefe000,内含 IFWI 0x2ff000 与 OBB 0xbff000)、SI_DEVICEEXT(设备扩展区)。其中 OBB 内部包含 FMAP、三块 MRC 缓存(RECOVERY/RW/RW_VAR)、CONSOLE 日志区以及核心的COREBOOT(CBFS)区。UNIFIED_MRC_CACHE的存在说明该板支持 MRC 缓存以加速内存初始化(详见下文 romstage 配置)。

刷写固件:通过 flashrom 写入 BIOS 区域

由于板载 SPI Flash 不支持热插拔更换(ROM socketed: n),原文档推荐使用 flashrom 在系统内直接访问 SPI 控制器进行刷写,命令如下:

$ flashrom -p internal --ifd -i bios -w coreboot.rom --noverify-all

参数含义拆解:

  • -p internal:使用系统内部编程器(即主板上的 SPI 控制器);
  • --ifd -i bios:遵循 Intel Flash Descriptor,仅操作bios区域,避免触碰描述符与 ME/TXE 区域;
  • -w coreboot.rom:写入编译产物;
  • --noverify-all:跳过对未写入区域的校验。

注意:该命令会实际写入固件,操作前请确认已完整备份原始固件。

硬件监控:NCT7802Y 驱动的传感器与智能风扇配置

原文档对硬件监控 IC 的描述:Nuvoton NCT7802Y 可监控电源电压、风扇转速与温度等关键系统参数,远程输入可连接 CPU/GPU 热敏二极管或任意热敏二极管与热敏电阻传感器,并提供:

  • 6 路温度传感器;
  • 5 路电压传感器;
  • 3 路风扇转速传感器;
  • 4 组温度设定点。

由于 Apollo Lake 不支持 PECI,CPU 温度改由紧贴 CPU 的 NTC 热敏电阻提供,这决定了驱动配置中必须使用"远程热敏电阻模式"而非 PECI 模式。

设备树中的 NCT7802Y 配置

在 variants/mal10/devicetree.cb 的 SMBUS 控制器(pci 1f.1)下,NCT7802Y 以drivers/i2c/nct7802y挂在 I2C 地址0x2e上。传感器配置如下:

register "sensors" = "{ .local_enable = 1, .rtd[2] = RTD_VOLTAGE_MODE, .rtd[1] = RTD_VOLTAGE_MODE, .rtd[0] = RTD_THERMISTOR_MODE, }"

结合驱动头文件 src/drivers/i2c/nct7802y/chip.h 可解读:RTD_THERMISTOR_MODE即远程热敏电阻模式(对应"CPU 温度取自 NTC"的设计),RTD_VOLTAGE_MODE为电压模式;.local_enable = 1启用本地温度传感器。

智能风扇(Smart Fan)温度-转速表

同一设备树中对 FAN0 与 FAN1 配置了完整的智能风扇策略,核心是 4 点温度-转速表与临界温度:

register "fan[0].mode" = "FAN_SMART" register "fan[0].smart.mode" = "SMART_FAN_RPM" register "fan[0].smart.tempsrc" = "TEMP_SOURCE_REMOTE_1" register "fan[0].smart.table" = "{ { 49, 0 }, { 50, 6350 }, { 70, 9550 }, { 90, 12750 } }" register "fan[0].smart.critical_temp" = "95"

对照 chip.h 中的枚举可知:FAN_SMART为智能温控模式,SMART_FAN_RPM表示表格中的目标值以 RPM 计(区别于SMART_FAN_DUTY的占空比百分比),温度源可选TEMP_SOURCE_REMOTE_1/2/3、TEMP_SOURCE_LOCAL等;table[4]固定为 4 组(temp, target)点。FAN0 以 REMOTE_1(远端热敏电阻)为温度源,FAN1 则使用TEMP_SOURCE_LOCAL本地温度,两者临界温度均为 95°C。

该驱动仅实现 coreboot 主板当前使用到的功能子集(源码注释Implements only those parts currently used by coreboot mainboards),代码位于 src/drivers/i2c/nct7802y/nct7802y.c 与 nct7802y_fan.c。

底层实现剖析:从 bootblock 到 FSP 配置

bootblock:CPLD/EC 的 LPC 解码与串口启用

bootblock.c 在 early init 阶段完成两件关键事:一是通过lpc_open_pmio_window(0x0A80, 2)为 Kontron CPLD 打开 LPC I/O 窗口,二是调用lpc_io_setup_comm_a_b()与kempld_enable_uart_for_console()启用串口控制台。这对应原文档"Tested and working"列表中 Kontron CPLD/EC 的串口功能。

romstage:DDR3L 内存参数与 MRC 快速启动

romstage.c 的mainboard_memory_init_params()填充 FSP-M 内存参数:DDR3LPageSize = 2、禁用双列(DualRankSupportEnable = 0)、DIMM0/DIMM1 的 SPD 地址分别为0xA0/0xA4,并开启MrcFastBoot = 1——与 fmd 中的UNIFIED_MRC_CACHE分区相呼应,将内存初始化结果缓存起来以加速后续启动。

ramstage:电源管理与中断控制器覆盖

ramstage.c 的mainboard_silicon_init_params()依据 AMI UEFI v112 的 BIOS Setup 设置配置了完整的 CPU 电源管理:启用 Cx 状态与 C1e、MaxCoreCState = 3(最大 Core C-State 为 C6)、启用 LPSS S0ix(LPSS_S0ixEnable = 1)、InitS3Cpu = 1(S3 恢复时初始化 CPU,对应原文档中 S3 支持计划)。源码中还带有一条重要警告注释:切勿修改PkgCStateLimit,否则系统退出省电模式时 SoC 功耗会尖峰,导致 COMe 模块上 DC-DC 转换器输出出现电压跌落——该参数在 AMI BIOS 中也仅展示而不允许修改。此外该函数还覆盖了 HPET 与 IOAPIC 的总线/设备/功能号与 IOAPIC ID。

设备树要点:外设开关与载板覆盖

模块本体 variants/mal10/devicetree.cb 启用了 VTD(enable_vtd = 1)、DPTF(dptf_enable = true)、两条 SATA 端口、四路 PCIe-A 与一路 PCIe-B(均禁用 CLKREQ)、XHCI、eMMC、SD 卡、PWM,以及 LPC 下的 Kontron kempld EC。EC 子设备中配置了 2 路 UART(IO 地址0x3F8/IRQ 4 与0x2F8/IRQ 3)、I2C 总线(KEMPLD_I2C_FREQ_FAST_MODE_400KHZ)以及 8 路 GPIO(前 4 路输入、后 4 路输出低电平)。相关枚举定义在 src/ec/kontron/kempld/chip.h。

载板 T10-TNI 的 overridetree.cb 则覆盖了 USB 配置:usb_config_override = 1,USB2 端口 0–5 使能并关联 OC1 过流保护、端口 6/7 跳过;USB3 端口 0/1 使能并关联 OC0;同时重新指定各 PCIe Root Port 的 CLKREQ 引脚,并关闭音频控制器(pci 0e.0 off,注释# TODO: Audio)。

显示与 ACPI

显示方面,variants/mal10/gma-mainboard.ads 声明 libgfxinit 的探测端口为DP1与eDP;VBT 数据位于 variants/mal10/data.vbt。ACPI 方面,dsdt.asl 引入了 Apollo Lake 的 northbridge/southbridge 模板与 DPTF 支持,DPTF 专用表在 acpi/dptf.asl。CMOS 默认值(cmos.default)设定了 115200 波特率、Info 级调试日志与power_on_after_fail = Enable。

测试状态与待办事项

原文档如实记录了该移植的成熟度边界:

已测试可用(Tested and working):

  • Kontron CPLD/EC(串口、I2C 端口、GPIO);
  • NCT7802Y 硬件监控;
  • USB2/3;
  • 千兆以太网口;
  • eMMC;
  • SATA;
  • PCIe 端口;
  • IGD/DP 显示。

未测试(Untested):

  • IGD/LVDS;
  • SDIO。

待办(TODO):

  • 板载音频(codec 为 IDT 92HD73C1X5,当前在载板设备树中被禁用,与 overridetree.cb 中的pci 0e.0 off一致);
  • S3 挂起/恢复(源码已具备HAVE_ACPI_RESUME与InitS3Cpu等基础,但尚未完全验证)。

在参考此移植开发自有载板或复现固件时,请以上述测试矩阵为准,避免将"未测试"项当作可用功能。

小结

Kontron COMe-mAL10 是 coreboot 中一个结构清晰的 Apollo Lake 嵌入式平台移植范例:它以 variant/carrier 双层设备树优雅解耦了 COMe 模块与载板的差异,以 NCT7802Y 驱动完整展示了热敏电阻取温与 4 点智能风扇表的实际配置方法,并在 FSP 参数层面对 Apollo Lake 的电源管理陷阱(如 PkgCStateLimit)给出了可落地的工程约束。对于需要为自家 COMe 载板适配 coreboot 的开发者,本文所述的构建、刷写与配置流程可直接复用。

  • 固件
  • 嵌入式
  • 操作系统
  • 驱动开发

【免费下载链接】coreboot

Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.

项目地址:https://gitcode.com/gh_mirrors/co/coreboot
点击查看免费下载
上一篇:xonsh 历史记录(History)完全指南:JSON/SQLite 双后端、命令动作与底层实现解析
下一篇:swagger-codegen 属性命名转换机制解析:以 Java Jersey1 客户端 Capitalization 模型为例

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询