机械革命 15x 的 linux 音频爆音 codec检测不到修复——model参数

本文最后更新于 2025年9月14日 下午

笔记本机器型号是机械革命 15X(还得是鸡哥 = =),环境 Archlinux。15X的ALSA 枚举到两块编解码器(codec):一块 HDMI(ATI R6xx HDMI),一块内置声卡 Conexant SN6140
fastfetch信息如下

image.png

症状

音频出现问题的症状是系统运行一段时间后出现爆音、破音 、噼啪声,严重时这种杂音会非常大,大到多看一眼就要爆炸的地步。 且偶发开机没有内置扬声器输出,只有三个hdmi输出的情况,此时直接reboot大概率还是“掉声卡”,只有冷重启,即长按电源数十秒后再开机可能内置扬声器输出又回来了。没有内置扬声器输总是伴随dmesg日志里有snd_hda_intel 0000:64:00.6: no codecs found!记录(64:00.6是我的设备名,即主要问题是找不到编解码器)。

  • 这个问题困扰了我很久,包括但不限于的尝试如下:
    • amd-ucode 微码更新
    • linux内核的更新,包括zen和lts(6.13+开始)
    • 安装/更新sof-firmware
    • snd_hda_intel.single_cmd=1:强制控制器以单命令模式工作
    • snd_hda_intel.enable_msi=0:禁用 MSI 中断
    • bios更新至官网目前的最新2025-01
    • bios电源切换为性能模式
    • snd_hda_intel.dmic_detect=0 禁用数字麦克风驱动路径

一些基础信息

开机识别不到编解码器:

1
sudo dmesg | grep -i -E "(audio|sound|alsa|hda|card)"
1
2
3
4
5
[ 5.385940] snd_hda_intel 0000:64:00.1: enabling device (0000 -> 0002) 
[ 5.386051] snd_hda_intel 0000:64:00.1: Handle vga_switcheroo audio client
[ 5.386219] snd_hda_intel 0000:64:00.6: enabling device (0000 -> 0002)
[ 5.390353] snd_hda_intel 0000:64:00.6: no codecs found!
[ 5.401322] snd_hda_intel 0000:64:00.1: bound 0000:64:00.0 (ops amdgpu_dm_audio_component_bind_ops [amdgpu])
  • cat /proc/asound/card*/codec* 能明确看到:

    • Codec: ATI R6xx HDMI(外接 HDMI 音频)
    • Codec: Conexant SN6140(内置 HDA 音频)
  • sudo dmesg | grep -i "hda.*model\|snd.*model\|codec.*model" 无输出

  • cat /sys/class/sound/card*/id 输出 Generic / Generic_1

问题定位:爆音原因

机革15x目前音频还是由HDA(High Definition Audio)驱动,即便安装了sof-firmware,sof也不会接管声卡(猜测机子算比较新的amd?)
但HDA在初始化时,需要根据引脚默认值(pin default)、机型特性和硬件连线,完成通路路由(Mixer/Widget 连接)功放与 EAPD插拔/耳麦检测等设置。若实际机器与通用策略(generic path)存在偏差,常见后果包括:

  • 某些引脚的方向/用途不匹配(例如麦克风/喇叭的路由与硬件设计不一致);
  • 放大器、电源门控(power gating)或 EAPD 时序不对,导致“启/停电”瞬间产生噪声;
  • 插孔或内置麦/喇叭的检测与自动切换不可靠。

在这台机器上,直观表现就是长时间开机运行系统,偶发扬声器突然的爆音、破音,以及电源状态切换后不稳定,偶发开机后检测不到内置扬声器输出,codec初始化失败。结合 codec 枚举结果,可以把怀疑点集中到 SN6140 的初始化策略 上。

关键改动:model=laptop-amic

snd-hda-intelmodel 指定为 laptop-amic 后,问题即刻消失,目前几天时间内复测
各种播放视频、音乐均稳定。

配置:

1
2
3
4
# 配置
echo 'options snd_hda_intel power_save=0 power_save_controller=N model=laptop-amic probe_mask=1' | sudo tee /etc/modprobe.d/alsa-hda.conf

# 重启

参数说明

  • power_save

    • 控制 codec 的省电空闲时间(单位秒)。默认值往往是 1 秒,也就是说空闲 1 秒就会把 codec 掉电。
    • 设置为 0 表示禁用 codec 空闲省电,让它始终保持在工作状态。
  • power_save_controller

    • 控制 HDA 控制器本身是否参与省电。
    • 设置为 N 就是禁止 HDA 控制器进入节能状态。
  • model=laptop-amic

    • 指定使用 笔记本模拟麦克风 (Analog Mic) 的引脚配置模板。
    • 修正了 BIOS 提供的错误或不完整的 pin default,确保内置扬声器、耳机孔、内置麦克风正确路由。
    • 启用必要的 EAPD(功放控制),避免因初始化不当导致的爆音、杂音和自动静音失效。
  • probe_mask=1

    • 控制 snd_hda_intel 驱动在初始化时只探测第一个 codec。
    • 屏蔽掉 GPU 的 HDMI codec,仅保留 Conexant SN6140 作为默认声卡。
    • 避免 HDMI 与内置声卡竞争默认输出设备,保证系统始终加载并使用正确的那一块声卡。

其他机型的修改参考

