[RK3288][Android6.0] 系统按键驱动流程分析【转】
本文转载自: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] 系统按键驱动流程分析【转】相关推荐
- [RK3288][Android6.0] PWM backlight 驱动流程小结
Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背光的亮暗通过pwm控制,驱动在文件pwm-rockchip.c中,这里不做描述. dts各个配置参数 ...
- android6.0中app crash流程分析
要根据这个流程分析一下如何在应用中截获系统的app crash弹框,然后做到更人性化 基于Android 6.0的源码剖析, 分析Android应用Crash是如何处理的. /frameworks/b ...
- android6.0 挂断电话流程分析(一)
下面是android 6.0挂断电话的流程分析图: 后继续更新挂断回调...........................!
- 按键,触摸屏流程分析
按键触摸屏流程分析: WindowManagerService类的构造函数 WindowManagerService() mQueue = new KeyQ(); 因为 WindowManager ...
- 零死角玩转Android6.0系统Healthd深入分析
零死角玩转Android6.0系统Healthd深入分析 概述 Healthd是android4.4之后提出来的一种中介模型,该模型向下监听来自底层的电池事件,向上传递电池数据信息给Framework ...
- [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转 这个功能是通过 ...
- [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加
Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...
- MTK 按键驱动流程总结
前言 简单介绍了 Input 按键驱动流程 流程 位置:Kpd.c (kernel-3.18\drivers\input\keyboard\mediatek) module_init(kpd_mod_ ...
- [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题
Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...
最新文章
- 百度Q3财报里的“大生意”
- Python-Numpy(3)矩阵基本操作
- 软件测试工程师面试问题
- call、apply、bind
- qpython编写爬虫_Python - 用 PyQt 写爬虫界面
- 左右TextView旋转门问题
- 牛客 - Hash(思维+进制转换)
- 我的2019年度总结
- struts2 jsp跳转action 404_Struts2 学习笔记(三)
- mysql中的操作指令,MySQL中常用指令操作的介绍(代码示例)
- 牛客网【每日一题】Shortest Path 4月3日题目精讲 DFS
- [ZJOI2007]报表统计(链表法+set)
- 突破5G壁垒,睿至科技集团以技术实力赋能产业发展
- 永遠のゼロ 012
- 个人作品- 蘑菇大战
- Atitit 声音和音乐检索 多媒体信息检索 信息检索 目录 1.1. 14.4.5 音频基础知识 	1 1.2. 多媒体信息检索的方法主要有哪些?其原理是什么?	1 1.3. 基于文本的检索和基于
- Linux绚丽屏保xscreensaver安装
- Collectors.reducing总结
- Flowable工作流引擎
- 响应式嵌入 iframe Pym.js
热门文章
- 相同java代码,编译生成class文件不同的原因-JDK版本不同(大版本相同,小版本不同)
- 2011年1月28日早会资料(最终版本)
- mac xampp redis php,MAC XAMPP 整合使用Redis 及 安装php redis扩展
- warning: refname ‘HEAD‘ is ambiguous解决方法
- 【异常:Could not resolve】react-native run-android
- R+markdown+LaTeX 中文编译解决方案
- 解决Chrome浏览器不能访问https网站的问题
- 解决IDEA中Maven加载依赖包慢的问题
- 使用jQuery在AJAX请求中添加标头
- 我应该如何解释接口和抽象类之间的区别?