我的笔记本扬声器原本在 Windows 上好好的,换到 Linux 之后就不管用了。奇怪的是耳机有声音,唯独扬声器没有。软件之类的都检查过了,搜半天也没在网上搜到类似的情况,几个月后才在 DeepSeek 的帮助下找到解决方案,希望可以帮助到同样被这个问题困扰的人:

诊断方法

  1. 确认声卡和驱动
aplay -l                     # 查看播放设备
cat /proc/asound/cards       # 确认声卡型号和驱动
  1. 查看编解码器 (codec) 引脚分配
cat /proc/asound/card0/codec#0 | grep -E "Node 0x|Pin Default"

关注每个 Pin Complex 的 Pin Default 值。正常的内置扬声器引脚应配置为 0x90170110 之类。如果应该是扬声器的引脚显示 0x411111f0(意为"未连接"),说明 BIOS 错误地将扬声器引脚标记为未使用,导致 Linux 驱动不启用该引脚。

  1. hdajacksensetest 辅助判断
sudo hdajacksensetest -c 0 -a

如果某个引脚显示 present = Yes 但 Pin Default 却是 N/A,很可能是扬声器实际连接到了这个引脚。

  1. 临时验证修复 在 legacy HDA 驱动下,用 hda-verb 手动启用可疑引脚:
sudo hda-verb /dev/snd/hwC0D0 0x1b 0x707 0x40    # 设为输出
sudo hda-verb /dev/snd/hwC0D0 0x1b 0x70C 0x02    # 启用EAPD
sudo hda-verb /dev/snd/hwC0D0 0x1b 0x701 0x00    # 切换连接
sudo hda-verb /dev/snd/hwC0D0 0x1b 0x300 0xb000 0x00  # 取消静音
播放音频测试。如果能出声,说明诊断正确。

解决方案

SOF 驱动不支持引脚覆盖,需要使用 legacy HDA 驱动搭配 firmware 补丁。

  1. 创建引脚修正固件:
sudo tee /lib/firmware/alc233-fix.fw << 'EOF'
[codec]
0x10ec0235 0x27824a01 0

[pincfg]
0x1b 0x90170110
EOF

0x10ec0235 是 codec ID,0x27824a01 是子系统 ID,0x1b 是扬声器实际引脚,0x90170110 是正确配置。根据实际情况调整。)

  1. 配置 modprobe:
sudo tee /etc/modprobe.d/audio-fix.conf << 'EOF'
options snd-intel-dspcfg dsp_driver=1
options snd-hda-intel patch=alc233-fix.fw
EOF
  1. 重建 initramfs 并重启:
sudo mkinitcpio -P
sudo reboot