[AI Development Lab] 华为MateBookD15 essx8336 声卡 扬声器无声修复
Tofloor
poster avatar
鲜衣怒马
deepin
10 hours ago
Author

华为 MateBook 扬声器/耳机切换修复脚本(纯用户空间 · 免编译内核)

适用场景:搭载 HWSP0001 功放的华为 MateBook(如 D15 BoF-XX / BOD-WXX9),在 Linux 下出现“扬声器无声”或“耳机插拔切换异常”。


📌 核心结论

如果你的机器符合条件,本脚本可以 一键修复 以下问题,且不涉及内核编译,随时可回退:

  • ✅ 扬声器完全无声
  • ✅ 插耳机后扬声器仍在响
  • ✅ 开机插着耳机,扬声器乱响
  • ✅ 拔掉耳机后扬声器没声

项目地址


🚀 快速开始(10秒确认 + 1分钟安装)

1. 确认机型是否适用

在终端执行以下命令,有输出即适用

ls /sys/bus/i2c/devices/ | grep -i HWSP
# 预期输出示例:i2c-HWSP0001:00

若无输出,说明你的功放不是 HWSP0001,请勿直接使用(参考文末“通用性说明”)。

2. 安装与启动

git clone https://gitee.com/xiyidaiwa/huawei-matebook-d15-speaker-fix
cd huawei-matebook-d15-speaker-fix
sudo ./install.sh
sudo systemctl restart huawei-speaker-mute.service

3. 验证修复效果

完成安装后,依次检查以下场景:

场景 预期效果
插入耳机 扬声器静音,耳机有声
拔出耳机 扬声器恢复发声
开机(插耳机) 扬声器静音
开机(不插耳机) 扬声器有声
插拔瞬间 无爆音

🔍 问题根源分析

HWSP0001 功放在 Linux 下缺失官方驱动,导致两个层面的问题:

问题一:扬声器基础静音(上游已解决)

  • 现象:开机后扬声器毫无反应。
  • 原因:BIOS 初始化后,功放回归默认静音态,Linux 内核无驱动接管。
  • 方案:通过 GPIO 上电 + I2C 回放初始化寄存器(reinit_amp)。

问题二:耳机切换逻辑断裂(本仓库解决)

  • 现象:插拔耳机时,扬声器与耳机状态混乱。
  • 原因:系统无法通过 GPIO 控制功放静音。必须写入功放内部的软静音寄存器0x01=0x00),而非简单的物理引脚控制。
  • 方案:监听 ALSA 插拔事件,动态写入寄存器切换状态。

✨ 方案亮点

  • 纯用户空间:仅依赖 i2csetalsactl,无需编译内核或加载第三方模块。
  • 智能探测:自动识别 I2C 总线、ALSA 控制项(Headphone Jack)及 GPIO 线号,开箱即用。
  • 精准控制:仅静音 HWSP0001 功放,不影响 ES8336 管理的耳机通路。
  • 防爆音设计:拔插瞬间先将 ALSA 音量归零,待功放稳定后再恢复,杜绝“啪”声。
  • 高可移植:逻辑与硬件参数分离,方便适配其他类似功放。

🛠️ 手动排查与维护

查看服务状态

systemctl status huawei-speaker-mute.service

查看功放寄存器状态(调试用)

./huawei-speaker-mute.sh status
# 0x00: 静音(耳机插入)
# 0x69: 恢复(耳机拔出)

实时监控插拔事件

alsactl monitor hw:0
# 插拔耳机时,观察 Headphone Jack 状态变化

卸载/停用

sudo systemctl stop huawei-speaker-mute.service
sudo systemctl disable huawei-speaker-mute.service

📖 通用性说明(重要)

本脚本并非万能驱动,它是针对 HWSP0001 特性的专用解决方案。

  1. 完全适用:已验证的 HWSP0001 机型(如 BoF-XX, BOD-WXX9),直接安装即可。

  2. 可借鉴框架:如果你的机器是其他功放芯片(非 HWSP0001),但符合以下条件,可复用本脚本框架:

    • 功放支持 I2C 访问且有软静音寄存器。
    • 耳机与扬声器为独立音频路径。
    • 系统存在可监听的插拔事件(ALSA Jack 或 GPIO)。
    • 操作:需自行使用 i2cdetect/i2cdump 确定 I2C 地址和寄存器值,替换脚本中的 set_amp()reinit_amp() 函数即可。

📄 技术细节

  • 内核无关性:经校验,修复过程完全运行于用户空间,与 /boot/config-$(uname -r) 内核配置无关,适用于各类未修改的 Linux 发行版。
  • 依赖组件i2c-tools, alsa-utils, systemd.

