笔记本电脑内置扬声器没有声音,但耳机插孔和 HDMI 可用

笔记本电脑内置扬声器没有声音,但耳机插孔和 HDMI 可用

我刚买了一台华硕 Zenbook 14,型号 UX3402(在美国百思买购买时为 Q409Z)。它预装了 Windows 11,声音输出在 Windows 上完美运行。我在上面安装了 Ubuntu 22.04,除了内置扬声器外,其他一切都正常。它使用 Realtek ALC294 编解码器,键盘面板上显示 Harman/Kardon 和 Dolby Atmos 徽标。我尝试了所有建议,例如使用 hdajackretask 启用和路由各种引脚、强制 snd_hda_intel 内核模块(snd_sof_intel_hda 是默认值)、重新安装 alsa 和 pulseaudio、在 BIOS 中禁用 fastboot,但都不起作用。内置扬声器没有一点声音。我还尝试使用 hda-verb 调整 GPIO 分配,但没有成功。

有趣的是,耳机插孔和 HDMI 和 Thunderbolt/DisplayPort 的音频输出都可以正常工作。我可以插入耳机并听到声音,没有任何问题。因此,声音硬件显然是受支持的。我认为问题可能出在这台笔记本电脑的音响系统上。它使用环绕式音频设置,可能有 4 个扬声器。它也可能使用未启用的内置放大器。安装 Windows 时,设备管理器在“声音、视频和游戏控制器”下显示“Cirrus Logic Awesome Speaker Amps”设备:

在此处输入图片描述

但是,在 Ubuntu 下运行 lspci 时我没有看到任何有关此内容的信息。

这是声音驱动程序加载时 dmesg 的输出:

[    3.628292] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
[    3.628620] snd_hda_intel 0000:00:1f.3: Applying patch firmware 'hda-jack-retask.fw'
[    4.956625] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[    5.052007] snd_hda_codec_realtek hdaudioC0D0: autoconfig for ALC294: line_outs=1 (0x17/0x0/0x0/0x0/0x0) type:speaker
[    5.052013] snd_hda_codec_realtek hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
[    5.052016] snd_hda_codec_realtek hdaudioC0D0:    hp_outs=1 (0x21/0x0/0x0/0x0/0x0)
[    5.052017] snd_hda_codec_realtek hdaudioC0D0:    mono: mono_out=0x0
[    5.052018] snd_hda_codec_realtek hdaudioC0D0:    inputs:
[    5.052019] snd_hda_codec_realtek hdaudioC0D0:      Headset Mic=0x19

有谁在使用内置放大器的笔记本电脑时遇到过这个问题吗?

更新 1:

我认为笔记本电脑的扬声器依赖于通过 SPI 总线连接的 Cirrus Logic CS35L41 放大器 IC。不幸的是,我认为没有 Linux 驱动程序,因此无法启用它并向其发送命令。Cirrus Logic 员工显然正在开发一个驱动程序,但无法确定它是否/何时完成以及是否与这台笔记本电脑兼容:

在此处输入图片描述

更新2:

我安装了内核 5.18.0rc7,并从 dmesg 得到以下输出:

[    1.718769] platform CSC3551:00: hash matches
[    1.718805] acpi CSC3551:00: hash matches
[    2.896282] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[    2.989842] cs35l41_hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[    2.990220] cs35l41_hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22

看起来内核正在检测 SPI 总线上的安培,但由于 -22 错误而无法通过探测。因此,看起来事情越来越接近了,但还没有完全实现。

更新 3:

我打开笔记本电脑,看到主板上并排有两个 CS35L51X 芯片。所以这台笔记本电脑使用两个 CS35L51 放大器,而不是 CS35L41。不确定这是否重要,但它肯定是另一种(较新的?)芯片。

更新 4:

尝试使用内核 5.19.0rc4。仍然无法正常工作,尽管还有一条“平台不支持”消息。我猜这就是错误 -22 的含义:

[    4.807553] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[    5.053785] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: error -EINVAL: Platform not supported -22
[    5.053791] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[    5.054477] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: error -EINVAL: Platform not supported -22
[    5.054487] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22

更新 5:

尝试使用内核 6.0 RC3。我得到了与 Bo Gao 描述的相同的结果(缺少 ACPI _DSD 属性)。以下是 dmesg 输出:

