- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
本篇技术指南以 coreboot 官方文档中关于 ASUS P2B-LS 主板的说明为主体,结合仓库内 src/mainboard/asus/p2b 的实际板级代码,系统讲解这款 1998 年经典 440BX 主板的 coreboot 刷写方法、CPU 微码空间优化策略、功能支持状态与底层实现细节。读者读完可以掌握 P2B-LS(以及同板型的 P2B-L / P2B-S)从烧录到裁剪微码、再到理解板级设备树配置的完整实战路径。
主板概览与硬件变体
ASUS P2B-LS 是一款基于 Intel 440BX 芯片组的桌面主板,定位 Slot 1 时代的高端型号,其最大特色是板载 Adaptec SCSI 控制器与 Intel 以太网控制器。它在 coreboot 源码树中的板级目录为 src/mainboard/asus/p2b,并在 Kconfig.name 中登记了同一系列的多款变体:
- P2B-LS:完整型号,同时板载 SCSI 与以太网;
- P2B-L:与 P2B-LS 同 PCB,但省略了 SCSI 相关元件;
- P2B-S:与 P2B-LS 同 PCB,但省略了以太网相关元件。
根据 board_info.txt 记录,该板发布于1998 年,类别为 desktop(桌面主板)。上述三个型号共用一个板级代码目录,仅通过 Kconfig 中的BOARD_ASUS_P2B_LS/BOARD_ASUS_P2B_L/BOARD_ASUS_P2B_S等配置项区分,VARIANT_DIR则指向各自独立的 overridetree.cb 覆盖设备树。
硬件平台技术规格
原文档 "Technology" 一节给出了该板的核心芯片组构成,与源码中的 Kconfig 选择完全对应:
| 组件 | 型号 | 源码依据 |
|---|---|---|
| 北桥(Northbridge) | Intel I440BX | select NORTHBRIDGE_INTEL_I440BX(Kconfig) |
| 南桥(Southbridge) | i82371eb(PIIX4E) | select SOUTHBRIDGE_INTEL_I82371EB(Kconfig) |
| CPU | P6 家族,Slot 1 与 Socket 370(model_63x 至 model_6bx) | select CPU_INTEL_SLOT_1(Kconfig) |
| Super I/O | winbond/w83977tf | select SUPERIO_WINBOND_W83977TF(Kconfig) |
北桥代码位于 src/northbridge/intel/i440bx,南桥代码位于 src/southbridge/intel/i82371eb(即常说的 PIIX4E)。板级 Kconfig 还针对 4 条 DIMM 槽位选择了SDRAMPWR_4DIMM,该选项在 i440bx/Kconfig 中有明确说明:它影响 SDRAMC 寄存器的编程方式,如果设错,内存时钟信号将无法正确布线——对带 4 条 DIMM 槽的 P2B-LS 必须启用。
CPU 支持范围方面,src/cpu/intel/slot_1/Kconfig 中CPU_INTEL_SLOT_1会连带选中model_65x、model_67x、model_68x、model_6bx、model_6xx五个 CPU 型号驱动,正好覆盖原文档所说的 "model_63x 到 model_6bx" 宽泛的 P6 家族范围(Klamath、Deschutes、Katmai、Coppermine、Tualatin 等核心)。Slot 1 与 Socket 370 的 P6 处理器 L1/L2 缓存初始化逻辑可参见 src/cpu/intel/slot_1/l2_cache.c,其中注释详细区分了哪些核心(Klamath 63x、Deschutes 65x、Katmai 67x)需要特殊 L2 初始化序列,哪些(Coppermine 68x、Tualatin 6bx)不需要。
刷写 coreboot
Flash 芯片规格
原文档给出了该板 BIOS 芯片的完整规格,刷新时需按此准备烧录器与镜像:
| 项目 | 值 |
|---|---|
| 芯片型号 | SST 39SF020A(或同类兼容型号) |
| 协议 | Parallel(并行) |
| 容量 | 256 KiB |
| 封装 | DIP-32 |
| 是否可插拔(Socketed) | 是 |
| 写保护 | 无 |
| 双 BIOS 特性 | 无 |
| 支持板内刷写(Internal flashing) | 是 |
这些信息与 board_info.txt 中的ROM package: DIP32、ROM protocol: Parallel、ROM socketed: y、Flashrom support: y记录一致。板级 Kconfig 中select BOARD_ROMSIZE_KB_256(Kconfig)也确认了镜像规格为 256 KiB。
由于芯片采用 DIP-32 可插拔封装且支持板内刷写,用户可以优先使用 flashrom 直接对板内芯片进行刷新;若刷新失败,也可将芯片拔出后用编程器烧写。flashrom 自0.9.2 版本起即可开箱即用识别该板与芯片。一个典型的板内刷写命令示例(实际参数以 flashrom 版本与芯片识别结果为准):
flashrom -p internal -w build/coreboot.rom原文档特别提醒:由于厂商固件的缺陷,首次刷新时用户需要按提示确认覆盖(override)厂商固件发出的警告;一旦 coreboot 写入并启动后,后续不会再出现该问题。
构建要点
构建该板镜像时,在make menuconfig中选择 Mainboard 为 ASUS P2B-LS(对应BOARD_ASUS_P2B_LS),保持BOARD_ROMSIZE_KB_256等默认选项即可。coreboot 的通用构建流程可参考 构建系统文档。
CPU 微码:256 KiB Flash 空间的关键约束
这是刷写 P2B-LS 时最需要注意的一点。由于该板支持的 CPU 型号跨度极大(Slot 1 与 Socket 370、多代 P6 核心),默认情况下板级镜像会打包 5 个 Intel CPU 家族的微码更新,其来源正是文档中提到的3rdparty/intel-microcode/intel-ucode目录(该目录属于 git 子模块,克隆仓库后需先执行子模块初始化才能取得微码文件)。
从源码侧看,这一"全家桶"行为并非巧合:CPU_INTEL_SLOT_1在 src/cpu/intel/slot_1/Kconfig 中一次性select了五个 CPU 型号驱动(65x/67x/68x/6bx/6xx),而 src/cpu/intel/slot_1/Makefile.mk 又通过subdirs-y += ../microcode引入微码打包逻辑,最终把覆盖五个家族的微码一并塞进 CBFS。
其代价非常直观:
- 5 个家族的微码合计占据256 KiB Flash 的大约 1/3;
- 最终生成的 CBFS 镜像中只剩约 20 KiB 空闲空间,可用的 payload、选项表等余量非常紧张。
自定义微码文件
原文档给出的优化方案是:按实际使用的 CPU 型号手工构建定制微码文件——即从3rdparty/intel-microcode/intel-ucode目录中,仅挑选该主板将要实际运行的 CPU 型号对应的微码文件,手动拼接(concatenate)成一个精简的微码更新文件,从而大幅释放 Flash 空间。
具体做法(以文档描述为准)大致为:先确认你的 CPU 的 CPUID 家族/型号,然后在intel-ucode目录中挑选对应条目,按 coreboot 微码 blobs 的拼接格式组合成一个自定义文件,再通过 coreboot 的微码配置指向该文件。微码加载时机由 src/cpu/intel/microcode/Kconfig 中的MICROCODE_UPDATE_PRE_RAM控制(在 cache-as-RAM 建立阶段完成更新)。需要注意的是,镜像的 CBFS 空间以 256 KiB 为上限(BOARD_ROMSIZE_KB_256),在容纳微码、选项表、ACPI 表与 payload 的同时保留足够余量,是需要做取舍的。
板级实现细节:从源码看 P2B-LS 的特殊设计
原文档中提到的几个"已知问题"(SCSI 终止、内存容量限制等),都能在板级源码中找到对应的实现痕迹,下面逐一展开。
SCSI 终止的 GPO 控制(overridetree.cb 与 CMOS 选项)
P2B-LS 板载 Adaptec AIC7890 SCSI 控制器,SCSI 总线终止(termination)由南桥 PIIX4 的通用输出引脚 GPO 控制。在 overridetree.cb 中可以清楚看到:
register "gpo" = "0x7fbfb9ff" register "gpo22_enable" = "1" # GPO22 控制 LVD 端口终止(0=启用) # GPO23 控制 SCSI-50 端口终止(1=启用) # SCSI-68 端口始终终止这正是原文档 "Termination is enabled for all SCSI ports (if equipped). Support to disable termination is pending. Note that the SCSI-68 port is always terminated, even with vendor firmware." 的源码落点:当前实现为所有 SCSI 端口强制启用终止,且 SCSI-68 端口在硬件上无论固件如何都处于终止状态。
同时,cmos.layout 中为该板预留了两个 CMOS 选项scsi_se_term(偏移 412,控制 PIIX4 GPO22,对应 Ultra2-68 端口)与scsi_lvd_term(偏移 413,控制 GPO23,对应 SCSI-50 端口),枚举值采用反转语义(0=Enable、1=Disable)。cmos.default 中两者的默认值均为Enable,与"终止全部启用"的当前行为一致。这为未来实现"可配置终止"预留了接口,但正如文档所说,禁用终止的支持仍在 pending 状态。
256Mbit 内存模块的容量截断(raminit.c)
原文档指出:i440BX 不支持 256Mbit 密度的 RAM 颗粒,若安装这类模块,coreboot 会尝试以一半容量将其初始化,而厂商固件则直接拒绝启动。这一行为的底层实现可以在 src/northbridge/intel/i440bx/raminit.c 中找到佐证:spd_get_dimm_size()从 SPD 字节读取每面容量,随后有一段显式的容量钳制逻辑——当单面容量超过 128 MB 时,打印提示并将该面容量强制设为 128 MB("It is possible to partially use larger than supported modules by setting them to a supported size.")。256Mbit 颗粒对应的模块密度超出 i440BX 可寻址范围,因此在初始化时被按可用容量的上限(约一半)处理。内存初始化入口为sdram_initialize(),由 romstage.c 中的mainboard_romstage_entry()调用。
ECC 内存:可用但校验支持未实现
P2B-LS 可以使用 ECC 内存条,但原文档明确 ECC 支持"仍在 pending"。从当前 raminit.c 的实现看,SDRAM 初始化路径中尚未包含内存 ECC 启用/校验逻辑,与文档描述一致。顺带一提,CPU L2 缓存的 ECC 检测在 l2_cache.c 的set_l2_ecc()中有实现,但那是 L2 缓存层面、与内存条 ECC 无关。
Bootblock 串口初始化(bootblock.c)
bootblock.c 在 bootblock 阶段通过 Winbond W83977TF 的W83977TF_SP1(PnP 设备,基址 0x3f0)启用串口作为早期调试输出,winbond_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE)将 COM1 配置为 console,这与原文档"Serial ports 1 and 2 正常工作"相呼应。
Super I/O 与 IDE 配置(devicetree.cb)
基础设备树 devicetree.cb 完整声明了 W83977TF 的各个 PnP 设备:软驱(0x60=0x3f0,IRQ 6,DRQ 2)、并口(0x378,IRQ 7)、COM1(0x3f8,IRQ 4)、COM2/IR(0x2f8,IRQ 3)、PS/2 键盘/鼠标(0x60/0x64,IRQ 1/12)以及两组 GPIO。南桥部分还启用了 IDE0/IDE1 并默认打开 UDMA/33(ide*_udma33_enable),对应原文档 "IDE hard drives 正常工作"。
中断路由:PIRQ 表与 ACPI _PRT
P2B-LS 的 PCI 中断路由同时体现在两张表中:
- 传统 PIRQ 表 irq_tables.c:中断路由器为 PCI 04.0(南桥),
CONFIG_IRQ_SLOT_COUNT在 Kconfig 中为 P2B-LS 专门设为8(其他变体为 7 或 6),以覆盖板载 SCSI/以太网带来的更多中断槽位; - ACPI
_PRT表 dsdt.asl:其中#if CONFIG(BOARD_ASUS_P2B_LS)条件编译了 0x0006FFFF(SCSI 槽位)与 0x0007FFFF 两组额外中断映射,其余变体不包含这两组条目。
此外,dsdt.asl 还实现了 ACPI 电源状态映射:依据 PIIX4E 数据手册将南桥电源状态寄存器映射为\_S0(工作)、\_S1(挂起,CPU 上下文丢失)与\_S5(软关机),并通过 GPO0/风扇、GPO8/电源 LED 等操作域实现\_PTS/\_WAK睡眠唤醒流程。
硬件监控解码(mainboard.c)
mainboard.c 的mainboard_init()通过 PIIX4 的DEVRESB寄存器,为设备 9 设置一段 8 字节的通用 I/O 解码窗口(端口 0x290,掩码 0x007),用于在 ISA 总线上访问 W83781D 硬件监控芯片。
功能支持状态总览
正常工作
原文档列出的正常功能包括:
- Slot 1 与 Socket 370 CPU 及其 L1/L2 缓存;
- PS/2 键盘(配合 SeaBIOS payload,详见下文已知问题);
- IDE 硬盘;
- 以太网(仅 -LS、-L 型号,Intel 82558);
- SCSI(仅 -LS、-S 型号,Adaptec AIC7890);
- USB;
- ISA 扩展卡;
- PCI 扩展卡;
- AGP 显卡;
- 软驱;
- 串口 1 与 2;
- 重启(Reboot);
- 软关机(Soft off)。
已知问题
- PS/2 键盘延迟可用:PS/2 键盘可能要等到 Linux 完全启动后才能使用。若以 SeaBIOS 作为 payload(SeaBIOS 位于 payloads/external/SeaBIOS),可尝试将键盘初始化超时设置为500 ms来修复该问题。
- 256Mbit 内存模块容量减半:i440BX 不支持 256Mbit 密度的内存颗粒,安装后 coreboot 会以一半容量初始化(厂商固件则完全无法启动),详见上文 raminit 容量钳制分析。
- ECC 支持 pending:ECC 内存条可用,但内存 ECC 校验支持尚未实现。
- SCSI 终止全部启用:所有 SCSI 端口(若板载)的终止均被启用,禁用终止的支持尚未实现;且 SCSI-68 端口无论使用何种固件都始终处于终止状态。
未测试
- 并口(Parallel port);
- EDO 内存;
- 红外(Infrared);
- PC 喇叭。
不工作
- S3 挂起到内存(Suspend to RAM):当前不支持,这是该板唯一明确列出的不工作功能。ACPI 表中仅提供
\_S0、\_S1、\_S5,没有\_S3定义,与"不支持 S3"的状态吻合。
结语
ASUS P2B-LS 是 coreboot 对早期 440BX 平台支持的代表性主板:板级代码位于 src/mainboard/asus/p2b,全部变体共用一套基础代码,通过 Kconfig 与条件编译区分 SCSI/以太网等板载外设差异。对实际使用者而言,刷写时需重点规划 256 KiB Flash 的微码占用,通过按 CPU 型号定制微码文件释放空间;对开发者而言,SCSI 终止的 GPO 控制、CMOS 终止选项、条件编译的 ACPI_PRT与 raminit 的容量钳制逻辑,都是理解该板实现乃至移植同类 440BX 主板的最佳参考。
- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
相关推荐
coreboot on ASUS P8H61-M Pro:SPI 闪存刷写方法与 h61-series 板级支持源码解析
coreboot on ASUS P8H61 M Pro:SPI 闪存刷写方法与 h61 series 板级支持源码解析 本文基于 coreboot 仓库中 P
固件嵌入式操作系统驱动开发coreboot 实战:ASUS P8Z77-M(Sandy Bridge + Panther Point)主板移植与刷写指南
coreboot 实战:ASUS P8Z77 M(Sandy Bridge + Panther Point)主板移植与刷写指南 本文以 coreboot 官方文
固件嵌入式操作系统驱动开发ASUS PRIME H610I-PLUS D4 主板 coreboot 支持详解:移植状态、刷写方法与功能矩阵
ASUS PRIME H610I PLUS D4 主板 coreboot 支持详解:移植状态、刷写方法与功能矩阵 ASUS PRIME H610I PLUS D
固件嵌入式操作系统驱动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考