我们这里以rk3399 android7.1平台为例,浅析adc接口实现检测耳机的拔插动作。

硬件原理部分:耳机插入把PHE_DET1处的弹片弹开,然后实现headphone_dect直接连通到1.8v,检测端得到高电平1.8v;拔出耳机,弹片回去,只有0.159v电压。所以实现了没有耳机插入时这个“ADC_IN4”为低电位,插入耳机时这个“ADC_IN4”为高电位



耳机实物图:

软件实现部分:
1、kernel

+ //dts配置
+       rockchip_headset {+               compatible = "rockchip_headset";
+               io-channels = <&saradc 4>; //硬件上接的是adc4
+               io-channel-names = "headset";
+               status = "okay";
+       };

驱动:

drivers/headset_observe/rk_headset_irq_hook_adc.c
drivers/headset_observe/rockchip_headset_core.c

驱动代码里probe首先注册switch这个子类,并提供switch_dev_register这个注册入口,对应的设备驱动调用switch_dev_register把自己注册在switch这个子类中,ret = switch_dev_register(&switch_data_headset->sdev);然后在/sys/class/switch目录中就会生成h2w这个子目录,里面会有state,name等一些成员,然后初始化一个工作队列,设置一个时间,循环去执行工作队列去读取ADC 的值,根据读到的值调用switch_set_state函数改变state状态值,然后上层通过读取这个节点的值来相应切换状态。

文件:./drivers/headset_observe/rockchip_headset_core.crockchip_headset_of_match的compatible跟dts的compatible匹配
--> 执行rockchip_headset_probe-->kzalloc(sizeof(struct rk_headset_pdata), GFP_KERNEL); //分配内存给私有结构体rk_headset_pdata-->ret = of_get_named_gpio_flags(node, "headset_gpio", 0, &flags); //解析gpio如果解析到gpio就devm_gpio_request //申请GPIO,gpio_direction_input//设置GPIO口为输入状态-->of_get_named_gpio_flags(node, "hook_gpio", 0, &pdata->hook_gpio); //解析GPIO如果解析不到GPIO就 pdata->chan = iio_channel_get(&pdev->dev, NULL); //获取ADC通道-->if(pdata->chan != NULL) //如果获取到ADC channel就执行ADC检测耳机拔插的probe探测函数-->ret = rk_headset_adc_probe(pdev,pdata);-->否则就执行ret = rk_headset_probe(pdev,pdata); //GPIO检测耳机拔插模式的probe探测函数文件:drivers/headset_observe/rk_headset_irq_hook_adc.c
//宏定义上报给上层的state值
+#define BIT_HEADSET             (0 << 1) //no headphone insertion
+#define BIT_HEADSET_MIC         (1 << 0) //have mic headphone insertion
+#define BIT_HEADSET_NO_MIC      (1 << 1) //no mic headphone insertionrk_headset_adc_probe
->ret = switch_dev_register(&headset->sdev); //注册switch这个子类->INIT_DELAYED_WORK(&headset->h_delayed_work[HOOK], hook_once_work);->iio_read_channel_raw(headset_info->chan, &val);->headset_info->cur_headset_status = headset_info->isMic ? BIT_HEADSET:BIT_HEADSET_NO_MIC;->switch_set_state(&headset_info->sdev, headset_info->cur_headset_status);//这里设置耳机的状态值->schedule_delayed_work(&headset_info->h_delayed_work[HOOK], msecs_to_jiffies(750));//循环750ms执行一次工作队列

shell环境下通过执行cat sys/class/switch/h2w/state 查看耳机插入状态(上层通过获取这个state值去返回对应的状态,显示相应的图标):

rk3399_all:/ #  cat sys/class/switch/h2w/state
state <= 0 表示无耳机插入
state = 1 表示带 Mic 耳机插入
state = 2 表示不带 Mic 耳机插入

在system/media/brillo/audio/audioservice/audio_device_handler.cpp获取状态更新给上层调用,直接读取sys/class/switch/h2w/中state值来获取最新的状态(以下为截取的部分代码)。

static const char kH2WStateFile[] = "/sys/class/switch/h2w/state";63 void AudioDeviceHandler::GetInitialAudioDeviceState(64     const base::FilePath& path) {65   base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);66   if (!file.IsValid()) {67     LOG(WARNING) << "Kernel does not have wired headset support. Could not "68                  << "open " << path.value() << "( "69                  << base::File::ErrorToString(file.error_details()) << " ).";70     return;71   }72   int state = 0;73   int bytes_read = file.ReadAtCurrentPos(reinterpret_cast<char*>(&state), 1);74   state -= '0';75   if (bytes_read == 0) {76     LOG(WARNING) << "Could not read from " << path.value();77     return;78   }79   VLOG(1) << "Initial audio jack state is " << state;80   static const int kHeadPhoneMask = 0x1;81   bool headphone = state & kHeadPhoneMask;82   static const int kMicrophoneMask = 0x2;83   bool microphone = (state & kMicrophoneMask) >> 1;8485   UpdateAudioSystem(headphone, microphone);86 }

