| N-Trig touchscreen Driver |
| ------------------------- |
| Copyright (c) 2008-2010 Rafi Rubin <rafi@seas.upenn.edu> |
| Copyright (c) 2009-2010 Stephane Chatty |
| |
| This driver provides support for N-Trig pen and multi-touch sensors. Single |
| and multi-touch events are translated to the appropriate protocols for |
| the hid and input systems. Pen events are sufficiently hid compliant and |
| are left to the hid core. The driver also provides additional filtering |
| and utility functions accessible with sysfs and module parameters. |
| |
| This driver has been reported to work properly with multiple N-Trig devices |
| attached. |
| |
| |
| Parameters |
| ---------- |
| |
| Note: values set at load time are global and will apply to all applicable |
| devices. Adjusting parameters with sysfs will override the load time values, |
| but only for that one device. |
| |
| The following parameters are used to configure filters to reduce noise: |
| |
| activate_slack number of fingers to ignore before processing events |
| |
| activation_height size threshold to activate immediately |
| activation_width |
| |
| min_height size threshold bellow which fingers are ignored |
| min_width both to decide activation and during activity |
| |
| deactivate_slack the number of "no contact" frames to ignore before |
| propagating the end of activity events |
| |
| When the last finger is removed from the device, it sends a number of empty |
| frames. By holding off on deactivation for a few frames we can tolerate false |
| erroneous disconnects, where the sensor may mistakenly not detect a finger that |
| is still present. Thus deactivate_slack addresses problems where a users might |
| see breaks in lines during drawing, or drop an object during a long drag. |
| |
| |
| Additional sysfs items |
| ---------------------- |
| |
| These nodes just provide easy access to the ranges reported by the device. |
| sensor_logical_height the range for positions reported during activity |
| sensor_logical_width |
| |
| sensor_physical_height internal ranges not used for normal events but |
| sensor_physical_width useful for tuning |
| |
| All N-Trig devices with product id of 1 report events in the ranges of |
| X: 0-9600 |
| Y: 0-7200 |
| However not all of these devices have the same physical dimensions. Most |
| seem to be 12" sensors (Dell Latitude XT and XT2 and the HP TX2), and |
| at least one model (Dell Studio 17) has a 17" sensor. The ratio of physical |
| to logical sizes is used to adjust the size based filter parameters. |
| |
| |
| Filtering |
| --------- |
| |
| With the release of the early multi-touch firmwares it became increasingly |
| obvious that these sensors were prone to erroneous events. Users reported |
| seeing both inappropriately dropped contact and ghosts, contacts reported |
| where no finger was actually touching the screen. |
| |
| Deactivation slack helps prevent dropped contact for single touch use, but does |
| not address the problem of dropping one of more contacts while other contacts |
| are still active. Drops in the multi-touch context require additional |
| processing and should be handled in tandem with tacking. |
| |
| As observed ghost contacts are similar to actual use of the sensor, but they |
| seem to have different profiles. Ghost activity typically shows up as small |
| short lived touches. As such, I assume that the longer the continuous stream |
| of events the more likely those events are from a real contact, and that the |
| larger the size of each contact the more likely it is real. Balancing the |
| goals of preventing ghosts and accepting real events quickly (to minimize |
| user observable latency), the filter accumulates confidence for incoming |
| events until it hits thresholds and begins propagating. In the interest in |
| minimizing stored state as well as the cost of operations to make a decision, |
| I've kept that decision simple. |
| |
| Time is measured in terms of the number of fingers reported, not frames since |
| the probability of multiple simultaneous ghosts is expected to drop off |
| dramatically with increasing numbers. Rather than accumulate weight as a |
| function of size, I just use it as a binary threshold. A sufficiently large |
| contact immediately overrides the waiting period and leads to activation. |
| |
| Setting the activation size thresholds to large values will result in deciding |
| primarily on activation slack. If you see longer lived ghosts, turning up the |
| activation slack while reducing the size thresholds may suffice to eliminate |
| the ghosts while keeping the screen quite responsive to firm taps. |
| |
| Contacts continue to be filtered with min_height and min_width even after |
| the initial activation filter is satisfied. The intent is to provide |
| a mechanism for filtering out ghosts in the form of an extra finger while |
| you actually are using the screen. In practice this sort of ghost has |
| been far less problematic or relatively rare and I've left the defaults |
| set to 0 for both parameters, effectively turning off that filter. |
| |
| I don't know what the optimal values are for these filters. If the defaults |
| don't work for you, please play with the parameters. If you do find other |
| values more comfortable, I would appreciate feedback. |
| |
| The calibration of these devices does drift over time. If ghosts or contact |
| dropping worsen and interfere with the normal usage of your device, try |
| recalibrating it. |
| |
| |
| Calibration |
| ----------- |
| |
| The N-Trig windows tools provide calibration and testing routines. Also an |
| unofficial unsupported set of user space tools including a calibrator is |
| available at: |
| http://code.launchpad.net/~rafi-seas/+junk/ntrig_calib |
| |
| |
| Tracking |
| -------- |
| |
| As of yet, all tested N-Trig firmwares do not track fingers. When multiple |
| contacts are active they seem to be sorted primarily by Y position. |