android - 什么会导致待机模式下key_up和key_down同时报错

标签 android linux driver

Android device, what will cause key_down and key_up report simultaneouly when I press a key but not release in standby mode. when I press PHONE key, the up event is reproted even I don't releas the key. log as follow:

[  422.143821] *****************[169: 1]
[  422.161351] ltr559ALSPS 1-0023: ltr559 resume
[  422.226537] PM: resume of devices complete after 96.311 msecs
[  422.140462] EV_KEY       KEY_PHONE            DOWN
[  422.140462] EV_SYN       SYN_REPORT           00[  422.440978] PM: suspend exit 2018-01-01 00:08:38.450639901 UTC
000000
[  422.160697] EV_KEY       KEY_PHONE            UP
[  422.160720] EV_SYN       SYN_REPORT           00000001
[  429.564297] *****************[169: 0]

key driver code as follow:

    static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata)
    {
        const struct gpio_keys_button *button = bdata->button;
        struct input_dev *input = bdata->input;
        unsigned int type = button->type ?: EV_KEY;
        int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low;

        if( (!bdata->key_pressed && !state) || (bdata->key_pressed && !!state) )
            return;
        bdata->key_pressed = !!state;
        if (type == EV_ABS) {
            if (state)
                input_event(input, type, button->code, button->value);
        } else {
            input_event(input, type, button->code, !!state);
            printk(KERN_ERR "*****************[%d: %d]\n", button->code, !!state);
        }   
        input_sync(input);
    }

    static void gpio_keys_gpio_work_func(struct work_struct *work)
    {
        struct gpio_button_data *bdata =
            container_of(work, struct gpio_button_data, work);

        gpio_keys_gpio_report_event(bdata);

        if (bdata->button->wakeup && !bdata->key_pressed)
            pm_relax(bdata->input->dev.parent);
    }

    static void gpio_keys_gpio_timer(unsigned long _data)
    {
        struct gpio_button_data *bdata = (struct gpio_button_data *)_data;

        schedule_work(&bdata->work);
    }

    static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
    {
        struct gpio_button_data *bdata = dev_id;

        BUG_ON(irq != bdata->irq);

        if (bdata->button->wakeup && !bdata->key_pressed)                                                                                                                                                                                                                     
            pm_stay_awake(bdata->input->dev.parent);
        if (bdata->timer_debounce)
            mod_timer(&bdata->timer,
                jiffies + msecs_to_jiffies(bdata->timer_debounce));
        else
            schedule_work(&bdata->work);

        return IRQ_HANDLED;
    }

最佳答案

我现在找到了根本原因。是debounce时间设置的太短了。

关于android - 什么会导致待机模式下key_up和key_down同时报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48682170/

相关文章:

c - 将 wordexp 的输出提供给 getopt_long 会使我的 linux cli 应用程序崩溃

c++ - 使用 C++ 从 Linux 环境变量中查找文件的路径名

java - 如何在 Tomcat 7.0.47 启动时注册 oracle jdbc 驱动程序?

android - 使用android自写文字动画

android - 方法调用 'toString' 可能会产生 'java.lang.NullPointerException' ?

android - 将 Android ListView "categories"贴到顶部

python - 在 Solaris 上为 jython 2.5 编译 Mysqldb

android - 如何在Android studio中为预构建库设置本地cpp源路径

linux - 没有 Kerberos 的调度 crontab

c - 物理载波监听返回的数据存储在哪里?