Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的。

重点在最后,前边不过一些假想猜測。

http://blog.csdn.net/kangear/article/details/40072707

在调试一下红外遥控器input驱动时,直接採用的是一个半成品的驱动在上边实现的自己的设备的匹配,但同一时候遇到了一些关于input输入子系统的疑惑。

按键一般有「按下和抬起」两个状态一般使用0和1来分别表示。一般例如以下方式上报按键键值就能够完毕「按下和抬起」两个状态的收集。

input_event(ddata->input, EV_KEY, KEY_POWER, 1);

input_sync(ddata->input);

可是近期遇到一个奇怪的问题是内核中的KEY_WAKEUP唤醒键值使用上述方法上报时。用户空间仅仅能检測到状态0,第二次按键时才会有状态1。这样导致Android系统不能正常唤醒,须要按两次才干唤醒系统。

眼下的解决方法是将之前上报KEY_WAKEUP的地上改为KEY_POWER键值。可是好奇心引着我弄清楚它们是怎么回事。

经验出这里边上报例如以下一样连续上报1/0状态才干够在用户空间正常的检測到1/0状态。

input_event(ddata->input, EV_KEY, KEY_WAKEUP, 1);

input_sync(ddata->input);

input_event(ddata->input, EV_KEY, KEY_WAKEUP, 0);

input_sync(ddata->input);

直觉告诉我能够是因为我对这个两个api的不了解造成的。比較是凡事必有因的。

除了KEY_WAKEUP换个其他键值试试。结果和KEY_WAKEUPG一样不能同步,能够判断出是非POWER按键就不行。这能够能所在代码位置有关系:

}else if ((get_suspend_state())&&(ddata->keycode==KEY_POWER)){

input_event(ddata->input, EV_KEY, KEY_POWER, 1);

input_sync(ddata->input);

}

再进一步測试在非PM_SUSPEND_ON电源模式下,全部的按键都是怎样的。測试结果是全部的非POWER按键都出现了按键不能同步的问题。可是不能以点概面。使用GPIO连接的物理按键并不会有此问题。那么就排除了input子系统中做了手脚。

问题出就出在了Remote control驱动中对的处理。

找出了问题所在了。确实是出在了Remote control驱动中,上报键值对PM状态进行了推断,假设

static void remotectl_timer(unsigned long _data)

if(ddata->press != ddata->pre_press) {

ddata->pre_press = ddata->press = 0;

if (get_suspend_state()==0){

//input_event(ddata->input, EV_KEY, ddata->keycode, 1);

//input_sync(ddata->input);

input_event(ddata->input, EV_KEY, ddata->keycode, 0);

input_sync(ddata->input);

}else if ((get_suspend_state())&&(ddata->keycode==KEY_POWER)){

//input_event(ddata->input, EV_KEY, KEY_WAKEUP, 1);

//input_sync(ddata->input);

input_event(ddata->input, EV_KEY, KEY_WAKEUP, 0);

input_sync(ddata->input);

}

}

将过滤条件去除后,能够和GPIO连接的物理按键一样的效果了,即不管系统处理什么样的状态。休眠或者唤醒状态都上传了键值。同一时候这也给我带来了一个疑惑,按键驱动中要不要进行suspend状态推断。依据Android中的经验全部的状态都要上传的。响应不响应是看上层系统的决定。可是假设对于普通的嵌入式Linux系统就不一定了,假设input子系统在系统休眠的时候上传了键值。那么相应的应用层能够就会直接去响应键值。要使用哪种方法实现,这是一个悖论!结合Android的宏这样实现了:

diff --git a/drivers/input/remotectl/rkxx_remotectl.c b/drivers/input/remotectl/rkxx_remotectl.c

index db91516..201c5dd 100644

--- a/drivers/input/remotectl/rkxx_remotectl.c

+++ b/drivers/input/remotectl/rkxx_remotectl.c

@@ -306,6 +306,10 @@ static void remotectl_do_something(unsigned long  data)

