ASoC 插孔檢測¶
ALSA 具有表示物理插孔到使用者空間的標準 API,其核心端可以在 include/sound/jack.h 中看到。 ASoC 提供了此 API 的一個版本,添加了兩個附加功能
它允許在一個使用者可見的插孔上協同工作多種插孔檢測方法。 在嵌入式系統中,多個插孔通常存在於單個插孔上,但由單獨的硬體位處理。
與 DAPM 整合,允許根據檢測到的插孔狀態自動更新 DAPM 端點(例如,如果未插入耳機則關閉耳機輸出)。
這是透過將插孔分解為三個協同工作的部分來完成的:插孔本身由 struct snd_soc_jack 表示,snd_soc_jack_pins 集表示要更新的 DAPM 端點,程式碼塊提供插孔報告機制。
例如,一個系統可能具有一個立體聲耳機插孔,帶有兩種報告機制,一種用於耳機,另一種用於麥克風。 某些系統在連線耳機時將無法使用其揚聲器輸出,因此需要確保在耳機插孔狀態更改時同時更新揚聲器和耳機。
插孔 - struct snd_soc_jack¶
這表示系統上的物理插孔,並且對使用者空間可見。 插孔本身是完全被動的,它由機器驅動程式設定,並由插孔檢測方法更新。
透過機器驅動程式呼叫 snd_soc_jack_new() 來建立插孔。
snd_soc_jack_pin¶
這些表示要根據插孔支援的某些狀態位更新的 DAPM 引腳。 每個 snd_soc_jack 都有零個或多個這些引腳,它們會自動更新。 它們由機器驅動程式建立,並使用 snd_soc_jack_add_pins() 與插孔關聯。 如果需要,可以將端點的狀態配置為與插孔狀態相反(例如,如果未透過插孔連線麥克風,則啟用內建麥克風)。
插孔檢測方法¶
實際的插孔檢測由能夠監視系統的一些輸入並透過呼叫 snd_soc_jack_report() 更新插孔的程式碼完成,指定要更新的位的子集。 插孔檢測程式碼應由機器驅動程式設定,獲取要更新的插孔的配置以及插孔連線時要報告的事物集。
通常,這是基於 GPIO 的狀態完成的 - snd_soc_jack_add_gpio() 函式提供了一個處理程式。 其他方法也可用,例如整合到 CODEC 中。 在 WM8350 驅動程式中可以看到 CODEC 整合的插孔檢測的一個示例。
每個插孔可能具有多個報告機制,儘管它至少需要一個才能有用。
機器驅動程式¶
所有這些都透過機器驅動程式根據系統硬體連線在一起。 機器驅動程式將設定 snd_soc_jack 和要更新的引腳列表,然後設定一個或多個插孔檢測機制,以根據其當前狀態更新該插孔。