Platform: Rockchip

OS: Android 6.0

Kernel: 3.10.92

Overview

Rockchip针对有线耳机的驱动单独建了目录, 在kernel/drivers/headset_observe/下

rockchip_headset_core.c: 读取dts中的配置,根据配置不同决定使用adc还是普通的headset探测。

rk_headset.c: 普通方式headset驱动

rk_headset_irq_hook_adc.c: adc方式headset驱动

注册

耳机插拔事件通过switch子系统上报,目录: kernel/drivers/switch/

通过其switch_dev_register()接口把headset注册到switch子系统中

headset->sdev.name = “h2w”;

headset->sdev.print_name = h2w_print_name;

ret = switch_dev_register(&headset->sdev);

这样就能在/sys下看到h2w的子目录

然后,用户空间就能收到uevent事件得知耳机设备状态有变化,从state文件读取状态得知插入还是拔出来做相应处理。

插拔状态的改变是通过switch_set_state()来实现,本质上就是通知上层并改变state文件值。

dts的配置如下

&adc {

status = "okay";

rockchip_headset {

compatible = "rockchip_headset";

headset_gpio = ;

pinctrl-names = "default";

pinctrl-0 = ;

io-channels = adc 2>;

/*

hook_gpio = ;

hook_down_type = ; //interrupt hook key down status

*/

};

};

headset_gpio: gpio 中断pin .

io-channels: 表示当前要使用adc以及对应的channel.

hook_gpio和hook_down_type并没有定义。

插拔处理:

耳机插拔中断检测在headset_interrupt()@rk_headset_irq_hook_adc.c

static irqreturn_t headset_interrupt(int irq, void *dev_id)

{

//休眠等待电平稳定

msleep(150);

if(headset_info->headset_status == HEADSET_IN)

{

if(pdata->chan != 0)

{

//detect Hook key

//驱动把耳机状态和hook key的检测都放同一个流程中处理了。

schedule_delayed_work(&headset_info->h_delayed_work[HOOK],msecs_to_jiffies(200));

}

}else if(headset_info->headset_status == HEADSET_OUT)

{

......

}

//触发方式从电平触发改成边沿触发,这样,hook key的中断不会影响耳机的插拔电平

//而且耳机插拔也可以被检测到

if(pdata->headset_insert_type == HEADSET_IN_HIGH)

irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_RISING);

else

irq_set_irq_type(headset_info->irq[HEADSET],IRQF_TRIGGER_FALLING);

return IRQ_HANDLED;

}

下半部对应的work queue是hook_once_work()

static void hook_once_work(struct work_struct *work)

{

//通知audio codec预先处理mic

#if defined (CONFIG_SND_SOC_RT3261) || defined (CONFIG_SND_SOC_RT3224)

rt3261_headset_mic_detect(true);

#endif

//adc读取

ret = iio_read_channel_raw(headset_info->chan, &val);

if (ret < 0) {

pr_err("read hook_once_work adc channel() error: %d\n", ret);

}

//没有mic的情况

if(val >= 0 && val < HOOK_LEVEL_LOW)

{

headset_info->isMic= 0;//No microphone

#if defined (CONFIG_SND_SOC_RT3261) || defined (CONFIG_SND_SOC_RT3224)

rt3261_headset_mic_detect(false);

#endif

}

//有mic的情况

else if(val >= HOOK_LEVEL_HIGH)

{

headset_info->isMic = 1;//have mic

//不同按键的电阻值不同,那么读到的电压也不同,hook_work_callback()

//处理识别(adc 读取)。

schedule_delayed_work(&headset_info->hook_work,msecs_to_jiffies(100));

}

//根据是否有mic来得知是headset还是headphone.

headset_info->cur_headset_status = headset_info->isMic ? BIT_HEADSET:BIT_HEADSET_NO_MIC;

//通知上层设备状态变化并改变state文件值

switch_set_state(&headset_info->sdev, headset_info->cur_headset_status);

}

hook key 的上报通过input 子系统实现

注册:

int rk_headset_adc_probe(struct platform_device *pdev,struct rk_headset_pdata *pdata)