[    4.245350] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 SPI devices.
[    4.674892] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Error: ACPI _DSD Properties are missing for HID CSC3551.
[    4.674953] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: error -EINVAL: Platform not supported
[    4.675000] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.0 failed with error -22
[    4.675363] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Error: ACPI _DSD Properties are missing for HID CSC3551.
[    4.675413] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: error -EINVAL: Platform not supported
[    4.675454] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -22

尽管 BIOS 中没有这些属性,但这些放大器在 Windows 上仍然运行良好。因此,也许可以从 Windows 安装中恢复这些属性。我的这台笔记本电脑上有 Linux/Windows 双启动,因此我可以轻松查找 Cirrus Logic 开源人员所需的任何东西(如果您在听,请告诉我!)。

更新 6:

我尝试使用 Bo Gao 引用的(修改过的)补丁编译 5.19 内核。至少有一个放大器似乎可以正常激活,但仍然没有声音,重新启动也无济于事。但是,我的设置不同。发布的 PCI 怪癖补丁可能不适用于这台笔记本电脑,因为放大器是通过 SPI 而不是 I2C 连接的,而引用的补丁似乎是针对 I2C 的。此外,这台笔记本电脑使用 Realtek ALC294 编解码器。以下是 dmesg 输出:

[    4.272896] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[    4.273073] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
[    4.377887] cs35l41-hda spi1-CSC3551:00-cs35l41-hda.1: Failed waiting for OTP_BOOT_DONE: -110
[    4.377984] cs35l41-hda: probe of spi1-CSC3551:00-cs35l41-hda.1 failed with error -110

我尝试了 Realtek 补丁中的几种 PCI 怪癖变体(以“ALC294”为前缀的那些),但都没有起作用。我不确定这些怪癖是否真的被选中。有什么方法可以验证它们是否处于活动状态?

答案1

我没有资格评论 Frithjof 的邮政,因此,以下是我需要进行的更改,以使音频在 UM3402YA 上正常工作。我使用的是当前的 Arch Linux 安装。

  1. 从以下位置下载并安装 Linux 内核 6.1-rc6www.kernel.org

当前 Arch 内核较新 -> 我跳过了这一步。

  1. 已安装的固件(debian:firmware-amd-graphics.deb)和 Cirrus 固件:https://github.com/CirrusLogic/linux-firmware/tree/main/cirrus

目前,我的设备 ( 1043:1e12) 的固件尚未合并。从开放拉取请求

  1. 应用此补丁(可能没有必要):https://www.spinics.net/lists/platform-driver-x86/msg35828.html

我运用了它。

  1. 在文件 linux/sound/pci/hda/cs35l42.c 第 1237 行添加了以下行:
 } else if (strncmp(hid, "CSC3551", 7) == 0) {
     hw_cfg->bst_type = CS35L41_INT_BOOST;
     hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
     hw_cfg->gpio1.valid = true;
 } else {

我修补了文件cs35l41_hda.c(不是cs35l42.c)。之后我仍然收到Error in Boost DT config消息,没有声音。我尝试了一下,找到了一个适合我的设置:hw_cfg->bst_type = CS35L41_EXT_BOOST;

  1. 构建内核,重启。您应该在 /var/log/syslog 中看到驱动程序加载:

对我有用:

[   11.501963] Serial bus multi instantiate pseudo device driver CSC3551:00: Instantiated 2 I2C devices.
[   11.894332] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
[   11.895040] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
[   11.928297] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
[   12.991402] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware version: 3
[   12.991405] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot-10431e12.wmfw: Fri 27 Aug 2021 14:58:19 W. Europe Daylight Time
[   13.486872] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware: 400a4 vendor: 0x2 v0.43.1, 2 algorithms
[   13.488019] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: 0: ID cd v29.63.1 XM@94 YM@e
[   13.488022] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: 1: ID f20b v0.1.0 XM@176 YM@0
[   13.488025] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: spk-prot: C:\Users\tyang\Desktop\Product Setting\SmartAMP\ASUS\ASUS_Zenbook\UM3402\Tuning_Release\220304\ASUS_UM3402_L_tuning_IDYC_ReDC_Finish_PICL_RTL_0304.bin
[   13.588115] snd_hda_codec_realtek hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.0 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
[   13.591407] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware version: 3
[   13.591409] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: cirrus/cs35l41-dsp1-spk-prot-10431e12.wmfw: Fri 27 Aug 2021 14:58:19 W. Europe Daylight Time
[   14.087987] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: Firmware: 400a4 vendor: 0x2 v0.43.1, 2 algorithms
[   14.089170] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: 0: ID cd v29.63.1 XM@94 YM@e
[   14.089175] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: 1: ID f20b v0.1.0 XM@176 YM@0
[   14.089181] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: DSP1: spk-prot: C:\Users\tyang\Desktop\Product Setting\SmartAMP\ASUS\ASUS_Zenbook\UM3402\Tuning_Release\220304\ASUS_UM3402_R_tuning_IDYC_ReDC_Finish_PICL_RTL_0304.bin
[   14.191727] snd_hda_codec_realtek hdaudioC1D0: bound i2c-CSC3551:00-cs35l41-hda.1 (ops cs35l41_hda_comp_ops [snd_hda_scodec_cs35l41])
  1. 仍然没有声音。对一个怪癖做了一个半有根据的猜测。将以下行添加到文件 linux/sound/pci/hda/patch_realtek.c 的第 9406 行:

是的。

  1. 通过扬声器测试声音。

有用 :)

