Hi Tero,
[just a quick note, I am supposed to be on holiday this week]
On Thu, Nov 4, 2021 at 2:38 PM Tero Kristo <tero.kristo@xxxxxxxxxxxxxxx> wrote:
Hi,This series unfortunately raised quite a few red flags for me, and I
This series is an RFC for USI (Universal Stylus Interface) style pen
support. This is based on documentation from USB org describing the HID
usage tables for digitizers (page 0x0D) and experimentation with actual
USI capable controllers.
This series introduces the USI support with a new HID driver, which
applies the controller specific quirks. The most problematic part of the
USI support is handling of the pen parameters (color, line width, line
style), which are not immediately available from the controller from pen
down event, but must be cached and queried separately from the controller.
In addition to that, when a get-feature report is sent to the
controller, there is a delay before the proper value is reported out; it
is not part of the feature report coming back immediately.
Most of the code in the driver is to handle this (otherwise we could
just use hid-generic.)
This also boils down to the reason why this series is an RFC, I would like
to receive some feedback which option to pick for programming of the new
values for the programmable pen parameters; whether to parse the input
events so userspace can directly write the new values to the input event
file handle, or whether to use IOCTL. Patches #7 / #8 are sort of optional
choices towards this, but are there to show that both approaches can be
done. Direct write to evdev causes some confusion on the driver level
though, thus patch #7 is there to avoid some of that introducing new
input events for writing the parameters. IOCTL might be the cleanest
approach and I am slightly leaning towards that myself (see patch #8,
this would need to be squashed and cleaned up a bit though but would
effectively get rid of some code from patch #6 and completely rid patch #7.)
am glad this is just an RFC.
Let me enumerate them first and discuss a little bit more about those:
1. USI is supposed to be generic, so why is there a new driver for it
instead of being handled by hid-input.c?
2. new MSC_EVENTS are created without Dmitry or Peter being CC-ed
3. new ioctls???
4. direct write to evdev to write parameters
5. patch 1/8 doesn't compile without 5/8
6. no tests :)
1. new driver
After quickly reading the RFC, I think the main issue there is that we
are now having a transducer index which is incompatible with the way
input and evedev works nowadays. Yay, we have a new hid-multitouch for
pen :(
Wacom has been dealing with that situation for years by tweaking the
protocol and by just emitting a different serial number (roughly). I
think the safest approach would be to keep the existing protocol
running so that our user space can handle it properly.
I'd need to read the rest of the code more carefully, but if we could
have a basic generic handling (without the fancy features like
changing the pen style/color) I'd be happier.
In my tests, it seems like MSC_* from the USI pens with these patches only get reported to userspace if something changes. Otherwise they do not get through at all. I have a small quirk in the driver to address this for a case where a new userspace handle is opened while pen is already in use; it does not get the params reported at all unless I flush the current entries out (by reporting a bogus value followed immediately by the real value.) Anyways, ABS events would be fine for the parameters also I believe if this is desirable.
2. MSC_* events
there is an issue with those: they are not cached like the ABS_* ones.
Meaning that each report will wake up userspace for something which
basically doesn't change.
I know ABS_* is saturated, but I'd like to have reviews from others on
what could be done here instead of just using MSC_* as a new ABS_*
I agree I am torn between the ioctl / direct evdev write. Both have their bad sides to them, thus I provided sort of support for both. :)
3. ioctls
this is problematic to me. Any new kernel ABI is problematic to me,
and I'd much rather not add any new ones.
My new set of mind is because of the recent work I have been
conducting regarding eBPF.
Basically I managed to have eBPF programs handling the device
configuration and event processing in a local branch.
I should be able to push a WIP next week, but basically this should
allow me to not have to deal with new kernel APIs besides the generic
eBPF one.
We can imagine a generic hid-input.c processing for those tablets, and
have a new userspace component that loads an eBPF program with its own
userspace API which is capable of the fancy features.
For instance, my current playground is setting the haptic feedback of
the Surface Dial depending on the resolution I set on it.
Furthermore, ioctls on a new cdev means that the classic userspace
libraries will not have access to it without some heavy tuning in the
systemd space (libinput only has read/write access to
/dev/input/event*).
Well, we need to be able to program the pen parameters somehow from userspace, I am open to any suggestions how this could/should be done.
4. direct write to evdev
We enabled that once for LEDs, and it's a pain to maintain. Maybe we
can make a use case for it but given that you don't seem very
enthusiastic about it too, I wonder if this is not a dead end.
Yeah sorry about that. Will fix all those for next rev.
5. patch ordering doesn't compile
I guess this is just a rebase hiccup. Not an issue for an RFC
Ok I can take a look at these, thanks for the pointer. I am quite new to the input side of things and have been using whatever I have been able to craft myself, or found via googling.
6. tests
For these kinds of new classes of devices, I'd like to have tests in
the https://gitlab.freedesktop.org/libevdev/hid-tools repository.
There is already an initial MR for tablet support (!115 in this
project), and we should extend it with more tests.
I'd happily help with those tests if you could share the report
descriptors and some device dumps made with the hid-recorder tool from
that repository.
The driver has been tested with chromebooks that contain either GoodixI'll try to have a deeper look next week (though it seems a few bits
or Elan manufactured USI capable touchscreen controllers in them.
Any feedback appreciated!
stacked up during my week off, sigh).
Cheers,
Benjamin
-Tero