rk3399_android7.1耳机拔插ADC检测相关推荐

  1. Android耳机拔插事件流程

    Android所有的input设备都会在/dev/input目录下生成对应的设备节点,一旦有任何输入事件产生,便会将事件写到这些节点下,同时对于外部输入设备(鼠标键盘等)的插拔还会引起这些节点的创建和 ...

  2. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)-b

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  3. 聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)

    如果说一个项目出现的最重大的事故,那无疑就是开发人员使用了不可控的元素. 前言 iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博 ...

  4. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 动态注册广播接收者监听耳机插拔事件 | 重新打开 Oboe 音频流 )

    文章目录 一.动态注册广播接收者监听耳机插拔事件 二.jni 层的 Oboe 播放器代码 ( 重新打开 Oboe 音频流 ) 三.相关资料 基于 [Android 高性能音频]Oboe 开发流程 ( ...

  5. 计算机主机检测不到耳机,win10电脑检测不到耳机怎么办_win10电脑检测不到耳机如何解决-系统城...

    日常在使用win10电脑听歌曲时喜欢插入耳机,这样音质比直接外放好多了,最近很多win10用户出现了耳机拔下来再插上电脑然后耳机听不到声音,检测耳机是没问题的,那么就是设置出现问题,针对此故障,小编这 ...

  6. 8.5.3耳麦拔插事件调用流程分析

    目录 回顾 input系统方法 回顾 在前面的小节中,我们编写了一个驱动程序,模拟耳机的插拔事件,其可以上报耳机的拔插事件,并且修改了android的源代码,可以根据耳机的拔插事件,在状态栏上现实或者 ...

  7. 耳机声控,以及耳机拔出或者插入控制播放暂停

    目录介绍 1.耳机拔出时暂停播放 1.1 拔出耳机自动暂停 , 插入耳机自动恢复播放 1.2 实现的原理分析 1.3 代码实现逻辑 2.耳机线控,耳机控制声音 2.1 耳机按键也可以控制音量调节 2. ...

  8. usb host 驱动 - device 拔插

    1. usbhid 设备拔插 1.1 usb device disconnect 1.1.1 上层卸载usb 设备驱动 生成应用通过ioctl 卸载usb 设备. [ 709.471619] [T29 ...

  9. 安卓监听手机USB接口拔插警报广播

    安卓监听手机USB接口拔插警报广播 很多场景我们都是需要监听手机拔插,手机都会自带一个广播去监听,我们手机充电,手机接入电脑的时候,一般都会有个小小的震动.在商场上,人多混杂,手机插在USB上,一旦有 ...

  10. win10开机USB鼠标要重新拔插才能用的解决方法

    原文地址http://tieba.baidu.com/p/5349926341 我装上win10后,第一时间就装了360,然后用360体检电脑,默认检测出了一堆要优化的选项,按照之前的习惯和对360的 ...

最新文章

  1. excel 按数据拆分 xlam_Excel按类别名称自定义排序:玩转Excel数据
  2. elasticsearch-5.0.0初见
  3. python和sass区别_CSS 的预处理程序(Sass、LESS、Stylus 等)分别都有哪些优缺点?...
  4. java 找不到方法,已经定义的方法找不到
  5. 用 pandas + matplotlib 绘制精美的K线图
  6. python每日一练名片管理程序_Python每日一练0022
  7. output怎么用_用树莓派实现室内温度监控
  8. java platform se binary怎么关闭_如何吐槽舌尖上的折磨?diss难吃只会说malo,那还怎么battle?...
  9. iOS绘图系列四:绘制文字和图像CGContextDrawImage,drawInRect:,drawAtPoint:, UIGraphicsBeginImageContext...
  10. 基于Spring Security的认证方式_编程UserDetailService_Spring Security OAuth2.0认证授权---springcloud工作笔记124
  11. tmp name php,linux环境 上传文件失败 tmp_name为空
  12. java正则表达式 提取 host_使用正则表达式获取链接的Host
  13. 打开MSDTC的方法(图解)
  14. 计算机里怎样打字,电脑知识:如何电脑快速打字
  15. 科学课和计算机整合,信息技术与小学科学课堂整合的现状分析论文
  16. 【图解数据结构】队列全面总结
  17. chrome 抓取图片_利用chrome开发工具进行动态网页抓取
  18. 2016一路有你,2017一起同行
  19. Unity报错(bug)
  20. 阿里P6级别Java程序员月薪多少?阿里认证员工给出答案

热门文章

  1. Oracle ADF开发实战指南pdf
  2. 前端面试题之手写事件模型及事件代理/委托
  3. linux服务器架设——rsync
  4. 工厂三兄弟之简单工厂模式(三)
  5. 【征收SCI稿件】厦门大学信息学院主办!通讯技术与信息科技征稿中!
  6. 泛化性的危机!LeCun发文质疑:测试集和训练集永远没关系...
  7. 收藏! | 入门必读:计算机视觉四大基本任务(分类、定位、检测、分割)
  8. PyTorch1.2.0版本来啦!居然还有全套视频!让你快速熟练掌握深度学习框架!
  9. sklearn.preprocessing.PolynomialFeatures的使用
  10. 演说之禅:演说中的图效优势