修复 Linux 下华为 MateBook 的音频问题

排查 MateBook D 15 2022 在 Arch Linux 下的声卡识别与内置麦克风问题,从 Windows 驱动包提取 DSP 固件,配置 AVS 驱动恢复播放和录音。

华为 MateBook D 15 2022 在 Windows 下可以正常播放和录音,但安装 Arch Linux 后无法识别声卡。参考 Arch Linux 论坛将 snd_intel_dspcfg.dsp_driver 设置为 1 后,扬声器和耳机可以恢复正常,但会导致内置麦克风无法录音。

内置数字麦克风需要音频 DSP,而 dsp_driver=1 使用的 HDA 驱动不启用 DSP。默认选择的 SOF 驱动又根据 ACPI 信息使用了不适合本机的 ES8336 配置,导致了上述问题的发生。解决方法是从华为的 Windows 驱动包中提取 DSP 固件,改用内核自带的 AVS 驱动。

环境

提取并应用 Windows 包的驱动固件时的系统环境是:

子项信息
型号MateBook D 15 2022,BoDE-WFH9
DMI 型号BoDE-WXX9
主板BoDE-WXX9-PCB-B3
音频控制器Intel Tiger Lake-LP,8086:a0c8
PCI 子系统152d:1371
HDA 音频编解码器Conexant SN6140,14f1:1f87

相同型号/系列的 Matebook可能使用不同的声卡和主板,下面的固件与配置只在上述硬件上测试过。开始配置前,先检查自己的机器信息:

for dmi_field in sys_vendor product_name board_name; do
    printf '%s: ' "$dmi_field"
    cat "/sys/class/dmi/id/$dmi_field"
done
lspci -nnk -s 00:1f.3

驱动选择

可以通过snd_intel_dspcfg 的 dsp_driver 参数设置使用哪个 Intel 音频驱动。不同设置下的表现如下:

参数驱动本机表现
1HDA,snd_hda_intel扬声器和耳机正常,内置麦克风不可用
3SOF选择 ES8336 配置,因缺少对应拓扑文件而无法注册声卡
4AVS,snd_soc_avs安装固件、关机再开机并设置麦克风增益后,播放和录音正常

HDA 与数字麦克风

使用 dsp_driver=1 时,可以查看 HDA 音频编解码器的信息:

rg 'Codec:|Vendor Id:|Pin Default' /proc/asound/card*/codec\#*

此时检测到的音频编解码器是 Conexant SN6140,扬声器、耳机和外接麦克风插孔都连接到它。内置数字麦克风(DMIC)则通过 PDM 接口连接到 Intel DSP,使用不同的音频通路。SOF 的数字麦克风说明介绍了这类接口及其在 DSP 中的处理过程。

内核日志中也能看到数字麦克风的信息:

DMICs detected in NHLT tables: 2

NHLT 是 ACPI 中记录数字音频接口信息的表。这里的 2 表示两个数字麦克风通道。HDA 模式不启用 DSP,因此只能恢复模拟音频,无法驱动内置数字麦克风。这个模式下,桌面声音设置中的 Mic 对应耳麦插孔上的模拟麦克风输入。

SOF 与 ACPI 配置

自动选择驱动或设置 dsp_driver=3 时,内核尝试加载以下拓扑文件:

intel/sof-tplg/sof-tgl-es8336-dmic2ch.tplg

在安装Debian,启动livecd时也会出现类似提示消息,要求加载对应固件

拓扑文件(topology)描述 DSP 的音频处理流程及输入、输出接口配置。文件名表明 SOF 使用了 ES8336 配置,但系统找不到这个文件,声卡也没有成功注册。

选择 ES8336 的原因可以从 ACPI 的 DSDT 表中找到。设备 \_SB.PC00.I2C2.ESSX 的定义包含以下内容:

Name (_HID, "ESSX8336")
Name (_CID, "ESSX8336")

Method (_STA, 0, NotSerialized)
{
    Return (0x0F)
}

_STA 始终返回 0x0F。按 ACPI 规范,这表示固件向系统报告该设备存在、已启用且工作正常。SOF 的 Tiger Lake 声卡匹配表据此选择了 sof-essx8336。

实际检查时,系统没有检测到对应的 I2C2 控制器,ESSX8336:00 设备节点下没有 physical_node,也没有绑定驱动。HDA 总线上检测到的芯片则是 SN6140。

排查时曾修改 Linux 7.1 的 sound/soc/intel/common/soc-acpi-intel-tgl-match.c,增加 DMI 匹配条件:厂商为 HUAWEI、产品名为 BoDE-WXX9、主板名为 BoDE-WXX9-PCB-B3。在 ES8336 匹配项的 machine_quirk 回调中,匹配这组条件时返回 NULL,让内核跳过该项。修改后,SOF 改用了通用 HDA 配置。

提取固件