{

// Create and register the input driver.

headset->input_dev = input_allocate_device();

if (!headset->input_dev) {

dev_err(&pdev->dev, "failed to allocate input device\n");

ret = -ENOMEM;

goto failed_free;

}

headset->input_dev->name = pdev->name;

headset->input_dev->open = rk_hskey_open;

headset->input_dev->close = rk_hskey_close;

headset->input_dev->dev.parent = &pdev->dev;

//input_dev->phys = KEY_PHYS_NAME;

headset->input_dev->id.vendor = 0x0001;

headset->input_dev->id.product = 0x0001;

headset->input_dev->id.version = 0x0100;

// Register the input device

ret = input_register_device(headset->input_dev);

if (ret) {

dev_err(&pdev->dev, "failed to register input device\n");

goto failed_free_dev;

}

input_set_capability(headset->input_dev, EV_KEY, HOOK_KEY_CODE);

}

上报:

static void hook_work_callback(struct work_struct *work)

{

input_report_key(headset->input_dev,HOOK_KEY_CODE,headset->hook_status);

input_sync(headset->input_dev);

参考:

Android耳机监测以及耳机按键监测

Android下耳机HOOK键功能开发

Android 耳机驱动知识

android耳机检测驱动,[RK3288][Android6.0] 有线耳机驱动小结相关推荐

  1. android获取ion信息,[RK3288][Android6.0] ION 流程和使用小结

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 之前Qualcomm平台有分析过ION, 可参考 http://www.voidcn.com/arti ...

  2. [RK3288][Android6.0] AT24C02驱动分析及功能增加小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Spec: 网上很多,如 https://wenku.baidu.com/view/0020131 ...

  3. [RK3288][Android6.0] 串口驱动流程小结

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 RK的调试串口使用的是另外一套方法(后面再提), 这里的流程针对普通的串口. 相关文件: rk_s ...

  4. android删除wifi配置,[RK3288][Android6.0] WiFi之无线网络配置的忘记(移除)过程

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 ,这里看一下它的移除过程是怎样的,当选择界面的FORGET时,会触发以下流程调用. onForge ...

  5. [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...

  6. [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...

  7. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...

  8. [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...

  9. [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转 这个功能是通过 ...

  10. gpio驱动广播Android,[RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    Platform: ROCKCHIP OS: Android 6.0 Kernel: 3.10.92 由于板子没有lcd无法得知sd卡升级是否完成,因此使用LED显示. Recovery中升级完成后控 ...

最新文章

  1. 四种Java线程池用法解析
  2. 一文梳理视觉Transformer架构进展:与CNN相比,ViT赢在哪儿?
  3. 算法-有向环和拓扑排序
  4. JAVA Integer进制的转换
  5. 作业四 | 个人项目-小学四则运算 “软件”之初版
  6. Cmake-add_library()
  7. 编写lisp程序解一元二次方程_用C语言编写一程序求解一元二次方程的根。
  8. BZOJ 4516 后缀数组+ST+set
  9. 一根网线连接两台路由器
  10. 2021-10-1825. K 个一组翻转链表
  11. 键盘快捷键锁定计算机,用于锁定键盘的键盘快捷键
  12. 医学案例统计分析与SAS应用--自学笔记
  13. Windows和Mac系统盘瘦身的一些经验
  14. 氢原子光谱、类氢原子光谱和类氢离子光谱
  15. k神讲故事-金融的结局
  16. Element的Cascader 级联选择器禁用和回显问题
  17. 缺失数据填补基础方法(3)——Multiple Imputation by Chained Equations (MICE)
  18. hadoop集群web页面无法显示节点信息的解决方法
  19. jvisualvm 插件安装
  20. 【数据篇01】什么是PowerPivot?和PowerBI什么关系?

热门文章

  1. 20150201推荐
  2. AtCoder Grand Contest 030 (AGC030) C - Coloring Torus 构造
  3. Geoserver发布OSM官网地图
  4. linux终端重命名文件夹命令,如何使用命令行轻松重命名文件?
  5. 基于STM32F103RCT6的二维码显示实验
  6. UVALive - 4987 (dp+贪心)
  7. 私人用的红帽linux,红帽宣布为个人开发者提供16个RHEL免费许可 支持在生产环境中使用...
  8. 【迁移学习】STL(Stratified Transfer Learning)小结
  9. OneRel: Joint Entity and Relation Extraction with One Module in One Step
  10. 【赛后总结】第十三届服务外包创新创业大赛总结——A14