- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
本文以 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 |
| SoC | Intel Atom x5-E3940(4 核) |
| GPU | Intel HD Graphics 500 |
| 协处理器 | Intel TXE 3.0 |
| RAM | 8GB DDR3L |
| eMMC Flash | 32GB eMMC pSLC |
| USB3 | x2 |
| USB2 | x6 |
| SATA | x2 |
| LAN | Intel I210IT、I211AT |
| Super IO/EC | Kontron CPLD/EC |
| HWM | NCT7802 |
板卡信息在 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.
相关推荐
coreboot 移植 Framework Laptop 13 Pro(Sakura):硬件支持、构建与刷写实战指南
coreboot 移植 Framework Laptop 13 Pro(Sakura):硬件支持、构建与刷写实战指南 本文以 coreboot 仓库中 Docu
固件嵌入式操作系统驱动开发ASUS P8Z77-V LE PLUS 的 coreboot 移植实战:刷写方法、PCIe 槽位配置与硬件监控详解
ASUS P8Z77 V LE PLUS 的 coreboot 移植实战:刷写方法、PCIe 槽位配置与硬件监控详解 本文基于 coreboot 仓库中的主板文
固件嵌入式操作系统驱动开发coreboot 在 Facebook Monolith 平台上的移植与固件刷写指南
coreboot 在 Facebook Monolith 平台上的移植与固件刷写指南 本指南围绕 coreboot 对 Facebook Monolith 主板
固件嵌入式操作系统驱动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考