答案2

我通过扬声器在 Asus Zenbook UM3402YA 上播放声音。步骤如下:

  1. 从以下位置下载并安装 Linux 内核 6.1-rc6www.kernel.org

  2. 已安装的固件(debian:firmware-amd-graphics.deb)和 Cirrus 固件:https://github.com/CirrusLogic/linux-firmware/tree/main/cirrus

  3. 应用此补丁(可能没有必要): https://www.spinics.net/lists/platform-driver-x86/msg35828.html

  4. 在文件 linux/sound/pci/hda/cs35l42.c 第 1237 行添加了以下行:

     } else if (strncmp(hid, "CSC3551", 7) == 0) {
         hw_cfg->bst_type = CS35L41_INT_BOOST;
         hw_cfg->gpio1.func = CS35l41_VSPK_SWITCH;
         hw_cfg->gpio1.valid = true;
     } else {
    
  5. 构建内核,重启。您应该在 /var/log/syslog 中看到驱动程序加载:

     debian kernel: [8.049401] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), Revision: B2
     debian kernel: [8.049544] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Reset line busy, assuming shared reset
     debian kernel: [8.083870] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), Revision: B2
    
  6. 仍然没有声音。对一个怪癖做了一个半有根据的猜测。将以下行添加到文件 linux/sound/pci/hda/patch_realtek.c 的第 9406 行:

     SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
    

    构建内核,重启。你应该发现固件已经加载:

     debian kernel: [8.582376] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: Firmware version: 3
     debian kernel: [8.582382] cs35l41-hda i2c-CSC3551:00-cs35l41-hda.0: DSP1: cirrus/cs35l41-dsp1-spk-prot.wmfw: Fri 24 Ju
    
  7. 通过扬声器测试声音。

更新:我答应再次检查新的 LTS 内核 6.1.4。步骤 4 和 6 中描述的补丁仍然需要。不知道 CS35L41_INT_BOOST 或 CS35L41_EXT_BOOST 是否正确(两者都有效)。确保您已在 /lib/firmware/cirrus 中安装了固件文件 cs35l41-dsp1-spk-prot.wmfw。

答案3

我的 UX3402 也遇到了同样的问题。我正忙于调试 ALC294 编解码器,但您发现的 cirrus 芯片帮助我找到了正确的方向。

我认为我已经发现了更多关于 cirrus 芯片的问题。据我所知,我们的设备有两个 cs35l41 通过 SPI 接口连接。我们在 ACPI 表中还有一个名为 CSC3551 的节点,它告诉操作系统在哪里可以找到这两个 csc35l41。我认为此补丁系列从 1 月份开始,该补丁将添加对 CSC3551 ACPI 节点的支持。该补丁首次发布于 5.18-rc1。

因此,我升级到了 5.18-rc7(也包含补丁),但……没有用。现在,我在 dmesg 中收到一个新错误。 [ 1.393985] Serial bus multi instantiate pseudo device driver CSC3551:00: error -ENODEV: failed to allocate SPI device CSC3551:00 from ACPI: -19

我不知道这意味着什么。我尝试进行一些调试,但没有取得很大进展。因此,我在 Linux Bugzilla 中提交了一个错误这里

PostScript:我强烈建议将内核升级到至少 5.17。我发现电池寿命明显改善了。5.18 甚至更好。Manjaro 使内核之间的切换变得非常容易

答案4

请查看此处描述的解决方案(SSDT 补丁):https://gist.github.com/lamperez/862763881c0e1c812392b5574727f6ff?permalink_comment_id=4531290#gistcomment-4531290

使用 6.3.7 内核。

相关内容