if ((ddata->scanData&0x0ff) == ((~ddata->scanData >> 8)&0x0ff)){

if (remotectl_keycode_lookup(ddata)){

ddata->press = 1;

+#ifdef CONFIG_ANDROID // Android OS needs input event whatever suspend state

+                        input_event(ddata->input, EV_KEY, ddata->keycode, 1);

+                        input_sync(ddata->input);

+#else

if (ddata->keycode==KEY_POWER || get_suspend_state()==PM_SUSPEND_ON){

input_event(ddata->input, EV_KEY, ddata->keycode, 1);

input_sync(ddata->input);

@@ -314,6 +318,7 @@ static void remotectl_do_something(unsigned long  data)

}

//input_event(ddata->input, EV_KEY, ddata->keycode, ddata->press);

//input_sync(ddata->input);

+#endif // CONFIG_ANDROID

ddata->state = RMC_SEQUENCE;

}else{

ddata->state = RMC_PRELOAD;

@@ -437,6 +442,10 @@ static void remotectl_timer(unsigned long _data)

if(ddata->press != ddata->pre_press) {

ddata->pre_press = ddata->press = 0;

+#ifdef CONFIG_ANDROID // Android OS needs input event whatever suspend state

+        input_event(ddata->input, EV_KEY, ddata->keycode, 0);

+        input_sync(ddata->input);

+#else

if (get_suspend_state()==0){

//input_event(ddata->input, EV_KEY, ddata->keycode, 1);

//input_sync(ddata->input);

@@ -448,6 +457,7 @@ static void remotectl_timer(unsigned long _data)

input_event(ddata->input, EV_KEY, KEY_WAKEUP, 0);

input_sync(ddata->input);

}

+#endif // CONFIG_ANDROID

}

#ifdef CONFIG_PM

remotectl_wakeup(_data);

假设是Android系统。那么不管kernel处理什么样的休眠状态都实时地上报键值。

这样保证在休眠播放音乐的时候能够控制音频大小。这也正是眼下Android手机的实现方式

http://blog.csdn.net/kangear/article/details/40072707

另一点:按键中的状0,并非input_sync(ddata->input);发出的,它只会发出当前的值。它不过一个「同步」,意思是数据都准备好了,能够发送了。

还是没有对驱动了解的非常清楚加上自己的一些瞎想像误导了自己。内核input驱动中是不区分POWER键,WAKEUP键;真是有差异了,问题一定是出在了自己的驱动代码中。

Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值的更多相关文章

  1. Linux输入子系统详解

    input输入子系统框架  linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Input ...

  2. linux输入子系统

    linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(InputCore)和输入子系统设备驱 ...

  3. linux输入子系统(input subsystem)之evdev.c事件处理过程

    1.代码 input_subsys.drv.c 在linux输入子系统(input subsystem)之按键输入和LED控制的基础上有小改动,input_subsys_test.c不变. input ...

  4. Android安全开发之ZIP文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在“../”的字符串,攻击者可以利用多个“../”在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原有的文件.如果被覆盖掉的文件是动态链接s ...

  5. Android驱动开发之Hello实例

    Android驱动开发之Hello实例:   驱动部分 modified:   kernel/arch/arm/configs/msm8909-1gb_w100_hd720p-perf_defconf ...

  6. Linux输入子系统(转)

    Linux输入子系统(Input Subsystem) 1.1.input子系统概述 输入设备(如按键,键盘,触摸屏,鼠标等)是典型的字符设备,其一般的工作机制是低层在按键,触摸等动作发生时产生一个中 ...

  7. Linux输入子系统(一) _驱动编码

    输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...

  8. Android 安全开发之 ZIP 文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原 ...

  9. linux输入子系统简述【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7678035 1,linux输入子系统简述 其实驱动这部分大多还是转载别人的,linux ...

随机推荐

  1. chmod---变更文件或目录的权限

    chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入.执行3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录的权限, ...

  2. 【TC SRM 718 DIV 2 A】RelativeHeights

    [Link]: [Description] 给你n个数字组成原数列; 然后,让你生成n个新的数列a 其中第i个数列ai为删掉原数列中第i个数字后剩余的数字组成的数列; 然后问你这n个数列组成的排序数组 ...

  3. Android上玩玩Hook?

    在中国互联网这片弱肉强食的丛林中.封闭抄袭是垄断巨头的通行证.创新是弱小创业者的墓志铭. 了解Hook 还没有接触过Hook技术读者一定会对Hook一词感觉到特别的陌生.Hook英文翻译过来就是&qu ...

  4. startActivity-两种start 方式

    对于activity的启动有两种方式 1.startActivity-这种方式比较简单,我们就不做讲解了 2.startActivityForResult-这种启动方式可以实现父子activity双向 ...

  5. 智课雅思词汇---三、aud和auto和bene是什么意思

    智课雅思词汇---三.aud和auto和bene是什么意思 一.总结 一句话总结:aud:听 auto:自己,self bene:good,well 1.anthropo是什么意思? anthropo ...

  6. elasticsearch index之Translog

    跟大多数分布式系统一样,es也通过临时写入写操作来保证数据安全.因为lucene索引过程中,数据会首先据缓存在内存中直到达到一个量(文档数或是占用空间大小)才会写入到磁盘.这就会带来一个风险,如果在写 ...

  7. 关于jquery点击之后,标签的hover失效这个问题

    做一个点击切换的效果,加在a标签上,jquery的click加上css中的hover 点击之后,css的hover效果就没有了,后来知道是click的权值比外联的css大 当点击之后,css代码就被覆 ...

  8. Spark Tachyon实战应用(配置启动环境、运行spark和运行mapreduce)

    Tachyon实战应用 配置及启动环境 修改spark-env.sh 启动HDFS 启动Tachyon Tachyon上运行Spark 添加core-site.xml 启动Spark集群 读取文件并保 ...

  9. ElasticSearch 工作原理

    ElasticSearch 工作原理图 文字说明,以后更新

  10. Android 如何获取Android RecyclerView滑动的距离

    如何获取 RecyclerView 的滑动距离? RecyclerView 虽然有getScrollX() 和 getScrollY(), 但是测试发现这两个函数总是返回0,太无语了.因此想到了下面几 ...