Syn*_*tix 7 audio linux speakers drivers cirrus-logic
我刚刚购买了华硕 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扬声器放大器”设备:
然而,我在 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
Run Code Online (Sandbox Code Playgroud)
有人在使用内置放大器的笔记本电脑上遇到过这个问题吗?
更新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
Run Code Online (Sandbox Code Playgroud)
看起来内核正在检测 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
Run Code Online (Sandbox Code Playgroud)
更新5:
尝试使用内核 6.0 RC3。我得到了下面 Bo Gau 描述的相同结果(缺少 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
Run Code Online (Sandbox Code Playgroud)
尽管 BIOS 中缺少这些属性,这些放大器仍然可以在 Windows 上完美运行。因此,也许这些属性可以从 Windows 安装中恢复。我在这台笔记本电脑上安装了 Linux/Windows 双启动系统,因此我可以轻松查找 Cirrus Logic 开源人员所需的任何内容(如果您在听,请告诉我!)。
更新6:
我尝试使用 Bo Gau 引用的(修改后的)补丁编译 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
Run Code Online (Sandbox Code Playgroud)
我尝试了 Realtek 补丁中 PCI 怪癖的一些变体(前缀为“ALC294”的补丁),但没有任何效果。我不确定这些怪癖是否真的被选择了。有什么方法可以验证它们是否活跃?
小智 2
我的 UX3402 也面临同样的困境。当您发现 cirrus 芯片帮助我走上正轨时,我正忙于调试 ALC294 编解码器。
我想我已经对卷云芯片的问题有了更多的了解。AFAICT,我们的设备有两个通过 SPI 接口连接的 cs35l41。我们在 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 使内核之间的切换变得非常容易
| 归档时间: |
|
| 查看次数: |
14707 次 |
| 最近记录: |