Hi Duson, On Wed, Mar 30, 2016 at 10:02:02AM +0800, DusonLin wrote: > Only ABS_DISTANCE is not enough for upper OS to distiguish hover event > be triggered from object form faraway to and close touchpad surface or from > object prepare to leave the touchpad surface. We add BNT_TOOL_FINGER to help > it. > > Object_at_faraway object_at_hover_area object_touch_touchpad > BTN_TOUCH 0 0 1 > BTN_TOOL_FINGER 0 1 1 > ABS_DISTANCE 0 1 0 > > Signed-off by: Duson Lin <dusonlin@xxxxxxxxxx> > --- > drivers/input/mouse/elan_i2c_core.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c > index 2f58985..9392a8c 100644 > --- a/drivers/input/mouse/elan_i2c_core.c > +++ b/drivers/input/mouse/elan_i2c_core.c > @@ -4,7 +4,7 @@ > * Copyright (c) 2013 ELAN Microelectronics Corp. > * > * Author: 林政維 (Duson Lin) <dusonlin@xxxxxxxxxx> > - * Version: 1.6.0 > + * Version: 1.6.1 > * > * Based on cyapa driver: > * copyright (c) 2011-2012 Cypress Semiconductor, Inc. > @@ -845,23 +845,27 @@ static void elan_report_absolute(struct elan_tp_data *data, u8 *packet) > { > struct input_dev *input = data->input; > u8 *finger_data = &packet[ETP_FINGER_DATA_OFFSET]; > - int i; > + int i, valid_count = 0; This appears all whitespace-damaged. > u8 tp_info = packet[ETP_TOUCH_INFO_OFFSET]; > u8 hover_info = packet[ETP_HOVER_INFO_OFFSET]; > bool contact_valid, hover_event; > > - hover_event = hover_info & 0x40; > + hover_event = (hover_info & 0x40); We do not need parentheses here. > for (i = 0; i < ETP_MAX_FINGERS; i++) { > contact_valid = tp_info & (1U << (3 + i)); > elan_report_contact(data, i, contact_valid, finger_data); > > - if (contact_valid) > + if (contact_valid) { > finger_data += ETP_FINGER_DATA_LEN; > + valid_count++; > + } > } > > input_report_key(input, BTN_LEFT, tp_info & 0x01); > + input_report_key(input, BTN_TOOL_FINGER, > + ((hover_event != 0) | (valid_count > 0))); You do not want to use "bitwise or" here. > input_report_abs(input, ABS_DISTANCE, hover_event != 0); > - input_mt_report_pointer_emulation(input, true); > + input_mt_report_pointer_emulation(input, false); I wonder if we should teach input_mt_report_pointer_emulation() to handle hover properly. Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html