查阅archlinux论坛会发现很多与内置麦克风杂音/无声等问题也与codec有关,更通用的一个解决方案是:

  1. 运行下面的命令,检查你机器上的音频 codec:
    1
    cat /proc/asound/card*/codec* | grep Codec
  2. 你可能会看到类似这样的输出(既包含音频也包含视频 codec):
    1
    2
    Codec: ATI R6xx HDMI
    Codec: Realtek ALC256
  3. 打开官方内核文档:
    https://www.kernel.org/doc/html/latest/sound/hd-audio/models.html
  4. 在文档中找到对应的 codec 版本,并获取它的完整名称。
    例如,我找到了这一部分:
    1
    ALC22x/23x/25x/269/27x/28x/29x (and vendor-specific ALC3xxx models)
  5. 在列表中,我选择了 laptop-amic
    另外,我没有改用更具体的 Realtek ALC256 配置名称,像华硕、联想的品牌机设置可能不适合鸡哥)
  6. 创建或更新 /etc/modprobe.d/alsa-base.conf 文件,并加入以下这一行(把 laptop-amic 替换成与你 codec 匹配的 model 名称):
    1
    options snd-hda-intel model=laptop-amic
  7. 重启系统。

为什么 card*/id 还是 Generic

1
2
3
4
cat /sys/class/sound/card*/id

Generic
Generic_1

/sys/class/sound/card*/id 反映的是声卡控制器的用户可读名称,与 model=... 选择的codec 初始化策略不是同一层级的对象。前者保持 Generic / Generic_1 完全正常,不影响通过 model 生效特定的引脚/路由修复。

电源管理

我还在使用TLP,对于TLP的电源管理配置文件,把 SN6140 所在的 PCI 功能进行黑名单/禁用 Runtime PM,防止未插电开机出现codec检测失效问题

1
2
3
4
5
6
7
# /etc/tlp.conf(片段)

# 使用完整PCI地址(示例)
RUNTIME_PM_BLACKLIST="0000:64:00.6"

# 对该设备强制禁用 Runtime PM(优先级更高)
RUNTIME_PM_DISABLE="64:00.6"

两点说明:

  • 形如”0000:64:00.6”的地址用 lspci -v | grep -A 10 -B 2 "Audio device" 获取
  • 如启用了 powertop --auto-tune,可能在会话层面“改写”电源设置,因此用 TLP 的禁用项做兜底。

验证模块参数是否传递成功

内核模块加载时会把参数挂在 /sys/module/snd_hda_intel/parameters/ 下:

1
cat /sys/module/snd_hda_intel/parameters/model 

这里应该会显示:(后面null正常)

1
laptop-amic,(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null),(null)

一些知识,关于引脚配置

什么是 HDA Codec 的引脚(Pin)

  • 在 Intel HDA(High Definition Audio)架构里,声卡芯片(Codec,比如 Realtek ALC256、Conexant SN6140)并不是直接“声卡 = 输出/输入端口”。

  • 芯片内部有很多 功能节点(nodes),其中最关键的是 Pin Widget

    • 每个 Pin 对应一个物理接口(耳机孔、扬声器、麦克风接口、HDMI 输出等)。
    • Pin 有自己的 ID(0x14, 0x15, 0x1a …)。
    • Pin 还带有能力描述(wcaps),比如是否支持输入、输出、放大器、检测插拔等。
      简单理解:Pin 就是 Codec 芯片内部映射出来的“插孔定义”。

2. 引脚配置(Pin Configuration)

  • 每个 Pin 在出厂时会被 BIOS/ACPI 写入一份 默认配置(default pin config)

  • 配置内容包括:

    • 这个 Pin 是耳机输出?还是内置扬声器?

    • 是否能检测插拔?

    • 是否要用作模拟麦克风还是数字麦克风?

    • 电源控制方式(EAPD、GPIO)。

👉 作用:决定了 ALSA 驱动初始化时如何理解你的硬件布局。


3. 为什么会出问题

  • 很多笔记本厂商(尤其是国内品牌 / 小厂)BIOS 提供的 Pin 配置写得不规范

    • 内置麦克风标成了 dmic(数字),但实际上是模拟 → 麦克风没声。

    • 扬声器和耳机 pin 配错 → 插耳机时仍然从扬声器放音。

    • 没有正确配置 EAPD → 扬声器音量极低或爆音。

  • ALSA 驱动在遇到这些情况时,只能 fallback 到 Generic,导致功能残缺。


4. ALSA 的 “model=” 参数怎么用的

  • snd-hda-intel 驱动里,每个 model=xxx 都对应一份 预定义的 pin 配置表(quirk/fixup)。

  • 比如:

    • laptop-amic → 强制把某些 Pin 配置为“模拟麦克风输入”,修复 BIOS 配错 dmic 的情况。

    • alc256-asus-mic → 对 ASUS 某些笔记本专门写死的引脚映射。

    • headset-mic → 把一个 combo jack 同时作为耳机和麦克风使用。

👉 原理:绕过 BIOS 给的垃圾配置,直接套用一份驱动开发者验证过的“更靠谱”的表。


5. 引脚配置在音频中的实际作用

  • 决定哪些物理接口可用:耳机孔、麦克风孔、内置扬声器。

  • 决定自动切换逻辑:插耳机时是否自动静音扬声器(Auto-Mute)。

  • 决定录音效果:是否能区分内置麦克风 vs 外置麦克风。

  • 决定音质和稳定性:错误的 pin 配置可能导致爆音、底噪、放大器失效。


机械革命 15x 的 linux 音频爆音 codec检测不到修复——model参数
https://inkcodes.com/2025/09/14/机械革命 15x的 linux 音频爆音 codec检测不到修复——model参数/
作者
Specialhua
发布于
2025年9月14日
更新于
2025年9月14日
许可协议