zoukankan      html  css  js  c++  java
  • Android4.4 耳机检测分析

      在ALSA架构中,ASOC是由3个部分组成:Platform、CODEC & Machine。而耳机检测一般是在Machine driver里实现,当然也可以在CODEC driver里实现。耳机插拔接口Jack的结构图如图1所示(iPhone和Nokia耳机MIC & GROUND正好相反)。 

    图1.Jack结构图

      耳机检测信号HP_DET#可以通过以下有两种方式传递到SOC端:

      1.直接将HP_DET#信号接到SOC端;

      2.将HP_DET#信号先接到CODEC端,再有CODEC端GPIO/IRQ引脚将信号传送到SOC端;

      若要实现方法2,需要在CODEC driver端进行一系列的配置,比如给COEDC端耳机检测引脚JD#上电、GPIO/IRQ输出用做JD#状态检测 & IRQ Debounce Clock选择Interal Clock等,这样才能开启CODEC端HP_DET#信号的接收和中断信号的上报。

      同样的,在Machine driver中也要做以下3个操作:

      1.定义一个类型为“snd_soc_jack_gpios”的结构体变量hs_gpio,该变量是用来配置用于耳机检测的gpio。hs_gpio结构体中初始化该gpio的name、report、debounce_time、jack_status_check & irq_flags等结构体变量,其中name表示gpio的名字;report表示会上报的状态种类,一共有HEADSET、HEADPHONE & BUTTON;debounce_time表示防抖动时延;jack_status_check表示中中处理函数;irq_flags表示中断处理函数是上升沿触发还是下降沿触发。

    1 static struct snd_soc_jack_gpio hs_gpio[] = {
    2     [HSDET] = {
    3         .name            = "AUDIOCODEC_INT",
    4         .report            = SND_JACK_HEADSET | SND_JACK_HEADPHONE |  SND_JACK_BTN_0,
    5         .debounce_time        = 100,
    6         .jack_status_check    = jack_gpio_detect_bp,
    7         .irq_flags        = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
    8     },
    9 };

      2.通过snd_soc_jack_new()函数新建一个新的jack,将该jack指向Machine对应的CODEC,使该jack与CODEC建立联系。

      3.通过snd_soc_jack_add_gpios()函数将定义好的GPIO pins与ASoC jack联系起来,并实现GPIO pins的中断申请irq_request & 通过snd_jack_report上报jack_status。

      

      总结,实现kernel层耳机检测,主要是通过系统release出来的函数接口实现GPIO pins的配置、GPIO pins与CODEC建立联系 & GPIO pins与ASoC建立联系这3部分组成。

      【参考文章:http://blog.csdn.net/piaozhiye/article/details/25101891】 

      

  • 相关阅读:
    学习官方示例 System.Assigned
    用 TBytesStream 类实现的读文件为十六进制字符的函数
    学习官方示例 System.Hi、System.Lo
    给 TComboBox 添加图标 回复 "heyongan" 的问题
    [每周特惠]WPF编程(第二版) + 设计模式—基于C#的工程化实现及扩展
    【公告】8月28日(周六)早上5:007:00服务器升级
    【网站公告】新Web服务器上线
    欢迎参加上海张江浦东软件园以及分园的技能培训课程
    上周热点回顾(8.309.5)
    上周热点回顾(8.168.22)
  • 原文地址:https://www.cnblogs.com/Peter-Chen/p/3900498.html
Copyright © 2011-2022 走看看