Cirrus Logic CS35L54/56/57/63 增强型智能放大器的音频驱动程序¶
- 版权所有:
2025 Cirrus Logic, Inc. 和 Cirrus Logic International Semiconductor Ltd.
联系方式: patches@opensource.cirrus.com
摘要¶
本文档的高级摘要是
如果您的笔记本电脑使用 CS35L54/56/57/63 放大器,但音频无法正常工作,请勿尝试使用来自其他笔记本电脑的固件和设置,即使该笔记本电脑看起来很相似。
CS35L54/56/57/63 放大器必须针对电源电压、扬声器阻抗、最大扬声器电压/电流和其他外部硬件连接进行正确配置。
这些放大器具有先进的升压技术,可以提高用于驱动扬声器的电压,而专有的扬声器保护算法使这些升压放大器可以在不损坏扬声器的情况下突破扬声器的极限。这些必须正确配置。
支持的 Cirrus Logic 放大器¶
cs35l56 驱动程序支持
CS35L54
CS35L56
CS35L57
CS35L63
内核中有两个驱动程序
对于使用 SoundWire 的系统:sound/soc/codecs/cs35l56.c 及相关文件
对于使用 HDA 的系统:sound/pci/hda/cs35l56_hda.c
固件¶
放大器由在内部 DSP 上运行的固件控制和管理。固件文件对于启用放大器的全部功能至关重要。
固件发布在 linux-firmware 存储库中: https://gitlab.com/kernel-firmware/linux-firmware.git
在大多数 SoundWire 系统上,放大器具有产生音频的默认最低能力。但是,这将是
音量很小,以保护扬声器,因为扬声器规格和电源电压未知。
左声道和右声道的单声道混合。
在某些同时具有 CS42L43 和 CS35L56/57 的 SoundWire 系统上,CS35L56/57 从 CS42L43 接收音频,而不是直接从主机 SoundWire 接口接收音频。 这些系统可以通过在 dmesg 中将 CS42L43 显示为 SoundWire 设备,而将 CS35L56/57 显示为 SPI 来识别。 在这些系统上,固件是强制性的,以启用从 CS42L43 接收音频。
在 HDA 系统上,固件是强制性的,以启用 HDA 桥接模式。 没有固件,放大器将不会发出任何声音。
Cirrus Logic 固件文件¶
每个放大器需要两个固件文件。 一个文件的后缀为 .wmfw,另一个文件的后缀为 .bin。
固件由 OEM 定制,以匹配每台笔记本电脑的硬件,并且固件是特定于该笔记本电脑的。 因此,linux-firmware 中有许多用于这些放大器的固件文件。 固件文件在笔记本电脑之间不可互换。
Cirrus Logic 将已知笔记本电脑的文件提交到上游 linux-firmware 存储库。 如果 Cirrus Logic 知道特定的笔记本电脑并获得制造商发布固件的许可,它将被推送到 linux-firmware。 您可能需要升级到较新版本的 linux-firmware 才能获得笔记本电脑的固件。
重要提示: linux-firmware 的 Makefile 创建了 WHENCE 文件中列出的符号链接。 CS35L56 驱动程序需要这些符号链接才能加载固件。
我如何知道我应该拥有哪个固件文件?¶
所有固件文件名都使用唯一的“系统 ID”进行限定。 在具有 PCI 音频的普通 x86 PC 上,这是主机 PCI 音频接口的供应商子系统 ID (SSID)。
可以使用 lspci 工具查看 SSID
lspci -v -nn | grep -A2 -i audio
0000:00:1f.3 Audio device [0403]: Intel Corporation Meteor Lake-P HD Audio Controller [8086:7e28]
Subsystem: Dell Meteor Lake-P HD Audio Controller [1028:0c63]
在此示例中,SSID 为 10280c63。
固件文件名的格式为
- SoundWire (CS35L56 Rev B0 除外)
cs35lxx-b0-dsp1-misc-SSID[-spkidX]-l?u?
- SoundWire CS35L56 Rev B0
cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN
- 非 SoundWire (HDA 和 I2S)
cs35lxx-b0-dsp1-misc-SSID[-spkidX]-ampN
其中
cs35lxx-b0 是放大器型号和硅修订版。 此信息在初始化期间由驱动程序记录。
SSID 是 8 位十六进制 SSID 值。
l?u? 是此文件适用的放大器在 SoundWire 总线上的物理地址。
ampN 是放大器编号(例如 amp1)。 这与 ALSA 控制名称上的前缀相同,只是文件名中始终为小写。
spkidX 是一个可选部分,用于具有针对不同品牌和型号的内部扬声器的固件配置的笔记本电脑。
CS35L56 Rev B0 继续使用旧的文件名方案,因为已经发布了大量具有这些名称的固件文件。
声音开放固件和 ALSA 拓扑文件¶
所有 SoundWire 系统都需要用于主机 CPU 音频 DSP 的声音开放固件 (SOF) 以及 ALSA 拓扑文件 (.tplg)。
SOF 固件通常由主机 CPU 的制造商(即 Intel 或 AMD)提供。.tplg 文件通常是 SOF 固件版本的一部分。
SOF 二进制文件构建可从以下位置获得: https://github.com/thesofproject/sof-bin/releases
主要 SOF 来源在此处: https://github.com/thesofproject
ALSA-ucm 配置¶
通常,用例管理器和音频服务器(例如 PipeWire)需要适当的 ALSA-ucm 配置文件。
配置文件可从 alsa-ucm-conf 存储库获得: https://git.alsa-project.org/?p=alsa-ucm-conf.git
内核日志消息¶
SoundWire¶
成功的初始化将如下所示(对于每个放大器都将重复此过程)
[ 7.568374] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_P not found, using dummy regulator
[ 7.605208] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_IO not found, using dummy regulator
[ 7.605313] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_A not found, using dummy regulator
[ 7.939279] cs35l56 sdw:0:0:01fa:3556:01:0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0)
[ 7.947844] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1
[ 8.740280] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_B not found, using dummy regulator
[ 8.740552] cs35l56 sdw:0:0:01fa:3556:01:0: supply VDD_AMP not found, using dummy regulator
[ 9.242164] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872
[ 9.242173] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: Tue 05 Dec 2023 21:37:21 GMT Standard Time
[ 9.991709] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms
[10.039098] cs35l56 sdw:0:0:01fa:3556:01:0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23
[10.879235] cs35l56 sdw:0:0:01fa:3556:01:0: Slave 4 state check1: UNATTACHED, status was 1
[11.401536] cs35l56 sdw:0:0:01fa:3556:01:0: Calibration applied
HDA¶
成功的初始化将如下所示(对于每个放大器都将重复此过程)
[ 6.306475] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0)
[ 6.613892] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP system name: 'xxxxxxxx', amp name: 'AMP1'
[ 8.266660] snd_hda_codec_cs8409 ehdaudio0D0: bound i2c-CSC3556:00-cs35l56-hda.0 (ops cs35l56_hda_comp_ops [snd_hda_scodec_cs35l56])
[ 8.287525] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: format 3 timestamp 0x66b2b872
[ 8.287528] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw: Tue 05 Dec 2023 21:37:21 GMT Standard Time
[ 9.984335] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: Firmware: 1a00d6 vendor: 0x2 v3.11.23, 41 algorithms
[10.085797] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin: v3.11.23
[10.655237] cs35l56-hda i2c-CSC3556:00-cs35l56-hda.0: Calibration applied
重要消息¶
- Cirrus Logic CS35L56 Rev B0 OTP3 fw:3.4.4 (patched=0)
表明驱动程序能够从放大器读取设备 ID 寄存器。
显示从放大器识别寄存器读取的实际放大器类型和硅修订版(在此示例中为 CS35L56 B0)。
(patched=0) 是正常的,表示放大器已硬重置,并且正在运行默认的 ROM 固件。
(patched=1) 意味着以前有东西将固件下载到放大器,并且驱动程序无法控制 RESET 信号来替换此预加载的固件。 对于 BIOS 在操作系统启动之前将固件下载到放大器的系统,这是正常的。 如果在驱动程序无法控制 RESET 的系统上卸载并重新加载 cs35l56 内核模块,也会看到此状态。 SoundWire 系统通常不给驱动程序控制 RESET,只有 BIOS(重新)启动才能重置放大器。
- DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx.wmfw
表明已找到并下载了 .wmfw 固件文件。
- DSP1: cirrus/cs35l56-b0-dsp1-misc-xxxxxxxx-amp1.bin
表明已找到并下载了 .bin 固件文件。
- 校准已应用
EFI 中的出厂校准数据已写入放大器。
错误消息¶
本节解释了驱动程序可以记录的一些错误消息。
- 算法系数版本 %d.%d.%d 但预期 %d.%d.%d
.bin 文件的内容版本与加载的固件不匹配。 由 .wmfw 和 .bin 文件不匹配或找到 .bin 文件但未找到 .wmfw 引起。
- 算法 %x 没有 %s
.bin 文件的内容版本与加载的固件不匹配。 由 .wmfw 和 .bin 文件不匹配或找到 .bin 文件但未找到 .wmfw 引起。
- 需要 .bin 文件但未找到
HDA 驱动程序未找到与此硬件匹配的 .bin 文件。
- 由于缺少固件控件,校准已禁用
驱动程序无法将 EFI 校准数据写入固件寄存器。 这通常意味着
驱动程序未找到适用于此硬件的合适 wmfw,或者
放大器以前已经被某些东西使用固件进行了修补,并且驱动程序无法控制硬 RESET 行来重置放大器并下载它找到的固件文件。 内核日志中的设备标识字符串显示“(patched=1)”表示这种情况
- 无法写入校准
与“由于缺少固件控件,校准已禁用”具有相同的含义和原因
- 无法从 EFI 读取校准数据
EFI 中的出厂校准数据缺失、为空或已损坏。 这很可能是由于意外地从 EFI 文件系统中删除文件引起的。
- 没有硅 ID 的校准
EFI 中的出厂校准数据与此硬件不匹配。 最可能的原因是在主板上更换了放大器,但未经过制造商校准过程来生成新放大器的校准数据。
- 没有找到 CSCxxxx 的任何总线
仅在 HDA 系统上。 HDA 编解码器驱动程序找到了 Cirrus Logic 配套放大器的 ACPI 条目,但无法枚举 I2C/SPI 总线的 ACPI 条目。 最可能的原因是
相关的总线驱动程序(I2C 或 SPI)不是内核的一部分。
HDA 编解码器驱动程序已内置到内核中,但 I2C/SPI 总线驱动程序是一个模块,因此 HDA 编解码器驱动程序无法调用总线驱动程序功能。
- init_completion 超时
SoundWire 总线控制器(主机端)未枚举放大器。 换句话说,ACPI 说有一个放大器,但由于某种原因,它未在总线上检测到。
- 没有 AF01 节点
表示 ACPI 中存在错误。 SoundWire 系统应具有一个名为“AF01”的 Device() 节点,但未找到。
- 无法获取 spk-id-gpios
ACPI 说驱动程序应该请求一个 GPIO,但驱动程序无法获得该 GPIO。 最可能的原因是内核不包含此系统的正确 GPIO 或 PINCTRL 驱动程序。
- 无法读取 spk-id
ACPI 说驱动程序应该请求一个 GPIO,但驱动程序无法读取该 GPIO。
- 意外的 spk-id 元素计数
AF01 包含的扬声器 ID GPIO 条目比驱动程序支持的条目多
- 过温错误
放大器过热保护已触发,并且放大器已关闭以保护自身。
- 放大器短路错误
放大器检测到扬声器输出引脚上的短路并关闭以进行保护。 这通常表示扬声器已损坏。
- Hibernate 唤醒失败
驱动程序尝试从其省电状态唤醒放大器,但未看到来自放大器的预期响应。 这可能是由于使用了与硬件不匹配的固件引起的。