Message ID | 1477603873-9143-1-git-send-email-roderick@gaikai.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
> -----Original Message----- > From: Roderick Colenbrander on Thursday, October 27, 2016 2:31 PM > The input-mt driver pointer emulation from 'input_mt_sync_frame' > regardless > of the flags passed in to 'input_mt_init_slots' by device drivers. There seems to be a verb missing from this sentence. > Pointer emulation is undesired on drivers, which didn't request this > capability like the hid-sony driver for the Dualshock 4. This gamepad already > reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would > inject touchpad values into these sticks, which is undesired. > > This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from > within > input_mt_sync_frame to only allow pointer emulation when the feature was > requested by the driver as the flags were set in input_mt_init_slots. > --- > drivers/input/input-mt.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c > index a1bbec9..30c8128 100644 > --- a/drivers/input/input-mt.c > +++ b/drivers/input/input-mt.c > @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) > if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & > INPUT_MT_SEMI_MT)) > use_count = true; > > - input_mt_report_pointer_emulation(dev, use_count); > + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) > + input_mt_report_pointer_emulation(dev, use_count); > > mt->frame++; > } > -- > 2.7.4 > -- 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
Hi Roderick, > Pointer emulation is undesired on drivers, which didn't request this > capability like the hid-sony driver for the Dualshock 4. This gamepad already > reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would > inject touchpad values into these sticks, which is undesired. > > This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from within > input_mt_sync_frame to only allow pointer emulation when the feature was > requested by the driver as the flags were set in input_mt_init_slots. So why call input_mt_sync_frame() in the first place? The existing drivers that use ABS_X / ABS_Y independently do not call that function. It seems your recent hid-sony patches adds it, which leads to broken behavior. > --- > drivers/input/input-mt.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c > index a1bbec9..30c8128 100644 > --- a/drivers/input/input-mt.c > +++ b/drivers/input/input-mt.c > @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) > if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) > use_count = true; > > - input_mt_report_pointer_emulation(dev, use_count); > + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) > + input_mt_report_pointer_emulation(dev, use_count); > > mt->frame++; > } > That said, I am not against this patch at all, I think it is good, but the commit message should address the effect on the large number of existing drivers that use this functionality. Is any of them affected by this patch? As you probably know, we do not like to break userspace. From what I can see, only hid-multitouch (Benjamin?) and hid-sony use input_mt_init_slots() in such a way that MT_POINTER or MT_DIRECT cannot be directly inferred. So if Benjamin sees no issues with this, I am ok with the change. Thanks, Henrik -- 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 Thu, Oct 27, 2016 at 02:31:13PM -0700, Roderick Colenbrander wrote: > From: Roderick Colenbrander <roderick.colenbrander@sony.com> > > The input-mt driver pointer emulation from 'input_mt_sync_frame' regardless > of the flags passed in to 'input_mt_init_slots' by device drivers. Right, because needing single-touch (pointer) emulation is not property of device or driver but rather consumer. If we get to the point where everything is ready to accept multi-touch (are we there yet) then we can stop doing pointer emulation altogether. > > Pointer emulation is undesired on drivers, which didn't request this > capability like the hid-sony driver for the Dualshock 4. This gamepad already > reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would > inject touchpad values into these sticks, which is undesired. The driver should not be re-purposing events like that. ABS_MT_POSITION_X and ABS_X should match. Why doesn't driver follow Documentation/input/gamepad.txt? > > This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from within > input_mt_sync_frame to only allow pointer emulation when the feature was > requested by the driver as the flags were set in input_mt_init_slots. > --- > drivers/input/input-mt.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c > index a1bbec9..30c8128 100644 > --- a/drivers/input/input-mt.c > +++ b/drivers/input/input-mt.c > @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) > if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) > use_count = true; > > - input_mt_report_pointer_emulation(dev, use_count); > + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) > + input_mt_report_pointer_emulation(dev, use_count); > > mt->frame++; > } > -- > 2.7.4 > Thanks.
Hi Henrik, Please see my comments inline. Thanks, Roderick On Thu, Oct 27, 2016 at 3:46 PM, Henrik Rydberg <rydberg@bitmath.org> wrote: > Hi Roderick, > >> Pointer emulation is undesired on drivers, which didn't request this >> capability like the hid-sony driver for the Dualshock 4. This gamepad already >> reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would >> inject touchpad values into these sticks, which is undesired. >> >> This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from within >> input_mt_sync_frame to only allow pointer emulation when the feature was >> requested by the driver as the flags were set in input_mt_init_slots. > > So why call input_mt_sync_frame() in the first place? > > The existing drivers that use ABS_X / ABS_Y independently do not call that > function. It seems your recent hid-sony patches adds it, which leads to broken > behavior. As part of the review, it was recommended to call input_mt_sync_frame to make sure we don't lose certain events. Later on after more validation, we noticed this issue which we weren't aware of. >> --- >> drivers/input/input-mt.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c >> index a1bbec9..30c8128 100644 >> --- a/drivers/input/input-mt.c >> +++ b/drivers/input/input-mt.c >> @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) >> if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) >> use_count = true; >> >> - input_mt_report_pointer_emulation(dev, use_count); >> + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) >> + input_mt_report_pointer_emulation(dev, use_count); >> >> mt->frame++; >> } >> > > That said, I am not against this patch at all, I think it is good, but the > commit message should address the effect on the large number of existing drivers > that use this functionality. Is any of them affected by this patch? As you > probably know, we do not like to break userspace. > > From what I can see, only hid-multitouch (Benjamin?) and hid-sony use > input_mt_init_slots() in such a way that MT_POINTER or MT_DIRECT cannot be > directly inferred. So if Benjamin sees no issues with this, I am ok with the change. > > Thanks, > Henrik > -- 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 Thu, Oct 27, 2016 at 4:19 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > On Thu, Oct 27, 2016 at 02:31:13PM -0700, Roderick Colenbrander wrote: >> From: Roderick Colenbrander <roderick.colenbrander@sony.com> >> >> The input-mt driver pointer emulation from 'input_mt_sync_frame' regardless >> of the flags passed in to 'input_mt_init_slots' by device drivers. > > Right, because needing single-touch (pointer) emulation is not property > of device or driver but rather consumer. If we get to the point where > everything is ready to accept multi-touch (are we there yet) then we can > stop doing pointer emulation altogether. > >> >> Pointer emulation is undesired on drivers, which didn't request this >> capability like the hid-sony driver for the Dualshock 4. This gamepad already >> reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would >> inject touchpad values into these sticks, which is undesired. > > The driver should not be re-purposing events like that. > ABS_MT_POSITION_X and ABS_X should match. > > Why doesn't driver follow Documentation/input/gamepad.txt? > The original hid-sony code and the multitouch handling code for the Dualshock 4 were written by the community. We are stepping in to make the hid-sony driver properly handle the Dualshock 4. The driver doesn't fully follow the gamepad spec yet, which we will try to improve. At least the left analog stick is reported as ABS_X and ABS_Y already, but the buttons are inconsistent and right stick is wrong as well. While it would be great to conform to the spec, the conflict with multitouch would still exist as the Dualshock 4 has both analog sticks and a multitouch touchpad. Disabling the pointer emulation feature avoids the conflict. This issue was only exposed recently by adding of the input_mt_sync_frame call as recommended by Benjamin as part of some improvements we did for touchpad handling in hid-sony. >> >> This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from within >> input_mt_sync_frame to only allow pointer emulation when the feature was >> requested by the driver as the flags were set in input_mt_init_slots. >> --- >> drivers/input/input-mt.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c >> index a1bbec9..30c8128 100644 >> --- a/drivers/input/input-mt.c >> +++ b/drivers/input/input-mt.c >> @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) >> if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) >> use_count = true; >> >> - input_mt_report_pointer_emulation(dev, use_count); >> + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) >> + input_mt_report_pointer_emulation(dev, use_count); >> >> mt->frame++; >> } >> -- >> 2.7.4 >> > > Thanks. > > -- > Dmitry Thanks,
On Thu, Oct 27, 2016 at 04:46:01PM -0700, Roderick Colenbrander wrote: > On Thu, Oct 27, 2016 at 4:19 PM, Dmitry Torokhov > <dmitry.torokhov@gmail.com> wrote: > > On Thu, Oct 27, 2016 at 02:31:13PM -0700, Roderick Colenbrander wrote: > >> From: Roderick Colenbrander <roderick.colenbrander@sony.com> > >> > >> The input-mt driver pointer emulation from 'input_mt_sync_frame' regardless > >> of the flags passed in to 'input_mt_init_slots' by device drivers. > > > > Right, because needing single-touch (pointer) emulation is not property > > of device or driver but rather consumer. If we get to the point where > > everything is ready to accept multi-touch (are we there yet) then we can > > stop doing pointer emulation altogether. > > > >> > >> Pointer emulation is undesired on drivers, which didn't request this > >> capability like the hid-sony driver for the Dualshock 4. This gamepad already > >> reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would > >> inject touchpad values into these sticks, which is undesired. > > > > The driver should not be re-purposing events like that. > > ABS_MT_POSITION_X and ABS_X should match. > > > > Why doesn't driver follow Documentation/input/gamepad.txt? > > > > The original hid-sony code and the multitouch handling code for the Dualshock 4 > were written by the community. We are stepping in to make the hid-sony driver > properly handle the Dualshock 4. > The driver doesn't fully follow the gamepad spec yet, which we will > try to improve. At > least the left analog stick is reported as ABS_X and ABS_Y already, > but the buttons > are inconsistent and right stick is wrong as well. > While it would be great to conform to the spec, the conflict with > multitouch would still > exist as the Dualshock 4 has both analog sticks and a multitouch touchpad. > > Disabling the pointer emulation feature avoids the conflict. This > issue was only exposed > recently by adding of the input_mt_sync_frame call as recommended by Benjamin as > part of some improvements we did for touchpad handling in hid-sony. As I mentioned, ABS_MT_POSITION_X and ABS_X should represent the same data, so the driver's use of them for different sub-devices is not correct. Maybe the multitouch "touchpad" should be reported as completely separate input device and userspace should "stitch" it back into composite device. In any case, as I mentioned above, the pointer emulation is requirement of client and thus this patch is not appropriate. Thanks.
On Thu, Oct 27, 2016 at 4:54 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > On Thu, Oct 27, 2016 at 04:46:01PM -0700, Roderick Colenbrander wrote: >> On Thu, Oct 27, 2016 at 4:19 PM, Dmitry Torokhov >> <dmitry.torokhov@gmail.com> wrote: >> > On Thu, Oct 27, 2016 at 02:31:13PM -0700, Roderick Colenbrander wrote: >> >> From: Roderick Colenbrander <roderick.colenbrander@sony.com> >> >> >> >> The input-mt driver pointer emulation from 'input_mt_sync_frame' regardless >> >> of the flags passed in to 'input_mt_init_slots' by device drivers. >> > >> > Right, because needing single-touch (pointer) emulation is not property >> > of device or driver but rather consumer. If we get to the point where >> > everything is ready to accept multi-touch (are we there yet) then we can >> > stop doing pointer emulation altogether. >> > >> >> >> >> Pointer emulation is undesired on drivers, which didn't request this >> >> capability like the hid-sony driver for the Dualshock 4. This gamepad already >> >> reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would >> >> inject touchpad values into these sticks, which is undesired. >> > >> > The driver should not be re-purposing events like that. >> > ABS_MT_POSITION_X and ABS_X should match. >> > >> > Why doesn't driver follow Documentation/input/gamepad.txt? >> > >> >> The original hid-sony code and the multitouch handling code for the Dualshock 4 >> were written by the community. We are stepping in to make the hid-sony driver >> properly handle the Dualshock 4. >> The driver doesn't fully follow the gamepad spec yet, which we will >> try to improve. At >> least the left analog stick is reported as ABS_X and ABS_Y already, >> but the buttons >> are inconsistent and right stick is wrong as well. >> While it would be great to conform to the spec, the conflict with >> multitouch would still >> exist as the Dualshock 4 has both analog sticks and a multitouch touchpad. >> >> Disabling the pointer emulation feature avoids the conflict. This >> issue was only exposed >> recently by adding of the input_mt_sync_frame call as recommended by Benjamin as >> part of some improvements we did for touchpad handling in hid-sony. > > As I mentioned, ABS_MT_POSITION_X and ABS_X should represent the same > data, so the driver's use of them for different sub-devices is not > correct. Maybe the multitouch "touchpad" should be reported as > completely separate input device and userspace should "stitch" it back > into composite device. > > In any case, as I mentioned above, the pointer emulation is requirement > of client and thus this patch is not appropriate. > > Thanks. > > -- > Dmitry Thanks for your reply. I guess the only option then is to create an actual sub device. I suppose we are not the first input driver exposing sub devices. Are there good example drivers you can recommend (or drivers to avoid glancing at)? The only concern I have is the stitching together in user space, which not kinds of platforms or userland libraries are handling. The only way is to inspect sysfs and try to tie things together. It would be nice if there was some better way. From memory Video4Linux exposed various APIs to locate subdevices from the 'master' device. Thanks, Roderick -- 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
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c index a1bbec9..30c8128 100644 --- a/drivers/input/input-mt.c +++ b/drivers/input/input-mt.c @@ -305,7 +305,8 @@ void input_mt_sync_frame(struct input_dev *dev) if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) use_count = true; - input_mt_report_pointer_emulation(dev, use_count); + if (mt->flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) + input_mt_report_pointer_emulation(dev, use_count); mt->frame++; }
From: Roderick Colenbrander <roderick.colenbrander@sony.com> The input-mt driver pointer emulation from 'input_mt_sync_frame' regardless of the flags passed in to 'input_mt_init_slots' by device drivers. Pointer emulation is undesired on drivers, which didn't request this capability like the hid-sony driver for the Dualshock 4. This gamepad already reports ABS_X / ABS_Y for gamepad stick purposes. Pointer emulation would inject touchpad values into these sticks, which is undesired. This patch checks the flags INPUT_MT_POINTER / INPUT_MT_DIRECT from within input_mt_sync_frame to only allow pointer emulation when the feature was requested by the driver as the flags were set in input_mt_init_slots. --- drivers/input/input-mt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)