input使用:按音量键唤醒系统

来源:互联网 发布:idc虚拟主机源码 编辑:程序博客网 时间:2024/05/19 17:56

链接地址:input遇到的问题

在input上报数据的时候,首先需要设置的是上报的type,然后需要对相应type的code进行置位,比如要上报按键值和绝对值,我们需要如下设置:
set_bit(EV_ABS, ts->input_dev->evbit);
set_bit(EV_KEY, ts->input_dev->evbit);
我们可以看到input_dev这个结构体:
struct input_dev {
......
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];

unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
        ......
}
这里面的都相当于是标志位,支持什么样的上报类型,就对evbit进行置位。
然后对于按键,支持哪些按键值呢?这个我们又需要对keybit进行置位,比如我们支持power键,那么需要做如下设置:
set_bit(KEY_POWER, ts->input_dev->keybit);
对绝对值的设置:
__set_bit(ABS_X, ts->input_dev->absbit);
__set_bit(ABS_Y, ts->input_dev->absbit);
__set_bit(ABS_PRESSURE, ts->input_dev->absbit);
然后绝对值还需要设置他的范围,精细度等:
input_set_abs_params(ts->input_dev, ABS_X, 0, 600, 0, 0);
input_set_abs_params(ts->input_dev, ABS_Y, 0, 500, 0, 0);
input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 512, 0, 0);
OK,当作为上面的步骤,现在就可以上报数据了,就可以通过getevent来查看。

有的时候我们发现驱动代码里面已经上报了某个值,但是在getevent里面没有看到,这个有可能是上报的值都是相同的,只要是相同的值,都不再重复上报。


继续补充:

现在项目需要,按音量键的时候是需要唤醒系统的,gpio肯定是需要具有唤醒功能的,然后设置相应的按键具有唤醒功能,如下:

[cpp] view plain copy
  1. struct gpio_keys_button keys[] = {  
  2.     {  
  3.         .code              = KEY_VOLUMEDOWN,  
  4.         .gpio              = GPIO_KEY_VOLUME_DOWN,  
  5.         .active_low        = 1,  
  6.         .desc              = "volume_down_key",  
  7.         .type              = EV_KEY,  
  8.         .wakeup            = 1,   //change to 1 for wake up  
  9.         .debounce_interval = 20,  
  10.         .can_disable       = true,  
  11.     },  
  12.     {  
  13.         .code              = KEY_VOLUMEUP,  
  14.         .gpio              = GPIO_KEY_VOLUME_UP,  
  15.         .active_low        = 0,  
  16.         .desc              = "volume_up_key",  
  17.         .type              = EV_KEY,  
  18.         .wakeup            = 1,   //change to 1 for wake up  
  19.         .debounce_interval = 20,  
  20.         .can_disable       = true,  
  21.     }  


这么修改之后,我想系统应该是可以唤醒系统了(至于是否亮屏这个是上层处理的事情),现在遇到的问题是刚按下按键,手未松开就发现上报了up事件(用getevent查看)。而我们在按键驱动文件里面加打印信息,并没有发现有任何上报的情况。我们知道,所有的input消息,最后都是通过evdev.c这个文件里面的evdev_event()这个函数来上报的,我们在这里发现了有上报的调用,通过dump_stack()发现了问题。原来是input子系统在resume的时候,对按键进行了复位,当它发现这个按键上报了down之后,立刻复位上报了up事件。
input_dev_resume()--->input_reset_device()--->input_dev_release_keys()--->input_pass_event(dev, EV_KEY, code, 0);
这下总算找到了原因,把这个地方屏蔽了就OK了。而且我们发现如下的一下同步信息,也是这里产生的:

/dev/input/event0: EV_SYN       SYN_REPORT           00000001            
/dev/input/event4: EV_SYN       SYN_REPORT           00000001            
/dev/input/event3: EV_SYN       SYN_REPORT           00000001                         
/dev/input/event2: EV_SYN       SYN_REPORT           00000001            
/dev/input/event1: EV_SYN       SYN_REPORT           00000001                   
/dev/input/event6: EV_SYN       SYN_REPORT           00000001
我们驱动代码里面,同步信息都是上报的0,这里的1也是reset上报的。当然不知道这里屏蔽了有没有其他的影响,哪位大牛知道有什么问题也可以告诉我...


0 0
原创粉丝点击