| 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. |