🙏 致谢

本项目基于 MaximushkaBed/huawei-matebook-d15-speaker-fix 进行二次开发与优化。感谢原作者解决了 HWSP0001 的基础发声问题,本仓库在此基础上重点完善了耳机插拔联动逻辑、自动探测机制及防爆音处理。


如有同机型或类似问题,欢迎提交 Issue,请务必附带 huawei-speaker-mute.sh statusalsactl monitor hw:0 的输出日志。

Reply Favorite View the author
All Replies
avatar
MeGusta
deepin
9 hours ago
#1

华为系本子的老毛病了。

Reply View the author
avatar
鲜衣怒马
deepin
8 hours ago
#2
MeGusta

华为系本子的老毛病了。

原来早就有修复,只是好多系统都没集成,刚好发现了,试了下可以,就增加了一点优化了下拔插的体验

Reply View the author
avatar
鲜衣怒马
deepin
8 hours ago
#3
It has been deleted!
avatar
晚秋(lateautumn)
Moderator
6 hours ago
#4

我的华为matebook13s,没有输出,看来不适用这种方法了。

WangWq@WangWq-PC:~/Desktop$ ls /sys/bus/i2c/devices/ | grep -i HWSP

预期输出示例:i2c-HWSP0001:00

WangWq@WangWq-PC:/Desktop$ git clone https://gitee.com/xiyidaiwa/huawei-matebook-d15-speaker-fix
cd huawei-matebook-d15-speaker-fix
sudo ./install.sh
sudo systemctl restart huawei-speaker-mute.service
找不到命令 “git”,但可以通过以下软件包安装它:
sudo apt install git
bash: cd: huawei-matebook-d15-speaker-fix: 没有那个文件或目录
请验证人脸或密码:
验证成功
sudo: ./install.sh:找不到命令
Failed to restart huawei-speaker-mute.service: Unit huawei-speaker-mute.service not found.
WangWq@WangWq-PC:
/Desktop$

Reply View the author
avatar
鲜衣怒马
deepin
6 hours ago
#5
晚秋(lateautumn)

我的华为matebook13s,没有输出,看来不适用这种方法了。

WangWq@WangWq-PC:~/Desktop$ ls /sys/bus/i2c/devices/ | grep -i HWSP

预期输出示例:i2c-HWSP0001:00

WangWq@WangWq-PC:/Desktop$ git clone https://gitee.com/xiyidaiwa/huawei-matebook-d15-speaker-fix
cd huawei-matebook-d15-speaker-fix
sudo ./install.sh
sudo systemctl restart huawei-speaker-mute.service
找不到命令 “git”,但可以通过以下软件包安装它:
sudo apt install git
bash: cd: huawei-matebook-d15-speaker-fix: 没有那个文件或目录
请验证人脸或密码:
验证成功
sudo: ./install.sh:找不到命令
Failed to restart huawei-speaker-mute.service: Unit huawei-speaker-mute.service not found.
WangWq@WangWq-PC:
/Desktop$

可以让ai帮你分析你是啥声卡,帮你找github上有没有解决方案

Reply View the author
avatar
晚秋(lateautumn)
Moderator
6 hours ago
#6
鲜衣怒马

可以让ai帮你分析你是啥声卡,帮你找github上有没有解决方案

这是AI的回答:

所以在 Deepin(Linux)系统下,MateBook 13s 的声卡驱动方案是 SOF(Sound Open Firmware),配合 snd-hda-intelsnd-sof 内核模块使用。如果安装 Deepin 后声音不正常,可以尝试:

  1. 安装 sof-firmware 驱动包
  2. 使用 alsamixer 调整内部通道(如将 "Auto-Mute" 关闭、调整 "Headphone" 或 "Speaker" 通道音量)
Reply View the author
avatar
鲜衣怒马
deepin
5 hours ago
#7
晚秋(lateautumn)

这是AI的回答:

所以在 Deepin(Linux)系统下,MateBook 13s 的声卡驱动方案是 SOF(Sound Open Firmware),配合 snd-hda-intelsnd-sof 内核模块使用。如果安装 Deepin 后声音不正常,可以尝试:

  1. 安装 sof-firmware 驱动包
  2. 使用 alsamixer 调整内部通道(如将 "Auto-Mute" 关闭、调整 "Headphone" 或 "Speaker" 通道音量)

用opencode cli 或者 UOS-ai 能跑cli命令的AI 按照这个提示词给他分析:

