ASoC插孔检测

ASoC插孔检测

ALSA有一个标准API,用于向用户空间表示物理插孔,其内核端可以在include / sound / jack.h中看到。ASoC提供此API的一个版本,增加了两个附加功能:

  • 它允许多个插孔检测方法在一个用户可见插孔上一起工作。在嵌入式系统中,通常在单个插孔上存在多个,但是由单独的硬件位处理。
  • 与DAPM集成,允许DAPM端点根据检测到的插孔状态自动更新(例如,如果没有耳机,则关闭耳机输出)。

这是通过将插孔分成三个一起工作来实现的:插孔本身由struct snd_soc_jack表示,snd_soc_jack_pins表示要更新的DAPM端点,以及代码块提供插孔报告机制。

例如,系统可以具有带有两个报告机制的立体声耳机插孔,一个用于耳机,一个用于麦克风。有些系统在连接耳机时将无法使用扬声器输出,因此在耳机插孔状态发生变化时,需要确保更新扬声器和耳机。

jack - struct snd_soc_jack

这表示系统上的物理插孔,是用户空间可见的。千斤顶本身是完全被动的,它由机器驱动器设置并通过千斤顶检测方法更新。

杰克是由机器驱动程序调用snd_soc_jack_new()创建的。

snd_soc_jack_pin

这些代表DAPM引脚,根据插孔支持的某些状态位进行更新。每个snd_soc_jack都有零个或多个自动更新。它们由机器驱动程序创建,并使用snd_soc_jack_add_pins()与jack相关联。如果需要,端点的状态可以被配置为与插孔状态相反(例如,如果没有通过插孔连接麦克风则启用内置麦克风)。

jack-检测方法

实际插孔检测由代码完成,该代码能够监视系统的一些输入并通过调用snd_soc_jack_report()来更新插孔,指定要更新的位子集。插孔检测代码应由机器驱动程序设置,配置千斤顶更新以及连接插孔时要报告的事物集。

通常这是基于GPIO的状态完成的 - 这个处理程序由snd_soc_jack_add_gpio()函数提供。其他方法也是可用的,例如集成到CODEC中。可以在WM8350驱动程序中看到CODEC集成插孔检测的一个示例。

每个插孔可能有多个报告机制,但至少需要一个才有用。

Machine drivers

这些都由机器驱动程序连接在一起,具体取决于系统硬件。机器驱动程序将设置snd_soc_jack和要更新的引脚列表,然后设置一个或多个插孔检测机制,以根据其当前状态更新该插孔。

你可能感兴趣的:(linux设备与驱动)