- 作者:
- 分类:知识&开发->OS->Linux基本
- 阅读:2
- 点赞:0
- 版权:CC BY-SA 4.0
- 创建:2026-08-07
- 更新:2026-08-07
原文链接(持续更新):https://neucrack.com/p/629
起因和解决
联想拯救者Y9000P 装好 Ubuntu Linux 后声音很小,没有低频声音,无功放驱动,于是尝试解决,过程借助了 AI 的力量帮忙完成,并且实测(Y9000P 2025 至尊版 Lenovo Legion Y9000P IAX10H) 成功使用起来了。
若干 Legion(如 Pro 7i 16IAX10H、Y9000P IAX10 / IAX10H、Pro 7 16AFR10H 等)在 Linux 下外放很小、发闷:高音直出正常,低音功放 Awinic AW88399 未接入 HDA 通路。
Windows 设备管理器常见名称:awinic smart amplifier driver for speaker。
ACPI HID:AWDZ8399。
主线已有 ASoC 驱动 snd_soc_aw88399,但挂在 Realtek ALC287 HDA 后面时需要额外的 HDA side-codec。在驱动合入发行版内核前,需要打补丁并另装一套内核(不覆盖现有内核)。
社区参考:
- 补丁与说明:https://github.com/nadimkobeissi/16iax10h-linux-sound-saga
- 上游相关讨论 / 补丁系列(持续演进,以仓库为准)
0. 是否适用
同时满足再继续:
# 机型与 codec(示例)cat /sys/class/dmi/id/product_namecat /proc/asound/card*/codec#* | head -20# 应能看到 AWDZ8399ls /sys/bus/i2c/devices/ | grep -i AWDZ8399# 或sudo strings /sys/firmware/acpi/tables/DSDT | grep AWDZ8399
典型症状:
aplay -l有 Realtek(如 ALC287),Speaker 能出声但很小、缺低音lsmod | grep aw88399可能有snd_soc_aw88399,但 refcount 为 0- 模块目录里没有
snd-hda-scodec-aw88399
1. 原则(安全)
| 项 | 做法 |
|---|---|
| 内核 | 必须编内核;只装用户态驱动不够 |
| 安装方式 | 旁路安装新内核,保留原发行版内核 |
| 默认启动 | 先保持默认进旧内核;在 GRUB 手动选新内核验证 |
| Secure Boot | 未签名自定义内核:先关闭 Secure Boot,或自行签名 |
| 配置 | 以当前正在用的内核 config 为底,只打开 AW88399 相关选项 |
2. 准备
2.1 依赖(Debian/Ubuntu 示例)
sudo apt updatesudo apt install -y build-essential bison flex libssl-dev libelf-dev \dwarves libncurses-dev gawk bc xz-utils rsync fakeroot
无 conda 等自备工具也可以,只要 gcc/make/bison/flex/gawk 与 libelf 头文件可用。
2.2 工作目录
mkdir -p ~/src/aw88399-kernel && cd ~/src/aw88399-kernel
下文均在此目录操作。
2.3 固件
需要 /lib/firmware/aw88399_acf.bin。
可从社区仓库拷贝,或从本机 Windows 音频驱动包中提取(见社区 README / Kernel Bugzilla 相关说明)。
# 若仓库提供固件:# cp fix/firmware/aw88399_acf.bin /tmp/aw88399_acf.binsudo cp /path/to/aw88399_acf.bin /lib/firmware/aw88399_acf.bin
3. 下载源码与补丁
补丁版本需与内核源码版本匹配。以社区当前常见的 Linux 7.1.6 为例(以仓库 fix/patches/ 实际文件名为准):
cd ~/src/aw88399-kernel# 内核源码curl -LO https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.1.6.tar.xztar -xf linux-7.1.6.tar.xz# 补丁(URL 以仓库为准)curl -LO https://raw.githubusercontent.com/nadimkobeissi/16iax10h-linux-sound-saga/main/fix/patches/16iax10h-audio-linux-7.1.6.patchcd linux-7.1.6patch -p1 < ../16iax10h-audio-linux-7.1.6.patch
应看到约十余个文件被修改/新增,其中包括:
sound/hda/codecs/side-codecs/aw88399_hda*.csound/hda/codecs/realtek/alc269.c(机型 quirk)
确认本机 codec SSID 是否在 quirk 表中(常见 Legion:0x17aa:0x3906 等)。若没有,需要自行补 quirk 后再编。
4. 配置内核
用当前运行中的发行版内核配置做底(尽量一致):
cd ~/src/aw88399-kernel/linux-7.1.6cp /boot/config-$(uname -r) .config# 自定义未签名内核:清空发行版证书路径,否则可能编不过./scripts/config --set-str SYSTEM_TRUSTED_KEYS ''./scripts/config --set-str SYSTEM_REVOCATION_KEYS ''# 独立版本后缀,避免覆盖发行版内核包名./scripts/config --set-str LOCALVERSION '-aw88399-audio'./scripts/config --disable LOCALVERSION_AUTO# 可选:减小体积 / 降低对 pahole 的依赖./scripts/config --disable DEBUG_INFO_BTF./scripts/config --disable DEBUG_INFO_BTF_MODULES./scripts/config --enable DEBUG_INFO_NONE# AW88399 / 相关(按社区指南)./scripts/config --module SND_HDA_SCODEC_AW88399./scripts/config --module SND_HDA_SCODEC_AW88399_I2C./scripts/config --module SND_SOC_AW88399./scripts/config --enable SND_SOC_SOF_INTEL_TOPLEVEL./scripts/config --module SND_SOC_SOF_INTEL_COMMON./scripts/config --module SND_SOC_SOF_INTEL_MTL./scripts/config --module SND_SOC_SOF_INTEL_LNLmake olddefconfig# 核对grep -E 'CONFIG_SND_HDA_SCODEC_AW88399|CONFIG_LOCALVERSION=' .config
期望类似:
CONFIG_LOCALVERSION="-aw88399-audio"CONFIG_SND_HDA_SCODEC_AW88399=mCONFIG_SND_HDA_SCODEC_AW88399_I2C=m
make -s kernelrelease 应类似:7.1.6-aw88399-audio。
5. 编译
cd ~/src/aw88399-kernel/linux-7.1.6make -j"$(nproc)"
成功标志:
arch/x86/boot/bzImage存在- 存在模块:
sound/hda/codecs/side-codecs/snd-hda-scodec-aw88399.kosound/hda/codecs/side-codecs/snd-hda-scodec-aw88399-i2c.ko
可用:
modinfo sound/hda/codecs/side-codecs/snd-hda-scodec-aw88399-i2c.ko | grep -E 'alias|firmware|vermagic'
应看到 acpi*:AWDZ8399:* 与固件 aw88399_acf.bin。
也可用
make bindeb-pkg打 deb 再dpkg -i,需满足 debhelper 等打包依赖。下文用「直接安装」方式,同样可旁路共存。
6. 旁路安装(不覆盖旧内核)
将 KVER 换成上一步的 kernelrelease:
KVER="$(make -s kernelrelease)" # 在 linux-源码目录内echo "$KVER"# 安装模块与启动文件(名称带 LOCALVERSION,不会覆盖发行版文件)sudo make modules_install INSTALL_MOD_STRIP=1sudo cp -f arch/x86/boot/bzImage "/boot/vmlinuz-${KVER}"sudo cp -f System.map "/boot/System.map-${KVER}"sudo cp -f .config "/boot/config-${KVER}"# 让 DKMS 能找到头文件(保留源码目录不要删)sudo ln -sfn "$(pwd)" "/lib/modules/${KVER}/build"sudo ln -sfn "$(pwd)" "/lib/modules/${KVER}/source"sudo update-initramfs -c -k "${KVER}"
GRUB:显示菜单,默认仍进旧内核
# 备份sudo cp -a /etc/default/grub "/etc/default/grub.bak.$(date +%Y%m%d)"# 显示菜单(示例 5 秒;按发行版习惯调整)sudo sed -i \-e 's/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/' \-e 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=5/' \/etc/default/grub# 默认仍启动「安装补丁前」正在用的内核,例如:OLD="$(uname -r)" # 请在仍运行旧内核时记录,或手写版本号sudo tee /etc/default/grub.d/99-keep-stock-kernel.cfg >/dev/null <<EOFGRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux ${OLD}"EOFsudo update-grub
Fedora / 其他发行版的 initramfs、GRUB 路径按本发行版习惯替换(dracut、grub2-mkconfig 等)。
7. NVIDIA 等 DKMS 驱动
自定义内核不带发行版预编译的 nvidia 模块,需对新内核编 DKMS:
# 查看已装 DKMS 包名与版本dkms status# 示例:nvidia 580.x(版本以 dkms status 为准)sudo dkms install nvidia/<VERSION> -k "${KVER}"# 其他常见:VirtualBox、xone 手柄等同样处理# sudo dkms install xone/<VERSION> -k "${KVER}"
装好后可 sudo modprobe nvidia && nvidia-smi,或重启进新内核。
8. 重启验证
- 重启,在 GRUB 选择:
Advanced options→... Linux 7.1.6-aw88399-audio(名称以实际为准) - 验证:
uname -rlsmod | grep -E 'aw88399|scodec_aw'dmesg | grep -iE 'aw88399|AWDZ8399'# 播放测试;低音应明显改善speaker-test -c 2 -t wav
期望:
- 加载
snd_hda_scodec_aw88399/snd_hda_scodec_aw88399_i2c - dmesg 中功放初始化成功,而不只是 ASoC 模块空挂着
有问题立刻重启,选回原发行版内核即可。
9. apt / 日常软件说明
| 类型 | 换内核后 |
|---|---|
| 普通 apt / pip / 用户态软件 | 一般不受影响 |
| Snap / Flatpak | 一般可用 |
| DKMS / 内核模块(NVIDIA、VirtualBox、手柄驱动等) | 必须对新内核再 dkms install |
| 官方内核升级 | 不会自动带上本补丁;继续选自定义内核,或等上游合入后再迁回 |
首次进入新内核时,模块冷缓存、桌面 portal / 独显初始化可能让前几分钟偏钝,多开一两次通常会好转。
10. 卸载自定义内核
KVER=7.1.6-aw88399-audio # 按实际sudo rm -f /boot/vmlinuz-${KVER} /boot/System.map-${KVER} \/boot/config-${KVER} /boot/initrd.img-${KVER}sudo rm -rf /lib/modules/${KVER}sudo rm -f /etc/default/grub.d/99-keep-stock-kernel.cfgsudo update-grub# 可选:删除源码目录 ~/src/aw88399-kernel
排错速查
| 现象 | 排查 |
|---|---|
| 补丁打不上 | 内核版本与 patch 文件名不一致 |
| 外放仍小 | 未进自定义内核;或 quirk 未覆盖本机 codec SSID;或缺固件 |
snd_soc_aw88399 refcnt=0 |
仍缺 HDA side-codec,确认 snd-hda-scodec-aw88399* 已加载 |
| 黑屏 / 无独显 | 对新内核执行 nvidia DKMS;确认 Secure Boot 状态 |
编不过 gelf.h / gawk |
安装 libelf-dev、gawk |
| 编不过证书相关 | 清空 SYSTEM_TRUSTED_KEYS / SYSTEM_REVOCATION_KEYS |
流程一览
确认 AWDZ8399 / 外放异常→ 安装固件 aw88399_acf.bin→ 下载匹配版本内核源码 + 社区补丁→ 用当前 /boot/config-$(uname -r) + 打开 AW88399 选项→ make -j$(nproc)→ modules_install + 拷贝 vmlinuz(旁路名)→ update-initramfs / update-grub(默认仍旧内核)→ dkms install nvidia/... -k 新内核→ GRUB 选手动进新内核验证外放
上游合入发行版内核并带上本机 quirk 后,可迁回官方内核并删除本自定义内核。
