修复 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 音频驱动。不同设置下的表现如下:
| 参数 | 驱动 | 本机表现 |
|---|---|---|
1 | HDA,snd_hda_intel | 扬声器和耳机正常,内置麦克风不可用 |
3 | SOF | 选择 ES8336 配置,因缺少对应拓扑文件而无法注册声卡 |
4 | AVS,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 输入。