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 喚醒失敗

驅動程式嘗試從其省電狀態喚醒放大器,但未看到來自放大器的預期響應。 這可能是由於使用了與硬體不匹配的韌體引起的。