dm: key: add universal interface to parse gpio and adc key event
Change-Id: I9a1b9d0a36d8fe34ea68bb4f15bf217cae407bf0 Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
parent
459102b8a5
commit
3fb8400061
|
|
@ -45,6 +45,72 @@ static int key_read(struct udevice *dev, int code)
|
||||||
return ops->read(dev, 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)
|
int platform_key_read(int code)
|
||||||
{
|
{
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
|
|
|
||||||
|
|
@ -41,4 +41,8 @@ struct input_key {
|
||||||
uint64_t key_get_timer(uint64_t base);
|
uint64_t key_get_timer(uint64_t base);
|
||||||
int platform_key_read(int code);
|
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
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue