选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2026-08-07
  • 更新:2026-08-07


起因和解决

联想拯救者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。在驱动合入发行版内核前,需要打补丁并另装一套内核(不覆盖现有内核)。

社区参考:

0. 是否适用

同时满足再继续:

  1. # 机型与 codec(示例)
  2. cat /sys/class/dmi/id/product_name
  3. cat /proc/asound/card*/codec#* | head -20
  4. # 应能看到 AWDZ8399
  5. ls /sys/bus/i2c/devices/ | grep -i AWDZ8399
  6. # 或
  7. 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 示例)

  1. sudo apt update
  2. sudo apt install -y build-essential bison flex libssl-dev libelf-dev \
  3. dwarves libncurses-dev gawk bc xz-utils rsync fakeroot

无 conda 等自备工具也可以,只要 gcc/make/bison/flex/gawk 与 libelf 头文件可用。

2.2 工作目录

  1. mkdir -p ~/src/aw88399-kernel && cd ~/src/aw88399-kernel

下文均在此目录操作。

2.3 固件

需要 /lib/firmware/aw88399_acf.bin

可从社区仓库拷贝,或从本机 Windows 音频驱动包中提取(见社区 README / Kernel Bugzilla 相关说明)。

  1. # 若仓库提供固件:
  2. # cp fix/firmware/aw88399_acf.bin /tmp/aw88399_acf.bin
  3. sudo cp /path/to/aw88399_acf.bin /lib/firmware/aw88399_acf.bin

3. 下载源码与补丁

补丁版本需与内核源码版本匹配。以社区当前常见的 Linux 7.1.6 为例(以仓库 fix/patches/ 实际文件名为准):

  1. cd ~/src/aw88399-kernel
  2. # 内核源码
  3. curl -LO https://cdn.kernel.org/pub/linux/kernel/v7.x/linux-7.1.6.tar.xz
  4. tar -xf linux-7.1.6.tar.xz
  5. # 补丁(URL 以仓库为准)
  6. curl -LO https://raw.githubusercontent.com/nadimkobeissi/16iax10h-linux-sound-saga/main/fix/patches/16iax10h-audio-linux-7.1.6.patch
  7. cd linux-7.1.6
  8. patch -p1 < ../16iax10h-audio-linux-7.1.6.patch

应看到约十余个文件被修改/新增,其中包括:

  • sound/hda/codecs/side-codecs/aw88399_hda*.c
  • sound/hda/codecs/realtek/alc269.c(机型 quirk)

确认本机 codec SSID 是否在 quirk 表中(常见 Legion:0x17aa:0x3906 等)。若没有,需要自行补 quirk 后再编。


4. 配置内核

当前运行中的发行版内核配置做底(尽量一致):

  1. cd ~/src/aw88399-kernel/linux-7.1.6
  2. cp /boot/config-$(uname -r) .config
  3. # 自定义未签名内核:清空发行版证书路径,否则可能编不过
  4. ./scripts/config --set-str SYSTEM_TRUSTED_KEYS ''
  5. ./scripts/config --set-str SYSTEM_REVOCATION_KEYS ''
  6. # 独立版本后缀,避免覆盖发行版内核包名
  7. ./scripts/config --set-str LOCALVERSION '-aw88399-audio'
  8. ./scripts/config --disable LOCALVERSION_AUTO
  9. # 可选:减小体积 / 降低对 pahole 的依赖
  10. ./scripts/config --disable DEBUG_INFO_BTF
  11. ./scripts/config --disable DEBUG_INFO_BTF_MODULES
  12. ./scripts/config --enable DEBUG_INFO_NONE
  13. # AW88399 / 相关(按社区指南)
  14. ./scripts/config --module SND_HDA_SCODEC_AW88399
  15. ./scripts/config --module SND_HDA_SCODEC_AW88399_I2C
  16. ./scripts/config --module SND_SOC_AW88399
  17. ./scripts/config --enable SND_SOC_SOF_INTEL_TOPLEVEL
  18. ./scripts/config --module SND_SOC_SOF_INTEL_COMMON
  19. ./scripts/config --module SND_SOC_SOF_INTEL_MTL
  20. ./scripts/config --module SND_SOC_SOF_INTEL_LNL
  21. make olddefconfig
  22. # 核对
  23. grep -E 'CONFIG_SND_HDA_SCODEC_AW88399|CONFIG_LOCALVERSION=' .config

期望类似:

  1. CONFIG_LOCALVERSION="-aw88399-audio"
  2. CONFIG_SND_HDA_SCODEC_AW88399=m
  3. CONFIG_SND_HDA_SCODEC_AW88399_I2C=m

make -s kernelrelease 应类似:7.1.6-aw88399-audio


5. 编译

  1. cd ~/src/aw88399-kernel/linux-7.1.6
  2. make -j"$(nproc)"

成功标志:

  • arch/x86/boot/bzImage 存在
  • 存在模块:
    • sound/hda/codecs/side-codecs/snd-hda-scodec-aw88399.ko
    • sound/hda/codecs/side-codecs/snd-hda-scodec-aw88399-i2c.ko

可用:

  1. 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

  1. KVER="$(make -s kernelrelease)" # 在 linux-源码目录内
  2. echo "$KVER"
  3. # 安装模块与启动文件(名称带 LOCALVERSION,不会覆盖发行版文件)
  4. sudo make modules_install INSTALL_MOD_STRIP=1
  5. sudo cp -f arch/x86/boot/bzImage "/boot/vmlinuz-${KVER}"
  6. sudo cp -f System.map "/boot/System.map-${KVER}"
  7. sudo cp -f .config "/boot/config-${KVER}"
  8. # 让 DKMS 能找到头文件(保留源码目录不要删)
  9. sudo ln -sfn "$(pwd)" "/lib/modules/${KVER}/build"
  10. sudo ln -sfn "$(pwd)" "/lib/modules/${KVER}/source"
  11. sudo update-initramfs -c -k "${KVER}"

GRUB:显示菜单,默认仍进旧内核

  1. # 备份
  2. sudo cp -a /etc/default/grub "/etc/default/grub.bak.$(date +%Y%m%d)"
  3. # 显示菜单(示例 5 秒;按发行版习惯调整)
  4. sudo sed -i \
  5. -e 's/^GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/' \
  6. -e 's/^GRUB_TIMEOUT=.*/GRUB_TIMEOUT=5/' \
  7. /etc/default/grub
  8. # 默认仍启动「安装补丁前」正在用的内核,例如:
  9. OLD="$(uname -r)" # 请在仍运行旧内核时记录,或手写版本号
  10. sudo tee /etc/default/grub.d/99-keep-stock-kernel.cfg >/dev/null <<EOF
  11. GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux ${OLD}"
  12. EOF
  13. sudo update-grub

Fedora / 其他发行版的 initramfs、GRUB 路径按本发行版习惯替换(dracutgrub2-mkconfig 等)。


7. NVIDIA 等 DKMS 驱动

自定义内核不带发行版预编译的 nvidia 模块,需对新内核编 DKMS:

  1. # 查看已装 DKMS 包名与版本
  2. dkms status
  3. # 示例:nvidia 580.x(版本以 dkms status 为准)
  4. sudo dkms install nvidia/<VERSION> -k "${KVER}"
  5. # 其他常见:VirtualBox、xone 手柄等同样处理
  6. # sudo dkms install xone/<VERSION> -k "${KVER}"

装好后可 sudo modprobe nvidia && nvidia-smi,或重启进新内核。


8. 重启验证

  1. 重启,在 GRUB 选择:
    Advanced options... Linux 7.1.6-aw88399-audio(名称以实际为准)
  2. 验证:
  1. uname -r
  2. lsmod | grep -E 'aw88399|scodec_aw'
  3. dmesg | grep -iE 'aw88399|AWDZ8399'
  4. # 播放测试;低音应明显改善
  5. 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. 卸载自定义内核

  1. KVER=7.1.6-aw88399-audio # 按实际
  2. sudo rm -f /boot/vmlinuz-${KVER} /boot/System.map-${KVER} \
  3. /boot/config-${KVER} /boot/initrd.img-${KVER}
  4. sudo rm -rf /lib/modules/${KVER}
  5. sudo rm -f /etc/default/grub.d/99-keep-stock-kernel.cfg
  6. sudo update-grub
  7. # 可选:删除源码目录 ~/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-devgawk
编不过证书相关 清空 SYSTEM_TRUSTED_KEYS / SYSTEM_REVOCATION_KEYS

流程一览

  1. 确认 AWDZ8399 / 外放异常
  2. 安装固件 aw88399_acf.bin
  3. 下载匹配版本内核源码 + 社区补丁
  4. 用当前 /boot/config-$(uname -r) + 打开 AW88399 选项
  5. make -j$(nproc)
  6. modules_install + 拷贝 vmlinuz(旁路名)
  7. update-initramfs / update-grub(默认仍旧内核)
  8. dkms install nvidia/... -k 新内核
  9. GRUB 选手动进新内核验证外放

上游合入发行版内核并带上本机 quirk 后,可迁回官方内核并删除本自定义内核。

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-967rgd.jpg