更多關於HD-Audio驅動程式的說明¶
Takashi Iwai <tiwai@suse.de>
一般¶
HD-audio是AC97之後現代PC上新的板載音訊元件標準。雖然Linux早已支援HD-audio,但新機器上經常出現問題。部分問題是由於BIOS損壞,其餘是驅動程式實現的問題。本文件解釋了HD-audio硬體的簡要故障排除和除錯方法。
HD-audio元件由兩部分組成:控制器晶片和HD-audio總線上的編解碼器晶片。Linux為所有控制器提供了一個單一的驅動程式,即snd-hda-intel。儘管驅動程式名稱中包含了一個著名硬體供應商的名稱,但它並非專門針對該供應商,而是適用於所有其他公司的控制器晶片。由於HD-audio控制器應該相容,因此單一的snd-hda-驅動程式在大多數情況下都應能正常工作。但不出所料,存在一些特定於每種控制器型別的已知錯誤和問題。snd-hda-intel驅動程式對此進行了一些變通處理,如下所述。
一個控制器可能連線多個編解碼器。通常,您會有一個音訊編解碼器,並可選地一個調變解調器編解碼器。理論上,可能存在多個音訊編解碼器,例如用於模擬和數字輸出,並且驅動程式可能因混音器元素衝突而無法正常工作。如果確實存在此類硬體,這將在未來得到修復。
snd-hda-intel驅動程式根據編解碼器型別有幾種不同的編解碼器解析器。它有一個通用解析器作為備用,但迄今為止其功能相當有限。通常,編解碼器特定的解析器(在patch_*.c中編碼)用於編解碼器特定的實現,而不是通用解析器。有關編解碼器特定問題的詳細資訊將在後面的章節中解釋。
如果您對HD-audio的深度除錯感興趣,請首先閱讀HD-audio規範。該規範可以在Intel的網頁上找到,例如:
HD-Audio控制器¶
DMA位置問題¶
控制器最常見的問題是DMA指標報告不準確。播放和捕獲的DMA指標可以透過兩種方式讀取:透過LPIB暫存器或透過位置緩衝區對映。預設情況下,驅動程式嘗試從IO對映的位置緩衝區讀取,如果位置緩衝區似乎不活動,則回退到LPIB。然而,在某些裝置上,這種檢測並不完美。在這種情況下,您可以透過position_fix選項更改預設方法。
position_fix=1表示明確使用LPIB方法。position_fix=2表示使用位置緩衝區。position_fix=3表示使用兩種方法的組合,某些VIA控制器需要。捕獲流位置透過比較LPIB和位置緩衝區值來校正。position_fix=4是所有控制器可用的另一種組合,它將LPIB用於播放流,將位置緩衝區用於捕獲流。position_fix=5目前是Intel平臺特有的,適用於Skylake及以後的平臺。它應用延遲計算以實現精確的位置報告。position_fix=6用於使用固定的FIFO大小校正位置,主要針對最近的AMD控制器。0是所有其他控制器的預設值,即上述的自動檢查並回退到LPIB。如果您遇到聲音重複的問題,此選項可能會有所幫助。
除此之外,已知每個控制器在喚醒時間方面都存在問題。它會在實際處理緩衝區資料之前幾取樣喚醒。這導致了很多問題,例如使用ALSA dmix或JACK時。從2.6.27核心開始,驅動程式會給喚醒時間新增一個人為延遲。此延遲透過bdl_pos_adj選項控制。
當bdl_pos_adj為負值(預設值)時,它會根據控制器晶片被分配一個合適的值。對於英特爾晶片,它將是1,而對於其他晶片,它將是32。通常這會奏效。只有在它不起作用並收到警告訊息時,才應該將此引數更改為其他值。
編解碼器探測問題¶
一個不那麼常見但更嚴重的問題是編解碼器探測。當BIOS錯誤地報告可用的編解碼器插槽時,驅動程式會感到困惑,並嘗試訪問不存在的編解碼器插槽。這通常會導致完全的混亂,並破壞與編解碼器晶片的進一步通訊。症狀通常表現為如下錯誤訊息:
hda_intel: azx_get_response timeout, switching to polling mode:
last cmd=0x12345678
hda_intel: azx_get_response timeout, switching to single_cmd mode:
last cmd=0x12345678
第一行是警告,通常相對無害。這意味著編解碼器響應沒有透過IRQ通知。驅動程式使用顯式輪詢方法讀取響應。這會帶來非常輕微的CPU開銷,但您不太可能注意到它。
然而,第二行是致命錯誤。如果發生這種情況,通常意味著情況確實很糟糕。最有可能的情況是您正在訪問一個不存在的編解碼器插槽。
因此,如果出現第二條錯誤訊息,請嘗試透過probe_mask選項縮小探測的編解碼器插槽範圍。它是一個位掩碼,每個位對應一個編解碼器插槽。例如,要僅探測第一個插槽,請傳遞probe_mask=1。對於第一個和第三個插槽,請傳遞probe_mask=5(其中5 = 1 | 4),依此類推。
然而,從2.6.29核心開始,驅動程式擁有更健壯的探測方法,因此這種錯誤可能很少發生。
在BIOS損壞的機器上,有時您需要強制驅動程式探測硬體未報告使用的編解碼器插槽。在這種情況下,請將probe_mask選項的第8位(0x100)開啟。然後將剩下的8位作為編解碼器插槽無條件地進行探測。例如,probe_mask=0x103將強制探測編解碼器插槽0和1,無論硬體報告什麼。
中斷處理¶
HD-audio驅動程式從2.6.33核心開始預設使用MSI(如果可用),因為MSI在某些機器上表現更好,並且通常對效能更有利。然而,Nvidia控制器在使用MSI時表現出糟糕的退化(特別是在與AMD晶片組結合時),因此我們為它們停用了MSI。
似乎還有其他裝置無法與MSI配合使用。如果您在最新核心中發現聲音質量下降(卡頓等)或死鎖,請嘗試傳遞enable_msi=0選項以停用MSI。如果它有效,您可以將已知不良裝置新增到hda_intel.c中定義的黑名單。在這種情況下,請向上游開發者報告並提供補丁。
HD-Audio編解碼器¶
模型選項¶
HD-audio驅動程式最常見的問題是編解碼器功能不受支援或裝置配置不匹配。大多數編解碼器特定程式碼都有幾個預設模型,用於覆蓋BIOS設定或提供更全面的功能。
驅動程式檢查PCI SSID並遍歷靜態配置表,直到找到任何匹配的條目。如果您有一臺新機器,您可能會看到如下訊息:
hda_codec: ALC880: BIOS auto-probing.
同時,在早期版本中,您可能會看到一條類似的訊息
hda_codec: Unknown model for ALC880, trying auto-probe from BIOS...
即使你看到這樣的資訊,不要驚慌。深吸一口氣,拿著你的毛巾。首先,這是一條資訊性訊息,不是警告,也不是錯誤。這意味著你的裝置的PCI SSID沒有列在已知的預設模型(白)列表中。但是,這並不意味著驅動程式損壞了。許多編解碼器驅動程式提供了基於BIOS設定的自動配置機制。
HD-audio編解碼器通常有“pin”部件,BIOS會設定每個pin的預設配置,指示位置、連線型別、插孔顏色等。HD-audio驅動程式可以根據這些預設配置值猜測正確的連線。然而——一些編解碼器支援程式碼,例如patch_analog.c,還不支援自動探測(截至2.6.28)。而且,BIOS經常,是的,非常經常損壞。它設定了錯誤的值並搞砸了驅動程式。
提供預設模型(或最近稱為“fix-up”)基本上是為了克服這種情況。當在白名單中找到匹配的預設模型時,驅動程式將採用該預設的靜態配置,並具有正確的引腳設定等。因此,如果您有一臺較新的機器,其PCI SSID(或編解碼器SSID)與現有機器略有不同,您很有可能重用相同的模型。您可以透過model選項指定預設模型,而不是透過PCI(和編解碼器)SSID查詢。
model選項的可用值取決於編解碼器晶片。從編解碼器proc檔案(參見下面的“Codec Proc-File”部分)檢查您的編解碼器晶片。它將顯示您的編解碼器晶片的供應商/產品名稱。然後,請參閱HD-Audio編解碼器特定型號檔案,即HD-audio驅動程式部分。您可以找到編解碼器列表和屬於每個編解碼器的model選項。例如,對於Realtek ALC262編解碼器晶片,對於與三星Q1 Ultra相容的裝置,請傳遞model=ultra。
因此,對於任何全新的、不支援且無法工作的HD-audio硬體,您首先要做的就是檢查HD-audio編解碼器和幾種不同的model選項值。如果幸運的話,其中一些可能非常適合您的裝置。
有幾個特殊的模型選項值
當傳入“nofixup”時,編解碼器解析器中的裝置特定修復程式將被跳過。
當傳入
generic時,編解碼器特定解析器將被跳過,只使用通用解析器。
從5.15核心開始引入的一種新式模型選項是,以model=XXXX:YYYY的形式傳遞PCI或編解碼器SSID,其中XXXX和YYYY分別是十六進位制數字的子供應商和子裝置ID。這是一種將裝置別名為另一個裝置的方式;當給出此形式時,驅動程式將把該SSID作為參考來查詢異常表。這在目標異常未列在模型表中時特別有用。例如,傳遞model=103c:8862將應用於HP ProBook 445 G8的異常(撰寫本文時未在模型表中找到),只要該裝置由同一驅動程式等效處理。
揚聲器和耳機輸出¶
HD-audio最常見(也最明顯)的bug之一是內建揚聲器或耳機插孔(或兩者)無聲輸出。一般來說,您應該首先嚐試耳機輸出。揚聲器輸出通常需要更多的額外控制,例如外部放大器位。因此,耳機輸出成功的機會稍大一些。
在提交錯誤報告之前,請仔細檢查混音器是否設定正確。最新版本的snd-hda-intel驅動程式主要提供“主音量”控制以及“前置”音量(其中“前置”表示前置聲道)。此外,還可能有單獨的“耳機”和“揚聲器”控制。
揚聲器輸出也是如此。某些編解碼器上可能有一個“外部放大器”開關。如果存在,請將其開啟。
另一個相關問題是耳機插入時揚聲器輸出的自動靜音。此功能在大多數情況下都已實現,但並非所有預設模型或編解碼器支援程式碼都支援。
無論如何,如果您有此類問題,請嘗試不同的模型選項。一些其他模型可能更匹配,併為您提供更多匹配的功能。如果所有可用模型都無效,請傳送錯誤報告。有關詳細資訊,請參閱錯誤報告部分。
如果你是受虐狂,想要除錯驅動程式問題,請注意以下幾點:
揚聲器(也包括耳機)輸出通常需要外部放大器。這通常可以透過EAPD verb或某個GPIO進行設定。如果編解碼器引腳支援EAPD,您可以透過SET_EAPD_BTL verb(0x70c)獲得更好的機會。在其他情況下,GPIO引腳(通常是GPIO0或GPIO1)可能會開啟/關閉EAPD。
某些Realtek編解碼器需要特殊的供應商特定係數才能開啟放大器。參見patch_realtek.c。
IDT編解碼器可能在每個模擬引腳上都有額外的電源啟用/停用控制。參見patch_sigmatel.c。
極少數情況下,某些裝置在觸發之前不接受引腳檢測動詞。發出GET_PIN_SENSE動詞(0xf09)可能導致編解碼器通訊停滯。一些示例可以在patch_realtek.c中找到。
捕獲問題¶
捕獲問題通常是由於混音器設定缺失造成的。因此,在提交錯誤報告之前,請確保正確設定混音器。例如,除了正確的“捕獲源”或“輸入源”選擇之外,“捕獲音量”和“捕獲開關”也必須正確設定。有些裝置有“麥克風增強”音量或開關。
當透過“default”PCM(不帶pulse-audio外掛)開啟PCM裝置時,您很可能也會有“數字捕獲音量”控制。這用於在軟體中對訊號進行額外的增益/衰減,特別是對於沒有硬體音量控制的輸入,例如數字麥克風。除非真正需要,否則此應設定為正好50%,相當於0dB——既無額外增益也無衰減。但是,當您使用“hw”PCM,即原始訪問PCM時,此控制將不起作用。
眾所周知,一些編解碼器/裝置具有相當差的類比電路,錄製的聲音包含一定的直流偏移。這不是驅動程式的錯誤。
大多數現代筆記型電腦沒有模擬CD輸入連線。因此,即使驅動程式將其作為捕獲源提供,從CD輸入錄音在許多情況下也無法工作。請改用CDDA。
某些編解碼器模型實現了內建麥克風和外部麥克風之間插入時的自動切換,但並非所有模型都實現。部分原因是我的懶惰,但主要是缺乏測試人員。歡迎向作者提交改進補丁。
直接除錯¶
如果沒有模型選項能為您帶來更好的結果,並且您是一個勇於與邪惡作鬥爭的硬漢,請嘗試透過向裝置傳送原始HD-audio編解碼器指令進行除錯。有一些工具可用:hda-emu 和 hda-analyzer。詳細說明請參閱以下章節。您需要啟用hwdep才能使用這些工具。請參閱“核心配置”章節。
其他問題¶
核心配置¶
通常,我建議您啟用聲音除錯選項CONFIG_SND_DEBUG=y,無論您是否正在除錯。
別忘了開啟相應的CONFIG_SND_HDA_CODEC_*選項。請注意,每個選項都對應於編解碼器晶片,而不是控制器晶片。因此,即使lspci顯示的是Nvidia控制器,您可能也需要選擇其他供應商的選項。如果您不確定,只需全部選擇“是”。
CONFIG_SND_HDA_HWDEP是一個有用的驅動程式除錯選項。啟用此選項後,驅動程式會建立硬體相關的裝置(每個編解碼器一個),您可以透過這些裝置檔案直接訪問裝置。例如,對於第一張音效卡(#0)的編解碼器插槽#2,將建立hwC0D2。對於hda-verb和hda-analyzer等除錯工具,必須啟用hwdep裝置。因此,最好始終將其開啟。
CONFIG_SND_HDA_RECONFIG是一個新選項,它依賴於上面的hwdep選項。啟用後,您將在相應的hwdep目錄(例如/sys/class/sound/hwC0D0)下擁有一些sysfs檔案。有關詳細資訊,請參閱下面的“HD-audio重新配置”部分。
CONFIG_SND_HDA_POWER_SAVE選項啟用省電功能。請參閱下面的“省電”部分。
編解碼器 Proc 檔案¶
編解碼器proc檔案是除錯HD-audio的寶藏。它顯示了每個編解碼器小部件的大部分有用資訊。
proc檔案位於/proc/asound/card*/codec#*,每個編解碼器插槽一個檔案。您可以瞭解編解碼器供應商、產品ID和名稱、每個小部件的型別、功能等。然而,到目前為止,此檔案不顯示插孔感測狀態。這是因為插孔感測可能取決於觸發狀態。
此檔案將由除錯工具選取,也可以作為主要編解碼器資訊提供給模擬器。請參閱下面的除錯工具部分。
此proc檔案也可用於檢查是否使用了通用解析器。當使用通用解析器時,供應商/產品ID名稱將顯示為“Realtek ID 0262”,而不是“Realtek ALC262”。
HD-Audio重配置¶
這是一項實驗性功能,允許您無需重新載入驅動程式即可動態重新配置HD-audio編解碼器。以下sysfs檔案在每個編解碼器hwdep裝置目錄(例如/sys/class/sound/hwC0D0)下可用:
- vendor_id
顯示32位編解碼器供應商ID十六進位制數字。您可以透過寫入此檔案來更改供應商ID值。
- subsystem_id
顯示32位編解碼器子系統ID十六進位制數字。您可以透過寫入此檔案來更改子系統ID值。
- revision_id
顯示32位編解碼器修訂ID十六進位制數字。您可以透過寫入此檔案來更改修訂ID值。
- afg
顯示AFG ID。這是隻讀的。
- mfg
顯示MFG ID。這是隻讀的。
- name
顯示編解碼器名稱字串。可以透過寫入此檔案進行更改。
- modelname
顯示當前設定的
model選項。可以透過寫入此檔案進行更改。- init_verbs
初始化時執行的額外verbs。您可以透過寫入此檔案新增一個verb。傳入三個數字:nid、verb和parameter(用空格分隔)。
- hints
顯示/儲存用於編解碼器解析器的任何用途的提示字串。其格式為
key = value。例如,傳入jack_detect = no將完全停用機器的插孔檢測。- init_pin_configs
顯示由BIOS設定的初始引腳預設配置值。
- driver_pin_configs
顯示由編解碼器解析器顯式設定的引腳預設值。這不顯示所有引腳值,只顯示解析器更改的值。也就是說,如果解析器本身不更改引腳預設配置值,則此項將不包含任何內容。
- user_pin_configs
顯示用於覆蓋BIOS設定的引腳預設配置值。寫入此檔案(帶兩個數字,NID和值)將追加新值。在下次重新配置時,給定值將取代初始BIOS值。請注意,此配置甚至也會覆蓋驅動程式引腳配置。
- reconfig
觸發編解碼器重新配置。當任何值寫入此檔案時,驅動程式會重新初始化並再次解析編解碼器樹。上述sysfs條目所做的所有更改都會被考慮在內。
- clear
重置編解碼器,移除指定編解碼器的混音器元素和PCM內容,並清除所有初始化指令和提示。
例如,當您想將引腳部件0x14的引腳預設配置值更改為0x9993013f,並讓驅動程式根據該狀態重新配置時,請執行如下命令:
# echo 0x14 0x9993013f > /sys/class/sound/hwC0D0/user_pin_configs
# echo 1 > /sys/class/sound/hwC0D0/reconfig
提示字串¶
編解碼器解析器有幾個開關和調整旋鈕,以便更好地匹配實際的編解碼器或裝置行為。其中許多可以透過“hints”字串動態調整,如上文所述。例如,透過sysfs或補丁檔案傳遞jack_detect = no字串,可以停用插孔檢測,從而使編解碼器解析器跳過自動靜音或麥克風自動切換等功能。作為布林值,可以傳遞yes、no、true、false、1或0。
通用解析器支援以下提示:
- jack_detect (布林值)
指定本機是否支援插孔檢測;預設為true
- inv_jack_detect (布林值)
表示插孔檢測邏輯是反向的
- trigger_sense (布林值)
表示插孔檢測需要顯式呼叫AC_VERB_SET_PIN_SENSE動詞
- inv_eapd (布林值)
表示EAPD以反向邏輯實現
- pcm_format_first (布林值)
在流標籤和通道ID之前設定PCM格式
- sticky_stream (布林值)
儘可能長時間地保留PCM格式、流標籤和ID;預設為true
- spdif_status_reset (布林值)
每次設定SPDIF流時重置SPDIF狀態位
- pin_amp_workaround (布林值)
輸出引腳可能有多個放大器值
- single_adc_amp (布林值)
ADC只能有單個輸入放大器
- auto_mute (布林值)
啟用/停用耳機自動靜音功能;預設為true
- auto_mic (布林值)
啟用/停用麥克風自動切換功能;預設為true
- line_in_auto_switch (布林值)
啟用/停用線路輸入自動切換功能;預設為false
- need_dac_fix (布林值)
根據通道數限制DAC
- primary_hp (布林值)
將耳機插孔探測為主輸出;預設為true
- multi_io (布林值)
嘗試探測多I/O配置(例如共享的線路輸入/環繞聲、麥克風/CLFE插孔)
- multi_cap_vol (布林值)
提供多個捕獲音量
- inv_dmic_split (布林值)
為相位反轉的數字麥克風提供獨立的內建麥克風音量/開關
- indep_hp (布林值)
如果可用,提供獨立的耳機PCM流和相應的混音器控制
- add_stereo_mix_input (布林值)
如果可用,將立體聲混音(模擬環回混音)新增到輸入多路複用器
- add_jack_modes (布林值)
為每個I/O插孔新增“xxx 插孔模式”列舉控制元件,以允許更改耳機放大器和麥克風偏置VREF功能
- power_save_node (布林值)
每個小部件的高階電源管理,根據實際引腳和流狀態控制每個小部件節點的電源狀態(D0/D3)
- power_down_unused (布林值)
關閉未使用的部件電源,它是power_save_node的一個子集,未來將被移除
- add_hp_mic (布林值)
如果可能,將耳機新增到捕獲源
- hp_mic_detect (布林值)
在只有一個內建麥克風的情況下,啟用/停用耳機/麥克風共享輸入;預設為true
- vmaster (布林值)
啟用/停用虛擬主控制;預設為true
- mixer_nid (整型)
指定模擬環回混音器的部件NID
早期打補丁¶
當設定CONFIG_SND_HDA_PATCH_LOADER=y時,您可以將“補丁”作為韌體檔案傳遞,以便在初始化編解碼器之前修改HD-audio設定。這基本上可以像上述透過sysfs重新配置一樣工作,但它在第一次編解碼器配置之前進行。
補丁檔案是一個純文字檔案,內容如下所示:
[codec]
0x12345678 0xabcd1234 2
[model]
auto
[pincfg]
0x12 0x411111f0
[verb]
0x20 0x500 0x03
0x20 0x400 0xff
[hint]
jack_detect = no
檔案必須包含一行[codec]。下一行應包含三個數字,表示編解碼器供應商ID(示例中為0x12345678)、編解碼器子系統ID(0xabcd1234)和編解碼器地址(2)。其餘的補丁條目將應用於此指定的編解碼器,直到給出另一個編解碼器條目。將第一個或第二個值設定為0或負數將跳過相應欄位的檢查。這對於那些無法正確初始化SSID的真正損壞的裝置將很有用。
[model]行允許更改每個編解碼器的模型名稱。在上面的示例中,它將更改為model=auto。請注意,這會覆蓋模組選項。
在[pincfg]行之後,內容被解析為初始預設引腳配置,就像上面user_pin_configs sysfs一樣。這些值也可以在user_pin_configs sysfs檔案中顯示。
類似地,[verb]行之後的內容被解析為init_verbs sysfs條目,而[hint]行之後的內容分別被解析為hints sysfs條目。
另一個將編解碼器供應商ID從0x12345678覆蓋為0xdeadbeef的示例如下:
[codec]
0x12345678 0xabcd1234 2
[vendor_id]
0xdeadbeef
類似地,您可以透過[subsystem_id]覆蓋編解碼器子系統ID,透過[revision_id]行覆蓋修訂ID。此外,編解碼器晶片名稱可以透過[chip_name]行重寫。
[codec]
0x12345678 0xabcd1234 2
[subsystem_id]
0xffff1111
[revision_id]
0x10
[chip_name]
My-own NEWS-0002
hd-audio驅動程式透過request_firmware()讀取檔案。因此,補丁檔案必須位於適當的韌體路徑上,通常是/lib/firmware。例如,當您傳遞選項patch=hda-init.fw時,檔案/lib/firmware/hda-init.fw必須存在。
補丁模組選項是針對每個卡例項特定的,您需要為每個例項提供一個檔名,用逗號分隔。例如,如果您有兩張卡,一張用於板載模擬,另一張用於HDMI影片板,您可以按如下方式傳遞補丁選項:
options snd-hda-intel patch=on-board-patch,hdmi-patch
省電¶
省電是一種裝置自動暫停功能。當裝置在一定時間內不活動時,裝置會自動關閉以節省電量。關閉時間由power_save模組選項指定,並且此選項可以透過sysfs動態更改。
當某些編解碼器上的模擬迴環啟用時,省電功能將不起作用。請確保在需要省電時將所有不需要的訊號路徑靜音。
根據裝置的不同,省電功能可能會在每次斷電/上電時引起可聽見的咔嗒聲。其中一些可能可以解決,但有些則很難,恐怕如此。某些發行版(如openSUSE)在拔掉電源線時會自動啟用省電功能。因此,如果您聽到噪音,請首先懷疑是省電功能。請參閱/sys/module/snd_hda_intel/parameters/power_save以檢查當前值。如果是非零值,則該功能已開啟。
最新核心也支援HD-audio控制器晶片的執行時PM。這意味著HD-audio控制器也可以動態地開啟/關閉電源。此功能僅適用於某些控制器晶片,如Intel LynxPoint。您可以透過設定power_save_controller選項強制啟用/停用此功能,該選項也位於/sys/module/snd_hda_intel/parameters目錄中。
跟蹤點¶
hd-audio驅動程式提供了一些基本的跟蹤點。hda:hda_send_cmd跟蹤每次CORB寫入,而hda:hda_get_response跟蹤RIRB的響應(僅當從編解碼器驅動程式讀取時)。hda:hda_bus_reset跟蹤由於致命錯誤等導致的匯流排復位,hda:hda_unsol_event跟蹤非請求事件,hda:hda_power_down和hda:hda_power_up跟蹤透過省電行為進行的斷電/上電。
啟用所有跟蹤點可以像這樣完成:
# echo 1 > /sys/kernel/tracing/events/hda/enable
然後執行一些命令後,您可以從/sys/kernel/tracing/trace檔案跟蹤。例如,當您想跟蹤傳送了哪些編解碼器命令時,請啟用跟蹤點,如下所示:
# cat /sys/kernel/tracing/trace
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
<...>-7807 [002] 105147.774889: hda_send_cmd: [0:0] val=e3a019
<...>-7807 [002] 105147.774893: hda_send_cmd: [0:0] val=e39019
<...>-7807 [002] 105147.999542: hda_send_cmd: [0:0] val=e3a01a
<...>-7807 [002] 105147.999543: hda_send_cmd: [0:0] val=e3901a
<...>-26764 [001] 349222.837143: hda_send_cmd: [0:0] val=e3a019
<...>-26764 [001] 349222.837148: hda_send_cmd: [0:0] val=e39019
<...>-26764 [001] 349223.058539: hda_send_cmd: [0:0] val=e3a01a
<...>-26764 [001] 349223.058541: hda_send_cmd: [0:0] val=e3901a
這裡[0:0]分別表示音效卡編號和編解碼器地址,val顯示傳送到編解碼器的值。該值是一個打包值,您可以使用hda-emu包中包含的hda-decode-verb程式對其進行解碼。例如,值e3a019是將左輸出放大器值設定為25。
% hda-decode-verb 0xe3a019
raw value = 0x00e3a019
cid = 0, nid = 0x0e, verb = 0x3a0, parm = 0x19
raw value: verb = 0x3a0, parm = 0x19
verbname = set_amp_gain_mute
amp raw val = 0xa019
output, left, idx=0, mute=0, val=25
開發樹¶
HD-audio的最新開發程式碼可在sound git tree中找到:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
master分支或for-next分支通常可用作主要開發分支,而當前和下一個核心的開發分別在for-linus和for-next分支中。
傳送錯誤報告¶
如果您的裝置沒有任何模型或模組選項可用,那麼是時候向開發者傳送錯誤報告了。在您的錯誤報告中提供以下資訊:
硬體供應商、產品和型號名稱
核心版本(如果您是外部構建的ALSA驅動程式版本)
alsa-info.sh輸出;使用--no-upload選項執行。請參閱下面關於alsa-info的部分
如果這是一個迴歸問題,最好傳送工作和不工作核心的alsa-info輸出。這真的很有幫助,因為我們可以直接比較編解碼器暫存器。
透過以下方式傳送錯誤報告:
- kernel-bugzilla
- alsa-devel ML
除錯工具¶
本節描述了一些可用於除錯HD-audio問題的工具。
alsa-info¶
指令碼alsa-info.sh是一個非常有用的工具,用於收集音訊裝置資訊。它包含在alsa-utils軟體包中。最新版本可在git倉庫中找到:
git://git.alsa-project.org/alsa-utils.git
該指令碼也可以直接從以下URL獲取:
以root身份執行此指令碼,它將收集重要的資訊,例如模組列表、模組引數、proc檔案內容(包括編解碼器proc檔案)、混音器輸出和控制元素。預設情況下,它會將資訊儲存到alsa-project.org的Web伺服器上。但是,如果您要傳送錯誤報告,最好使用--no-upload選項執行,並附上生成的檔案。
還有一些其他有用的選項。有關詳細資訊,請參閱--help選項輸出。
當發生探測錯誤或驅動程式明顯分配了不匹配的模型時,最好使用probe_only=1選項(最好在冷啟動後)載入驅動程式,並在這種狀態下執行alsa-info。使用此選項,驅動程式不會配置混音器和PCM,而只是嘗試探測編解碼器插槽。探測完成後,proc檔案可用,因此您可以在驅動程式修改之前獲取原始編解碼器資訊。當然,驅動程式不能與probe_only=1一起使用。但是如果hda-reconfig選項已啟用,您可以透過hwdep sysfs檔案繼續配置。使用probe_only掩碼2將跳過HDA編解碼器的重置(將probe_only=3用作模組選項)。hwdep介面可用於確定BIOS編解碼器初始化。
hda-verb¶
hda-verb是一個小型程式,允許您直接訪問HD-audio編解碼器。您可以使用它執行原始HD-audio編解碼器動詞。此程式訪問hwdep裝置,因此您需要事先啟用核心配置CONFIG_SND_HDA_HWDEP=y。
hda-verb程式接受四個引數:hwdep裝置檔案、小部件NID、動詞和引數。當您訪問音效卡0的插槽2上的編解碼器時,通常將/dev/snd/hwC0D2傳遞給第一個引數。(但是,實際路徑名取決於系統。)
第二個引數是要訪問的小部件編號ID。第三個引數可以是十六進位制/數字或與動詞對應的字串。類似地,最後一個引數是要寫入的值,或者可以是引數型別的字串。
% hda-verb /dev/snd/hwC0D0 0x12 0x701 2
nid = 0x12, verb = 0x701, param = 0x2
value = 0x0
% hda-verb /dev/snd/hwC0D0 0x0 PARAMETERS VENDOR_ID
nid = 0x0, verb = 0xf00, param = 0x0
value = 0x10ec0262
% hda-verb /dev/snd/hwC0D0 2 set_a 0xb080
nid = 0x2, verb = 0x300, param = 0xb080
value = 0x0
儘管您可以使用此程式發出任何動詞,但驅動程式狀態並非總是更新。例如,音量值通常在驅動程式中快取,因此透過hda-verb直接更改小部件放大器值不會更改混音器值。
hda-verb 程式現在包含在 alsa-tools 中:
git://git.alsa-project.org/alsa-tools.git
此外,舊的獨立軟體包可在ftp目錄中找到:
還有一個git倉庫可用:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-verb.git
有關hda-verb程式的更多詳細資訊,請參閱tarball中的README檔案。
hda-analyzer¶
hda-analyzer提供了一個圖形介面,用於訪問原始HD-audio控制,基於pyGTK2繫結。它是hda-verb的一個更強大的版本。該程式提供了易於使用的GUI,用於顯示小部件資訊和調整放大器值,以及與proc相容的輸出。
hda-analyzer
是alsa-project.org中alsa.git倉庫的一部分
git://git.alsa-project.org/alsa.git
Codecgraph¶
Codecgraph是一個實用程式,用於生成圖形並可視化編解碼器晶片的編解碼器節點連線。在分析或除錯沒有適當資料手冊的編解碼器時特別有用。該程式解析給定的編解碼器proc檔案,並透過graphiz程式將其轉換為SVG。
tarball和GIT樹可在以下網頁找到:
hda-emu¶
hda-emu是一個HD-audio模擬器。此程式的主要目的是在沒有實際硬體的情況下除錯HD-audio編解碼器。因此,它不模擬實際音訊I/O的行為,而只是在探測和操作HD-audio驅動程式時轉儲編解碼器暫存器更改和ALSA驅動程式內部更改。
程式需要一個編解碼器proc檔案進行模擬。事先獲取目標編解碼器的proc檔案,或者從tarball中的編解碼器proc集合中選擇一個示例編解碼器。然後,使用proc檔案執行程式,hda-emu程式將開始解析編解碼器檔案並模擬HD-audio驅動程式
% hda-emu codecs/stac9200-dell-d820-laptop
# Parsing..
hda_codec: Unknown model for STAC9200, using BIOS defaults
hda_codec: pin nid 08 bios pin config 40c003fa
....
該程式只提供一個非常簡單的命令列介面。您可以獲取當前狀態的proc檔案轉儲,獲取控制(混音器)元素列表,設定/獲取控制元素值,模擬PCM操作,插孔插拔模擬等。
該程式可在以下git倉庫中找到:
git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-emu.git
有關hda-emu程式的更多詳細資訊,請參閱儲存庫中的README檔案。
hda-jack-retask¶
hda-jack-retask是一個使用者友好的GUI程式,用於操作HD-audio引腳控制以進行插孔重分配。如果您遇到插孔分配問題,請嘗試此程式並檢查是否能獲得有用的結果。一旦您確定了正確的引腳分配,可以透過靜態修改驅動程式程式碼或透過傳遞韌體補丁檔案(參見“早期補丁”部分)來修復。
該程式現在包含在alsa-tools中
git://git.alsa-project.org/alsa-tools.git