synaptics_usb trackpoint

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have an ultranav usb keyboard, which is recognized by the
synaptics_usb driver (model SK-8835, FRU 02R0400, USB device 06CB:0009).
When the kernel is built with synaptics_usb support, the device uses the
"advanced" non-HID interface and the trackpoint becomes very difficult
to use, and certainly does not "feel" like other trackpoint devices. I
believe this is due to incorrect interpretation of the data from the
relevant USB device; the module comments indeed indicate that the driver
has not been well tested with pointing sticks.

I want to make some changes to the driver wrt trackpoints, but I wanted
to ask for some feedback on this before I go off down the wrong path.
Jan Steinhoff kindly directed me here. Anyway, details:


Right now, synaptics_usb just sends the raw numbers from the USB
responses as input event relative coordinates after trimming off some
low-order bits (see synusb_report_stick). That is, we get (0x52, 0x42)
from the device, and we report relative movement of around (0x5, 0x4).
But the values we get from the USB device don't seem very much like
coordinates to me. They appear to be readings from the force sensors on
the trackpoint in the x, y, and z directions. From what I have found
when reading about trackpoint devices, these forces do not directly
correspond to relative cursor movement, but are supposed to be
interpreted through a transfer function that translates them to cursor
velocity, which is then to be translated into movements at certain
intervals.

There may be different transfer functions that are possible to use, but
one such transfer function I've found is in the trackpoint 4 engineering
spec [1]. That's where the various settings like 'sensitivity', 'speed',
etc come into play for trackpoint devices where this translation is done
in the hardware. That document doesn't give all of the necessary
constants for generating that specific function, but it gives a general
idea. I've got some code to roughly approximate that curve in an x.org
input driver, and it seems to work pretty well considering that I'm
making some guesses.

But it seems like this translation should occur in the synaptics_usb
driver. Or at least, even if it doesn't, the reported values should not
be reported as REL_X and REL_Y events, since they are not relative
cursor coordinates. The z coordinate still seems like it could just stay
as ABS_PRESSURE, and features like "Press to Select" could be
implemented in a userspace driver. But I personally don't really care
about the z axis at all, since I never use any of the PtS functionality.

Furthermore, I really think there should be a runtime option to switch
the device between "advanced" mode and HID mode. Especially for the
trackpoint, the transfer function is not trivial and its "correctness"
may be subjective. Right now a system without a synaptics_usb-like
driver is better off than Linux, since such a system would use the
generic HID mode, and would be more usable. Maybe even the HID mode
should be the default, and we only switch to 'advanced' mode on request,
if the user wants to change e.g. sensitivity settings or PtS.

So, thoughts? I haven't fiddled with adding anything like this to the
synaptics_usb driver yet, but I was planning on doing that as soon as I
sent this out and didn't hear any objections.


[1] <http://blogs.epfl.ch/icenet/documents/Ykt3Eext.pdf>. A graph of the
transfer function is on page 43, and some of the other relevant
parameters are described on page 24 and 44.

-- 
Andrew Deason
adeason@xxxxxxxx
--
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




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux