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 和要更新的引脚列表,然后设置一个或多个插孔检测机制,以根据其当前状态更新该插孔。