Message ID | 002801d18a28$2a12dfe0$7e389fa0$@emc.com.tw (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@emc.com.tw> > --- > 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@emc.com.tw> > - * 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.
Hello Dmitry, Please check my response below, thanks. -----Original Message----- From: 'Dmitry Torokhov' [mailto:dmitry.torokhov@gmail.com] Sent: Wednesday, March 30, 2016 10:31 AM To: DusonLin Cc: Linux-kernel@vger.kernel.org; linux-input@vger.kernel.org; 'Charles Mooney'; 'jeff'; 'Phoenix' Subject: Re: [PATCH] Input: Change BTN_TOOL_FINGER falg when HOVER event trigger 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@emc.com.tw> > --- > 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@emc.com.tw> > - * 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. [duson] will do. > 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. [duson] will do. > 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. [duson] But, it looks like the hover is not standard function and not all of touchpad support this function, Even though, we still teach inpu_mt_report_pointer_emulation() to handle this function? Thanks. -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Mar 30, 2016 at 05:49:12PM +0800, DusonLin wrote: > Hello Dmitry, > > Please check my response below, thanks. > > > -----Original Message----- > From: 'Dmitry Torokhov' [mailto:dmitry.torokhov@gmail.com] > Sent: Wednesday, March 30, 2016 10:31 AM > To: DusonLin > Cc: Linux-kernel@vger.kernel.org; linux-input@vger.kernel.org; 'Charles Mooney'; 'jeff'; 'Phoenix' > Subject: Re: [PATCH] Input: Change BTN_TOOL_FINGER falg when HOVER event trigger > > 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@emc.com.tw> > > --- > > 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@emc.com.tw> > > - * 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. > [duson] will do. > > > 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. > [duson] will do. > > > 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. > [duson] But, it looks like the hover is not standard function and not all of touchpad support this function, > Even though, we still teach inpu_mt_report_pointer_emulation() to handle this function? Yes, something like this: If device supports ABS_DISTANCE and does not support ABS_MT_DISTANCE and ABS_DISTANCE != 0 is reported in current frame and there are no other contacts then report BTN_TOOL_FINGER. Thanks.
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@emc.com.tw> - * 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; 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); 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))); input_report_abs(input, ABS_DISTANCE, hover_event != 0); - input_mt_report_pointer_emulation(input, true); + input_mt_report_pointer_emulation(input, false); input_sync(input); }