From 3fb8400061cb87ff97a6d26dec8b33728867ebb5 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 28 Feb 2018 14:21:44 +0800 Subject: [PATCH] dm: key: add universal interface to parse gpio and adc key event Change-Id: I9a1b9d0a36d8fe34ea68bb4f15bf217cae407bf0 Signed-off-by: Joseph Chen --- drivers/input/key-uclass.c | 66 ++++++++++++++++++++++++++++++++++++++ include/key.h | 4 +++ 2 files changed, 70 insertions(+) diff --git a/drivers/input/key-uclass.c b/drivers/input/key-uclass.c index 4a437c920e..21e25f63a0 100644 --- a/drivers/input/key-uclass.c +++ b/drivers/input/key-uclass.c @@ -45,6 +45,72 @@ static int key_read(struct udevice *dev, int code) return ops->read(dev, code); } +int key_parse_adc_event(struct input_key *key, unsigned int adcval) +{ + int report = KEY_NOT_EXIST; + int max, min; + + debug("%s: %s: max=%d, min=%d, adcval=%d\n", + __func__, key->name, max, min, adcval); + + /* Get min, max */ + max = key->value + key->margin; + if (key->value > key->margin) + min = key->value - key->margin; + else + min = key->value; + + /* Check */ + if ((adcval <= max) && (adcval >= min)) { + report = KEY_PRESS_DOWN; + printf("%s key pressed..\n", key->name); + } else { + report = KEY_PRESS_NONE; + } + + return report; +} + +int key_parse_gpio_event(struct input_key *key) +{ + u32 report = KEY_NOT_EXIST; + + debug("%s: %s: up=%llu, down=%llu, delta=%llu\n", + __func__, key->name, key->up_t, key->down_t, + key->up_t - key->down_t); + + /* Possible this is machine power-on long pressed, so ignore this */ + if (key->down_t == 0 && key->up_t != 0) { + report = KEY_PRESS_NONE; + goto out; + } + + if ((key->up_t > key->down_t) && + (key->up_t - key->down_t) >= KEY_LONG_DOWN_MS) { + key->up_t = 0; + key->down_t = 0; + report = KEY_PRESS_LONG_DOWN; + printf("%s key long pressed(hold)..\n", key->name); + } else if (key->down_t && + key_get_timer(key->down_t) >= KEY_LONG_DOWN_MS) { + key->up_t = 0; + key->down_t = 0; + report = KEY_PRESS_LONG_DOWN; + printf("%s key long pressed..\n", key->name); + } else if ((key->up_t > key->down_t) && + (key->up_t - key->down_t) < KEY_LONG_DOWN_MS) { + key->up_t = 0; + key->down_t = 0; + report = KEY_PRESS_DOWN; + printf("%s key short pressed..\n", key->name); + } else { + report = KEY_PRESS_NONE; + } + +out: + return report; +} + int platform_key_read(int code) { struct udevice *dev; diff --git a/include/key.h b/include/key.h index 911804dd08..b7b8672bc8 100644 --- a/include/key.h +++ b/include/key.h @@ -41,4 +41,8 @@ struct input_key { uint64_t key_get_timer(uint64_t base); int platform_key_read(int code); +/* General interface for adc or gpio interrupt key event parse */ +int key_parse_gpio_event(struct input_key *key); +int key_parse_adc_event(struct input_key *key, unsigned int adcval); + #endif