AVS 驱动可以同时支持本机的 HDA 音频设备和数字麦克风,但需要对应的 DSP 固件。测试时安装的 linux-firmware-intel 20260810-2 已提供 HDA、DMIC 和 HDMI 的通用 AVS 拓扑文件,缺少 Tiger Lake 的基础固件:

intel/avs/tgl/dsp_basefw.bin

这份固件可以从华为提供的 HUAWEI_Matebook_D_15_2022_ISST_10.29.0.6367.zip 驱动包中提取。可以从华为官网下载驱动并提取。包内的 INF 文件包含本机的控制器 ID A0C8 和子系统 ID SUBSYS_1371152D,其中 IntcOED.inf 指定的基础固件为 Fw/dsp_fw_release.bin。

在 Arch Linux 上安装解压、诊断工具和所需的固件包。下面使用 PipeWire 作为桌面音频服务:

sudo pacman -S --needed 7zip alsa-utils pciutils ripgrep \
    linux-firmware-intel pipewire pipewire-pulse wireplumber

下载上述 Windows 驱动包,将下面的 driver_archive 替换为实际路径。压缩包内还有一层 ZIP 和两层 NSIS 安装器,可以依次用 7-Zip 解开:

driver_archive="/path/to/HUAWEI_Matebook_D_15_2022_ISST_10.29.0.6367.zip"
extract_root="$(mktemp -d /tmp/huawei-isst-XXXXXX)"

7z x "$driver_archive" "-o$extract_root/layer1"

nested_zip="$extract_root/layer1/HUAWEI_Matebook_D_15_2022_ISST_10.29.0.6367/HUAWEI_Matebook_D_15_2022_ISST_10.29.0.6367.zip"
7z x "$nested_zip" "-o$extract_root/layer2"

7z x "$extract_root/layer2/ISST_10.29.0.6367.exe" "-o$extract_root/layer3"
7z x "$extract_root/layer3/ISST_10.29.0.6367.exe" "-o$extract_root/payload"

firmware_file="$extract_root/payload/IntelSST/Fw/dsp_fw_release.bin"
sha256sum "$firmware_file"

提取出的固件大小为 546764 字节,版本为 10.29.0.6313

Linux 7.1 在 AVS 平台配置中为 Tiger Lake 设置的最低固件版本是 10.29.0.5646。固件加载代码要求前三段版本一致,最后一段不低于 5646,这份固件符合要求。

配置 AVS

确认机器信息与固件均与上文一致后,安装基础固件。提取与安装命令需要在同一个终端中执行,以保留 firmware_file 变量:

sudo install -D -m 0644 \
    "$firmware_file" \
    /usr/lib/firmware/intel/avs/tgl/dsp_basefw.bin

驱动参数

先查找已有配置:

rg -n 'snd_intel_dspcfg|dsp_driver|dmic_detect' \
    /etc/modprobe.d /usr/lib/modprobe.d
cat /proc/cmdline

然后编辑 /etc/modprobe.d/sound.conf,设置 dsp_driver=4:

options snd_intel_dspcfg dsp_driver=4

检查其他配置文件,删除重复的 dsp_driver 设置。

启动镜像

对于使用 mkinitcpio 的 Arch linux,重新生成启动镜像:

sudo mkinitcpio -P

然后重启

验证音频

声卡状态

开机后检查实际使用的驱动和声卡:

lspci -nnk -s 00:1f.3
cat /sys/module/snd_intel_dspcfg/parameters/dsp_driver
cat /proc/asound/cards
arecord -l

PCI 驱动应为 snd_soc_avs,dsp_driver 应为 4。如下,编号可能因系统配置而不同:

0 [PROBE   ]: AVS PROBE
1 [HDAudio ]: AVS HD-Audio
2 [DMIC    ]: AVS DMIC
3 [HDMI    ]: AVS HDMI

如果日志先提示缺少 hda-14f11f87-tplg.bin,随后出现 trying to load fallback topology hda-generic-tplg.bin,且声卡列表中已有 HDA 设备,说明驱动成功加载了通用拓扑文件。

麦克风增益

正常加载驱动并识别麦克风后,可能还无法录音,需要设置麦克风增益。先查看:

amixer -c DMIC cget 'name=DMIC Volume'

如果为 0,设为 100% 并保存 ALSA 状态:

amixer -q -c DMIC set DMIC 100%
sudo alsactl store DMIC

随后在桌面声音设置中选择 AVS HDA 作为输出、AVS DMIC 作为输入。

播放与录音测试

可以先在桌面声音设置中测试扬声器,再用录音程序检查内置麦克风。若直接使用 ALSA,可按 arecord -l 列出的设备号录制五秒声音。下面以 DMIC 声卡的设备 0 为例:

arecord -D hw:CARD=DMIC,DEV=0 \
    -f S32_LE -r 48000 -c 2 -d 5 /tmp/matebook-dmic.wav

完成后用播放器打开 /tmp/matebook-dmic.wav,检查是否能听到录制的声音。如果 ALSA 提示设备忙,可改用桌面录音程序,通过 PipeWire 录制已选中的 AVS DMIC 输入。