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