本文转载自:http://blog.csdn.net/kris_fei/article/details/77894406

Rockchip的按键驱动位于 kernel/drivers/input/keyboard/rk_keys.c

默认支持的keys在dts中定义:

其中power key作为普通gpio,具有唤醒功能。而其他按键比如,volume up/down 可以通过adc精确读取到gpio的电压值,原理图如下:

 

和一般的按键一样,驱动是通过内核input子系统来将keys注册供用户空间使用

static int keys_probe(struct platform_device *pdev)
{input = devm_input_allocate_device(dev);input->name = "rk29-keypad"; /* pdev->name; */ input->phys = "gpio-keys/input0"; input->dev.parent = dev; input->id.bustype = BUS_HOST; input->id.vendor = 0x0001; input->id.product = 0x0001; input->id.version = 0x0100; error = input_register_device(input); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

dts keys的解析通过rk_keys_parse_dt()实现。而每个key都会注册一个定时器函数来处理状态变化并通知用户空间。

    for (i = 0; i < ddata->nbuttons; i++) {if (button->code) {setup_timer(&button->timer, keys_timer, (unsigned long)button); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

keys_timer():

static void keys_timer(unsigned long _data)
{//普通gpio直接读取if (button->type == TYPE_GPIO) state = !!((gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low); else //adc转成bool状态值 state = !!button->adc_state; //状态变化上报事件 if (button->state != state) { button->state = state; input_event(input, EV_KEY, button->code, button->state); input_event(input, EV_KEY, button->code, button->state); input_sync(input); } //10ms后启动定时器 if (state) mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES); }

定时器会处理普通gpio和adc两种类型的按键,当状态变化时,会向用户空间上报当前事件、键值、状态。默认开机时,定时器处理函数因为检测不到状态变化而关闭退出。

定时器的开启有两个地方会被调用: 
1.系统开机会启一个工作队列,每100ms周期性调用一次检测有没有按键触发

static void adc_key_poll(struct work_struct *work)
{if (!ddata->in_suspend) { //读取adc电压 result = rk_key_adc_iio_read(ddata); for (i = 0; i < ddata->nbuttons; i++) { //允许值有一定范围的漂移 if (result < button->adc_value + DRIFT_ADVALUE && result > button->adc_value - DRIFT_ADVALUE) button->adc_state = 1; else button->adc_state = 0; if (button->state != button->adc_state) mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES); } } //周期性调用。ADC_SAMPLE_JIFFIES为100ms schedule_delayed_work(&ddata->adc_poll_work, ADC_SAMPLE_JIFFIES); } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2. power key唤醒时中断处理会被触发

static irqreturn_t keys_isr(int irq, void *dev_id)
{//上报power key事件if (button->wakeup && pdata->in_suspend) { button->state = 1; input_event(input, EV_KEY, button->code, button->state); input_sync(input); } if (button->wakeup) wake_lock_timeout(&pdata->wake_lock, WAKE_LOCK_JIFFIES); mod_timer(&button->timer, jiffies + DEBOUNCE_JIFFIES); return IRQ_HANDLED; }

[RK3288][Android6.0] 系统按键驱动流程分析【转】相关推荐

  1. [RK3288][Android6.0] PWM backlight 驱动流程小结

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背光的亮暗通过pwm控制,驱动在文件pwm-rockchip.c中,这里不做描述. dts各个配置参数 ...

  2. android6.0中app crash流程分析

    要根据这个流程分析一下如何在应用中截获系统的app crash弹框,然后做到更人性化 基于Android 6.0的源码剖析, 分析Android应用Crash是如何处理的. /frameworks/b ...

  3. android6.0 挂断电话流程分析(一)

    下面是android 6.0挂断电话的流程分析图: 后继续更新挂断回调...........................!

  4. 按键,触摸屏流程分析

    按键触摸屏流程分析: WindowManagerService类的构造函数 WindowManagerService()   mQueue = new KeyQ(); 因为 WindowManager ...

  5. 零死角玩转Android6.0系统Healthd深入分析

    零死角玩转Android6.0系统Healthd深入分析 概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework ...

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

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

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

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

  8. MTK 按键驱动流程总结

    前言 简单介绍了 Input 按键驱动流程 流程 位置:Kpd.c (kernel-3.18\drivers\input\keyboard\mediatek) module_init(kpd_mod_ ...

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

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

最新文章

  1. 百度Q3财报里的“大生意”
  2. Python-Numpy(3)矩阵基本操作
  3. 软件测试工程师面试问题
  4. call、apply、bind
  5. qpython编写爬虫_Python - 用 PyQt 写爬虫界面
  6. 左右TextView旋转门问题
  7. 牛客 - Hash(思维+进制转换)
  8. 我的2019年度总结
  9. struts2 jsp跳转action 404_Struts2 学习笔记(三)
  10. mysql中的操作指令,MySQL中常用指令操作的介绍(代码示例)
  11. 牛客网【每日一题】Shortest Path 4月3日题目精讲 DFS
  12. [ZJOI2007]报表统计(链表法+set)
  13. 突破5G壁垒,睿至科技集团以技术实力赋能产业发展
  14. 永遠のゼロ       012
  15. 个人作品- 蘑菇大战
  16. Atitit 声音和音乐检索 多媒体信息检索 信息检索 目录 1.1. 14.4.5 音频基础知识 1 1.2. 多媒体信息检索的方法主要有哪些?其原理是什么? 1 1.3. 基于文本的检索和基于
  17. Linux绚丽屏保xscreensaver安装
  18. Collectors.reducing总结
  19. Flowable工作流引擎
  20. 响应式嵌入 iframe Pym.js

热门文章

  1. 相同java代码,编译生成class文件不同的原因-JDK版本不同(大版本相同,小版本不同)
  2. 2011年1月28日早会资料(最终版本)
  3. mac xampp redis php,MAC XAMPP 整合使用Redis 及 安装php redis扩展
  4. warning: refname ‘HEAD‘ is ambiguous解决方法
  5. 【异常:Could not resolve】react-native run-android
  6. R+markdown+LaTeX 中文编译解决方案
  7. 解决Chrome浏览器不能访问https网站的问题
  8. 解决IDEA中Maven加载依赖包慢的问题
  9. 使用jQuery在AJAX请求中添加标头
  10. 我应该如何解释接口和抽象类之间的区别?