- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
本文以 coreboot 官方文档 Documentation/mainboard/asrock/h77pro4-m.md 为骨架,系统介绍 ASRock H77 Pro4-M 这块 microATX 桌面主板在 coreboot 下的完整支持状况、固件刷写流程、NCT6776 Super I/O 风扇控制、串口针脚定义与 eSATA 复用机制,并结合仓库中 src/mainboard/asrock/h77pro4-m 的 Kconfig、设备树与启动早期初始化源码做纵深解析。读完本文,你将掌握该板从选型确认、原生内存初始化、刷写固件到配置板载硬件的完整实战路径。
主板技术规格
ASRock H77 Pro4-M 是一块面向 Intel Sandy Bridge(SNB)与 Ivy Bridge(IVB)处理器的 microATX 尺寸桌面主板,采用 LGA 1155 插座。coreboot 侧的核心硬件组成如下:
| 部件 | 规格 |
|---|---|
| 北桥 | Intel Sandy Bridge(详见 北桥文档) |
| 南桥 | Intel H77(bd82x6x / Panther Point) |
| CPU 插座 | LGA 1155 |
| 内存 | 4 × DDR3-1600 |
| Super I/O | Nuvoton NCT6776 |
| 音频 | Realtek ALC892 |
| 网络 | Realtek RTL8111E(千兆以太网) |
| 串口 | 板载针脚排针(RS-232) |
这些配置在源码中均有对应依据。主板选择入口定义于 Kconfig.name(BOARD_ASROCK_H77PRO4_M),而 Kconfig 则通过一系列select语句确定了整块板的功能集合:
NORTHBRIDGE_INTEL_SANDYBRIDGE、SOUTHBRIDGE_INTEL_C216:南北桥芯片组;SUPERIO_NUVOTON_NCT6776:板载 Super I/O;DRIVERS_ASMEDIA_ASM1061:ASMedia ASM1061 PCIe-to-SATA 桥接芯片驱动;USE_NATIVE_RAMINIT:使用 coreboot 原生 DDR3 内存初始化(NRI),不需要 vendor MRC 二进制;MAINBOARD_HAS_LIBGFXINIT与INTEL_GMA_HAVE_VBT:使用 libgfxinit 驱动集成显卡,并携带 VBT 文件data.vbt;HAVE_ACPI_RESUME、HAVE_ACPI_TABLES:支持 ACPI 休眠恢复与 ACPI 表生成;HAVE_CMOS_DEFAULT、HAVE_OPTION_TABLE:内置 CMOS 默认值与可选参数表(这是下文nvramtool能够修改cpu_fan_tach_src的前提);BOARD_ROMSIZE_KB_8192:固件 ROM 容量 8 MiB。
board_info.txt 补充了板级元数据:类别为 desktop,发行年份 2012,ROM 采用 DIP-8 封装、SPI 协议、可插拔(socketed),且 flashrom 支持标志为 y。
设备树中的板载设备布局
devicetree.cb 完整刻画了板载设备拓扑,可与硬件规格一一对应:
- 北桥侧启用
host_bridge、peg10(PCIE1 x16 插槽,SMBIOS 描述为 Gen3 x16)、igd(集成显卡); - 南桥侧启用
xhci、ehci1/ehci2、hda(HD Audio)、mei1,关闭gbe(板载千兆网由 PCIe 根端口下的 Realtek RTL8111E 提供,见pcie_rp6注释); - 四个 PCIe 根端口:
pcie_rp1(PCIE4,Gen2 x4)、pcie_rp5(PCIE2,Gen2 x1)、pcie_rp6(RTL8111E GbE)、pcie_rp7(PCIE3,Gen2 x1)、pcie_rp8(ASM1061 SATA 控制器),与文档中“三条额外 PCIe 插槽”及 ASM1061 桥接 SATA 的表述吻合; - SATA 配置:
sata_interface_speed_support = 0x3(支持 6 Gb/s 与 3 Gb/s)、sata_port_map = 0x3f(6 个端口全部映射),对应 PCH 的六个原生 SATA 口(两个 6 Gb/s、四个 3 Gb/s); - USB 配置:
superspeed_capable_ports = 0x0000000f(4 个 USB3 端口具备超速能力)、xhci_switchable_ports = 0x0000000f,外加 14 端口usb_port_config表; - Super I/O 段(
pnp 2e.x)启用了 Parallel port(0x378/IRQ5/DRQ3)、COM1(0x3f8/IRQ4)、Keyboard、HWM(硬件监控,基址 0x0290)以及多个 GPIO 逻辑设备; subsystemid 0x1849 ...是 ASRock 的 PCI 子系统标识,贯穿北桥、南桥、HDA、PCIe 根端口等设备。
支持状态
官方文档给出的测试基线为 SeaBIOS 1.14.0 与 2019-07-12 的 slackware64-live(linux-4.19.50),后续又验证了 EDK II(MrChromebox 的 fork,origin/uefipayload_202207)与 SeaBIOS 1.16.1 场景。
Working(可用)
- Sandy Bridge 与 Ivy Bridge CPU(实测 i5-2500、Pentium G2120);
- 四条 DIMM 的原生内存初始化(
USE_NATIVE_RAMINIT); - PS/2 复合端口(鼠标或键盘二选一);
- libgfxinit 驱动的集成显卡,覆盖全部显示输出(DVI-D、HDMI、D-Sub)。这一点由 gma-mainboard.ads 佐证:
HDMI1映射到 DVI-D 接口、HDMI3映射到 HDMI 接口、Analog映射到 D-Sub 接口; - PEG 插槽中的 PCIe 显卡,以及全部三条附加 PCIe 插槽;
- 全部后置与内置 USB2/USB3 端口;
- PCH 全部六个 SATA 口(两个 6 Gb/s、四个 3 Gb/s)与 ASM1061 桥接的两个 6 Gb/s SATA 口;
- 后置 eSATA 接口(与一个 ASM1061 端口复用,详见下文);
- 千兆以太网;串口控制台输出;
- EDK II(MrChromebox fork)引导 Windows 10 (22H2) 与 Linux (5.19.17,经 GRUB 2);
- SeaBIOS 1.16.1 引导 Windows 10(需 VGA BIOS)与 Linux(经 extlinux);
- 使用 flashrom-1.2 进行内部刷写与外部刷写(外部刷写实测使用 Raspberry Pi 1);
- S3 挂起/恢复(Linux 或 Windows 10 均可)、断电关机。
Not working(不可用)
- 从 ASM1061 提供的两个 SATA 口引导系统;
- NCT6776D Super I/O 的自动风扇控制(目前没有 OS 无关的自动调速,见下文)。
Untested(未测试)
- EHCI debug、S/PDIF 音频;
- 除绿色音频口外的其他音频接口及前置音频排针;
- 并口、红外/CIR;
- 除电源键以外的任何唤醒源。
刷写 coreboot
闪存芯片与分区布局
官方文档记录的闪存信息如下:
| 项目 | 值 |
|---|---|
| 插槽式闪存 | 是(socketed,可插拔) |
| 芯片型号 | W25Q64.V |
| 容量 | 8 MiB |
| 封装 | DIP-8 |
| 写保护 | 无 |
| 双 BIOS 特性 | 无 |
| 内部刷写 | 支持 |
用ifdtool -f rom.layout backup.rom导出的闪存分区布局为:
00000000:00000fff fd # Flash Descriptor 00200000:007fffff bios # BIOS 00001000:001fffff me # Management Engine注意 BIOS 区从 0x00200000 开始,意味着 ME 与描述符占据了低端 2 MiB,而可刷写的 BIOS 镜像实际放在高端 6 MiB。
内部刷写(Internal Programming)
主 SPI 闪存可用 flashrom 访问。默认情况下只有 BIOS 区可写;若要改动其他区域(ME 或闪存描述符),必须使用外部编程器。刷写 coreboot 的推荐命令:
$ sudo flashrom --noverify-all --ifd -i bios -p internal -w coreboot.rom参数含义:
-p internal:使用主板自带 SPI 控制器(内部编程器);--ifd:启用 Intel 闪存描述符解析,只操作指定区域;-i bios:只写 BIOS 区域,避免触碰 ME 与描述符;-w coreboot.rom:写入固件镜像;--noverify-all:必须使用——因为 ME 区域即使对宿主机也不可读,若校验整个芯片会失败。
外部刷写则需取下 DIP-8 芯片,用 Raspberry Pi 等 SPI 编程器连接,配合-p linux_spi:path=/dev/spidevX.Y等外部编程器后端完成。
刷写与救砖的完整流程,请进一步阅读 刷写固件教程。
硬件监控与风扇控制
双 CPU 风扇排针的共享测速机制
板上 CPU 散热器风扇排针共有两个:CPU_FAN1 与 CPU_FAN2。它们在 Super I/O 上共享同一个风扇测速(tachometer)输入,由板载逻辑选择哪一路信号能够到达该输入,而这块选择逻辑由 Super I/O 的两根 GPIO 引脚控制。
该机制在启动早期初始化源码 early_init.c 中有精确实现。其注释说明:
- 当 GP77(寄存器
E1h[7])为0时,CPU_FAN1 的测速信号接通; - 当 GP76(寄存器
E1h[6])为0时,CPU_FAN2 的测速信号接通; - 两者同时为
0且两个风扇都接上时,测速读数会出错。
get_cpufanin_gpio_config()依据 CMOS 选项cpu_fan_tach_src返回写入寄存器E1h的值:
static u8 get_cpufanin_gpio_config(void) { switch (get_uint_option("cpu_fan_tach_src", CPU_FAN_HEADER_1)) { case CPU_FAN_HEADER_NONE: return 0xff; case CPU_FAN_HEADER_1: default: return 0x7f; case CPU_FAN_HEADER_2: return 0xbf; case CPU_FAN_HEADER_BOTH: return 0x3f; } }该值随后在bootblock_mainboard_early_init()中通过pnp_write_config(GPIO6789_DEV, 0xe1, ...)写入,即在 bootblock 阶段就完成了测速源选择。对应地,cmos.layout 中定义了这个 2 位的用户选项(枚举 ID 7):
# cpu_fan_header (select which header provides the tachometer # signal to the Super I/O on its CPUFANIN input) 7 0 None 7 1 CPU_FAN1 7 2 CPU_FAN2 7 3 Bothcmos.default 给出的出厂默认值是cpu_fan_tach_src=CPU_FAN1。
用 nvramtool 修改风扇测速来源
如果固件构建时开启了CONFIG_USE_OPTION_TABLE(本板 Kconfig 已通过HAVE_OPTION_TABLE支持),用户可在运行时用 nvramtool 修改该设置:
$ sudo nvramtool -e cpu_fan_header [..] $ sudo nvramtool -w cpu_fan_header=CPU_FAN2 $ sudo nvramtool -w cpu_fan_header=None $ sudo nvramtool -w cpu_fan_header=Both-e(--enum)列出该选项的取值;-w(--write)写入新值,-r可读取当前值。
该设置重启后生效。虽然可以选择并同时连接两个风扇排针,但此时 Super I/O 会报告错误的风扇转速(两路信号在共享测速输入上互相干扰)。
无自动调速时的替代方案
当前固件层面没有 OS 无关的自动风扇控制(这对应“Not working”列表中的 NCT6776D 自动风扇控制缺失)。可以改用 lm-sensors 软件包中的fancontrol工具,在操作系统内基于传感器温度读取 PWM 输出,实现软件调速闭环。HWM 逻辑设备在 devicetree.cb 中被配置为基址0x0290,且 NCT6776 的 HWM 寄存器通过irq 0x30 = 0xe1启用了风扇转速感知引脚。
串口排针引脚定义
Super I/O 提供的串口 1(COM1,0x3f8/IRQ4,见 devicetree.cb 中device pnp 2e.2)暴露在板载排针上。RS-232 信号在排针上的分配方式很特别:排针引脚号与 DE-9 连接器引脚号直接一一对应。俯视图如下:
+---+---+ N/C | | 9 | RI -> pin 9 +---+---+ Pin 8 <- CTS | 8 | 7 | RTS -> pin 7 +---+---+ Pin 6 <- DSR | 6 | 5 | GND -> pin 5 +---+---+ Pin 4 <- DTR | 4 | 3 | TxD -> pin 3 +---+---+ Pin 2 <- RxD | 2 | 1 | DCD -> pin 1 +---+---+排查串口不工作的实用建议:
- 检查你的挡板(bracket)是否采用相同的引脚分配,不同厂商的串口挡板排线定义可能不一致;
- 切勿直接连接 TTL 电平设备——这是标准的 RS-232 电平,需要像 MAX232 这样的电平转换芯片才能与 TTL UART 对接。
固件侧串口初始化由bootblock_mainboard_early_init()中的nuvoton_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE)完成(early_init.c)。
eSATA 复用机制
后置 I/O 面板上的 eSATA 接口与内置接口 SATA3_A1 共享 ASM1061 上的同一个控制器端口。当 eSATA 上接入设备时,板载多路复用器芯片会断开内部接口与 SATA 控制器的连接,转而接通 eSATA 接口。
该状态可以通过 Super I/O 的 GPIO 引脚 GP23 观察:eSATA 接入设备时 GP23 为0,否则为1。这也是文档明确记录的硬件行为,配合 devicetree.cb 中pcie_rp8(ASM1061 SATA Controller)的启用配置即可理解整条链路。由于复用器的存在,两块盘无法同时工作——这也解释了“Not working”列表中“无法从 ASM1061 的两个 SATA 口引导”的已知限制:引导盘应接在 PCH 原生 SATA 口上。
构建与调试要点
- 固件镜像用标准 coreboot 构建流程生成(参考 构建系统文档),主目录
MAINBOARD_DIR为asrock/h77pro4-m,MAINBOARD_PART_NUMBER为H77 Pro4-M; - Makefile.mk 显示:
early_init.c与gpio.c同时编入 bootblock 与 romstage,gma-mainboard.ads在开启 libgfxinit 时编入 ramstage——这印证了风扇测速源选择在 bootblock 阶段即生效、GPIO 配置在 romstage 早期完成的时序; - 板级 GPIO 的完整设置(PCH GPIO set1/set2/set3 的模式、方向、电平)见 gpio.c,可作为对照板卡硬件手册排查外设状态;
- 音频设备 verb 表(Realtek ALC892 与 Intel Display Audio/HDMI 音频)见 hda_verb.c,ACPI 表(DSDT、
_WAK/_PTS)见 dsdt.asl 与 acpi/platform.asl; - CMOS 中还可配置
gfx_uma_size(IGP 显存,32M–512M 共 16 档)、sata_mode(AHCI/Compatible/Legacy)、power_on_after_fail等参数,枚举定义均见 cmos.layout。
综上,ASRock H77 Pro4-M 是 coreboot 对 Sandy/Ivy Bridge 平台的成熟移植样本:原生内存初始化、libgfxinit 显示输出、完整 SATA/USB/PCIe 支持一应俱全,配合可插拔 DIP-8 闪存与内部刷写支持,是一块对刷机用户相当友好的桌面主板。使用时请留意本文列出的已知限制(ASM1061 引导、自动风扇控制、eSATA/内部 SATA 复用)以规避坑点。
- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
相关推荐
coreboot 实战:ASUS P8Z77-M(Sandy Bridge + Panther Point)主板移植与刷写指南
coreboot 实战:ASUS P8Z77 M(Sandy Bridge + Panther Point)主板移植与刷写指南 本文以 coreboot 官方文
固件嵌入式操作系统驱动开发coreboot 主板支持指南:System76 Bonobo Workstation 14(bonw14)规格详解与固件刷写
coreboot 主板支持指南:System76 Bonobo Workstation 14(bonw14)规格详解与固件刷写 本文以 coreboot 仓库中
固件嵌入式操作系统驱动开发SFTPGo外接身份认证实战:LDAP、OAuth2/OIDC单点登录配置完整教程
SFTPGo外接身份认证实战:LDAP、OAuth2/OIDC单点登录配置完整教程 SFTPGo 是一款功能完整的开源文件传输服务器,同时支持 SFTP、FTP
固件嵌入式操作系统驱动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考