你是一位 Linux 音频子系统(ALSA / ASoC / SOF / PipeWire)和华为笔记本硬件方向的排障专家。我现在遇到的问题是:

【设备】

  • 机型:Huawei MateBook 13s(i7-1260P / 12代 Alder Lake,具体声卡待探,常见为 ES8336 或类似低功耗 codec + 华为定制功放)
  • 系统:Linux(发行版和内核版本我会贴)
  • 现象:耳机有声,扬声器完全无声;alsamixer 里 Speaker / DAC 已确认非静音

【目标】
请你按下面 5 步帮我做多维度分析 + 修复,不要只给一句"试 quirk=xxx"。


Step 1|环境探测清单
请先告诉我需要采集哪些命令输出,我会贴回来。至少覆盖:

  • 内核版本:uname -r
  • 声卡识别:aplay -l, cat /proc/asound/cards
  • 驱动加载:lsmod | grep -E 'es8336|sof|snd_soc'
  • 内核日志:sudo dmesg | grep -iE 'sof|es83|essx|hda' | tail -60
  • ACPI/I2C 功放探测:ls /sys/bus/acpi/devices/ | grep -i hwsp; ls /sys/bus/i2c/devices/ | grep -iE 'HWSP|ESSX|es83'
  • UCM 配置:ls /usr/share/alsa/ucm2/Intel/ | grep -i essx
  • 当前 quirk:如果 /sys/module/snd_soc_sof_es8336/parameters/quirk 存在则读它
  • 拓扑文件:ls /lib/firmware/intel/sof-tplg/ | grep -iE 'es83|adl'
  • alsa 层:amixer -c N contents | grep -A3 'Jack|Speaker|DAC|Headphone'
    (N 替换为 aplay -l 里看到的卡号)

Step 2|GitHub / 社区项目检索
请主动检索以下方向的相关项目(不要只依赖我给的链接),挑出和 MateBook 13s 最接近的:

  • huawei-matebook-d15-speaker-fix(HWSP0001 功放类,13s 可能同款也可能不同)
  • sof-es8336 相关社区 patch / Arch Wiki / NixOS 讨论
  • yangxiaohua2009 的 sof-es8336 定制内核方向
  • 任何提到 MateBook 13s / 14s 扬声器修复的 issue 或 gist
    把每个项目适用的机型、声卡组合、修复思路简要列出来,再判断我的 13s 属于哪一类。

Step 3|多维度归因框架
收到我的环境输出后,请按下面 5 层逐层判断是哪一层的问题,每层给判断依据:
① 驱动层:sof-essx8336 是否 probe 成功、quirk 是否匹配 13s(12代 ADL 要留意 tplg 是 adl 还是 jsl 路径)
② tplg 层:sof-adl-es8336*.tplg 是否存在、DMIC/SSP 数是否匹配(13s 可能 SSP1 而非 SSP0)
③ UCM 层:HiFi.conf 里 Speaker Switch / Speaker Playback Volume / Headphone Mixer 是否定义齐全,是否默认 muted
④ 功放层:是否 HWSP0001 类 i2c 功放(13s 批次很可能是,需要 i2cset 回填寄存器 + 耳机插拔联动)
⑤ 路由层:PipeWire / PulseAudio 是否把输出口误判为 Headphone,Auto-Mute / Active Port 是否正确

Step 4|给出修复路径(分优先级)

  • 先给"最小改动验证法"(改 quirk + 确认 UCM + alsamixer 开开关),让我先确认扬声器硬件通路是通的
  • 再给"固化方案"(/etc/modprobe.d/ + update-initramfs + 如需则 systemd 守护 i2c 功放)
  • 如果判断是 HWSP0001 类,请给出适配 13s 的 i2c 总线探测方法(13s 的 i2c-designware 编号可能和 D15 不同,不能照搬 D15 的 i2c-2/i2c-4)

Step 5|验证清单
修复后让我逐项确认:扬声器出声、耳机插拔自动切换、睡眠唤醒后扬声器不哑、无爆音。


【附加要求】

  • 如果某一层的判断依据不足,请明确告诉我"需要补采 xx 命令",不要瞎猜
  • 13s 和 D15 的坑不完全一样(13s 更可能是 SSP1 + 不同功放地址),请不要直接套 D15 的 quirk=0x02 结论,先让我探环境再定
  • 如果检索到 GitHub 项目里有 13s 专属的 quirk 值或 i2c 地址,请优先采纳

我是安装的vscode 使用的codebuddy 插件,让AI全面检测系统,并分析github或gitee是否有对应硬件修复方案来解决的

Reply View the author