linux/Documentation/input/elantech.txt
<<
>>
Prefs
   1Elantech Touchpad Driver
   2========================
   3
   4        Copyright (C) 2007-2008 Arjan Opmeer <arjan@opmeer.net>
   5
   6        Extra information for hardware version 1 found and
   7        provided by Steve Havelka
   8
   9        Version 2 (EeePC) hardware support based on patches
  10        received from Woody at Xandros and forwarded to me
  11        by user StewieGriffin at the eeeuser.com forum
  12
  13
  14Contents
  15~~~~~~~~
  16
  17 1. Introduction
  18 2. Extra knobs
  19 3. Hardware version 1
  20    3.1 Registers
  21    3.2 Native relative mode 4 byte packet format
  22    3.3 Native absolute mode 4 byte packet format
  23 4. Hardware version 2
  24    4.1 Registers
  25    4.2 Native absolute mode 6 byte packet format
  26        4.2.1 One finger touch
  27        4.2.2 Two finger touch
  28
  29
  30
  311. Introduction
  32   ~~~~~~~~~~~~
  33
  34Currently the Linux Elantech touchpad driver is aware of two different
  35hardware versions unimaginatively called version 1 and version 2. Version 1
  36is found in "older" laptops and uses 4 bytes per packet. Version 2 seems to
  37be introduced with the EeePC and uses 6 bytes per packet.
  38
  39The driver tries to support both hardware versions and should be compatible
  40with the Xorg Synaptics touchpad driver and its graphical configuration
  41utilities.
  42
  43Additionally the operation of the touchpad can be altered by adjusting the
  44contents of some of its internal registers. These registers are represented
  45by the driver as sysfs entries under /sys/bus/serio/drivers/psmouse/serio?
  46that can be read from and written to.
  47
  48Currently only the registers for hardware version 1 are somewhat understood.
  49Hardware version 2 seems to use some of the same registers but it is not
  50known whether the bits in the registers represent the same thing or might
  51have changed their meaning.
  52
  53On top of that, some register settings have effect only when the touchpad is
  54in relative mode and not in absolute mode. As the Linux Elantech touchpad
  55driver always puts the hardware into absolute mode not all information
  56mentioned below can be used immediately. But because there is no freely
  57available Elantech documentation the information is provided here anyway for
  58completeness sake.
  59
  60
  61/////////////////////////////////////////////////////////////////////////////
  62
  63
  642. Extra knobs
  65   ~~~~~~~~~~~
  66
  67Currently the Linux Elantech touchpad driver provides two extra knobs under
  68/sys/bus/serio/drivers/psmouse/serio? for the user.
  69
  70* debug
  71
  72   Turn different levels of debugging ON or OFF.
  73
  74   By echoing "0" to this file all debugging will be turned OFF.
  75
  76   Currently a value of "1" will turn on some basic debugging and a value of
  77   "2" will turn on packet debugging. For hardware version 1 the default is
  78   OFF. For version 2 the default is "1".
  79
  80   Turning packet debugging on will make the driver dump every packet
  81   received to the syslog before processing it. Be warned that this can
  82   generate quite a lot of data!
  83
  84* paritycheck
  85
  86   Turns parity checking ON or OFF.
  87
  88   By echoing "0" to this file parity checking will be turned OFF. Any
  89   non-zero value will turn it ON. For hardware version 1 the default is ON.
  90   For version 2 the default it is OFF.
  91
  92   Hardware version 1 provides basic data integrity verification by
  93   calculating a parity bit for the last 3 bytes of each packet. The driver
  94   can check these bits and reject any packet that appears corrupted. Using
  95   this knob you can bypass that check.
  96
  97   It is not known yet whether hardware version 2 provides the same parity
  98   bits. Hence checking is disabled by default. Currently even turning it on
  99   will do nothing.
 100
 101
 102/////////////////////////////////////////////////////////////////////////////
 103
 104
 1053. Hardware version 1
 106   ==================
 107
 1083.1 Registers
 109    ~~~~~~~~~
 110
 111By echoing a hexadecimal value to a register it contents can be altered.
 112
 113For example:
 114
 115   echo -n 0x16 > reg_10
 116
 117* reg_10
 118
 119   bit   7   6   5   4   3   2   1   0
 120         B   C   T   D   L   A   S   E
 121
 122         E: 1 = enable smart edges unconditionally
 123         S: 1 = enable smart edges only when dragging
 124         A: 1 = absolute mode (needs 4 byte packets, see reg_11)
 125         L: 1 = enable drag lock (see reg_22)
 126         D: 1 = disable dynamic resolution
 127         T: 1 = disable tapping
 128         C: 1 = enable corner tap
 129         B: 1 = swap left and right button
 130
 131* reg_11
 132
 133   bit   7   6   5   4   3   2   1   0
 134         1   0   0   H   V   1   F   P
 135
 136         P: 1 = enable parity checking for relative mode
 137         F: 1 = enable native 4 byte packet mode
 138         V: 1 = enable vertical scroll area
 139         H: 1 = enable horizontal scroll area
 140
 141* reg_20
 142
 143         single finger width?
 144
 145* reg_21
 146
 147         scroll area width (small: 0x40 ... wide: 0xff)
 148
 149* reg_22
 150
 151         drag lock time out (short: 0x14 ... long: 0xfe;
 152                             0xff = tap again to release)
 153
 154* reg_23
 155
 156         tap make timeout?
 157
 158* reg_24
 159
 160         tap release timeout?
 161
 162* reg_25
 163
 164         smart edge cursor speed (0x02 = slow, 0x03 = medium, 0x04 = fast)
 165
 166* reg_26
 167
 168         smart edge activation area width?
 169
 170
 1713.2 Native relative mode 4 byte packet format
 172    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 173
 174byte 0:
 175   bit   7   6   5   4   3   2   1   0
 176         c   c  p2  p1   1   M   R   L
 177
 178         L, R, M = 1 when Left, Right, Middle mouse button pressed
 179            some models have M as byte 3 odd parity bit
 180         when parity checking is enabled (reg_11, P = 1):
 181            p1..p2 = byte 1 and 2 odd parity bit
 182         c = 1 when corner tap detected
 183
 184byte 1:
 185   bit   7   6   5   4   3   2   1   0
 186        dx7 dx6 dx5 dx4 dx3 dx2 dx1 dx0
 187
 188         dx7..dx0 = x movement;   positive = right, negative = left
 189         byte 1 = 0xf0 when corner tap detected
 190
 191byte 2:
 192   bit   7   6   5   4   3   2   1   0
 193        dy7 dy6 dy5 dy4 dy3 dy2 dy1 dy0
 194
 195         dy7..dy0 = y movement;   positive = up,    negative = down
 196
 197byte 3:
 198   parity checking enabled (reg_11, P = 1):
 199
 200      bit   7   6   5   4   3   2   1   0
 201            w   h  n1  n0  ds3 ds2 ds1 ds0
 202
 203            normally:
 204               ds3..ds0 = scroll wheel amount and direction
 205                          positive = down or left
 206                          negative = up or right
 207            when corner tap detected:
 208               ds0 = 1 when top right corner tapped
 209               ds1 = 1 when bottom right corner tapped
 210               ds2 = 1 when bottom left corner tapped
 211               ds3 = 1 when top left corner tapped
 212            n1..n0 = number of fingers on touchpad
 213               only models with firmware 2.x report this, models with
 214               firmware 1.x seem to map one, two and three finger taps
 215               directly to L, M and R mouse buttons
 216            h = 1 when horizontal scroll action
 217            w = 1 when wide finger touch?
 218
 219   otherwise (reg_11, P = 0):
 220
 221      bit   7   6   5   4   3   2   1   0
 222           ds7 ds6 ds5 ds4 ds3 ds2 ds1 ds0
 223
 224            ds7..ds0 = vertical scroll amount and direction
 225                       negative = up
 226                       positive = down
 227
 228
 2293.3 Native absolute mode 4 byte packet format
 230    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 231
 232byte 0:
 233   firmware version 1.x:
 234
 235      bit   7   6   5   4   3   2   1   0
 236            D   U  p1  p2   1  p3   R   L
 237
 238            L, R = 1 when Left, Right mouse button pressed
 239            p1..p3 = byte 1..3 odd parity bit
 240            D, U = 1 when rocker switch pressed Up, Down
 241
 242   firmware version 2.x:
 243
 244      bit   7   6   5   4   3   2   1   0
 245           n1  n0  p2  p1   1  p3   R   L
 246
 247            L, R = 1 when Left, Right mouse button pressed
 248            p1..p3 = byte 1..3 odd parity bit
 249            n1..n0 = number of fingers on touchpad
 250
 251byte 1:
 252   firmware version 1.x:
 253
 254      bit   7   6   5   4   3   2   1   0
 255            f   0  th  tw  x9  x8  y9  y8
 256
 257            tw = 1 when two finger touch
 258            th = 1 when three finger touch
 259            f  = 1 when finger touch
 260
 261   firmware version 2.x:
 262
 263      bit   7   6   5   4   3   2   1   0
 264            .   .   .   .  x9  x8  y9  y8
 265
 266byte 2:
 267   bit   7   6   5   4   3   2   1   0
 268        x7  x6  x5  x4  x3  x2  x1  x0
 269
 270         x9..x0 = absolute x value (horizontal)
 271
 272byte 3:
 273   bit   7   6   5   4   3   2   1   0
 274        y7  y6  y5  y4  y3  y2  y1  y0
 275
 276         y9..y0 = absolute y value (vertical)
 277
 278
 279/////////////////////////////////////////////////////////////////////////////
 280
 281
 2824. Hardware version 2
 283   ==================
 284
 285
 2864.1 Registers
 287    ~~~~~~~~~
 288
 289By echoing a hexadecimal value to a register it contents can be altered.
 290
 291For example:
 292
 293   echo -n 0x56 > reg_10
 294
 295* reg_10
 296
 297   bit   7   6   5   4   3   2   1   0
 298         0   1   0   1   0   1   D   0
 299
 300         D: 1 = enable drag and drop
 301
 302* reg_11
 303
 304   bit   7   6   5   4   3   2   1   0
 305         1   0   0   0   S   0   1   0
 306
 307         S: 1 = enable vertical scroll
 308
 309* reg_21
 310
 311         unknown (0x00)
 312
 313* reg_22
 314
 315         drag and drop release time out (short: 0x70 ... long 0x7e;
 316                                   0x7f = never i.e. tap again to release)
 317
 318
 3194.2 Native absolute mode 6 byte packet format
 320    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 321
 3224.2.1 One finger touch
 323      ~~~~~~~~~~~~~~~~
 324
 325byte 0:
 326
 327   bit   7   6   5   4   3   2   1   0
 328        n1  n0   .   .   .   .   R   L
 329
 330         L, R = 1 when Left, Right mouse button pressed
 331         n1..n0 = numbers of fingers on touchpad
 332
 333byte 1:
 334
 335   bit   7   6   5   4   3   2   1   0
 336        x15 x14 x13 x12 x11 x10 x9  x8
 337
 338byte 2:
 339
 340   bit   7   6   5   4   3   2   1   0
 341        x7  x6  x5  x4  x4  x2  x1  x0
 342
 343         x15..x0 = absolute x value (horizontal)
 344
 345byte 3:
 346
 347   bit   7   6   5   4   3   2   1   0
 348         .   .   .   .   .   .   .   .
 349
 350byte 4:
 351
 352   bit   7   6   5   4   3   2   1   0
 353        y15 y14 y13 y12 y11 y10 y8  y8
 354
 355byte 5:
 356
 357   bit   7   6   5   4   3   2   1   0
 358        y7  y6  y5  y4  y3  y2  y1  y0
 359
 360         y15..y0 = absolute y value (vertical)
 361
 362
 3634.2.2 Two finger touch
 364      ~~~~~~~~~~~~~~~~
 365
 366byte 0:
 367
 368   bit   7   6   5   4   3   2   1   0
 369        n1  n0  ay8 ax8  .   .   R   L
 370
 371         L, R = 1 when Left, Right mouse button pressed
 372         n1..n0 = numbers of fingers on touchpad
 373
 374byte 1:
 375
 376   bit   7   6   5   4   3   2   1   0
 377        ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0
 378
 379         ax8..ax0 = first finger absolute x value
 380
 381byte 2:
 382
 383   bit   7   6   5   4   3   2   1   0
 384        ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0
 385
 386         ay8..ay0 = first finger absolute y value
 387
 388byte 3:
 389
 390   bit   7   6   5   4   3   2   1   0
 391         .   .  by8 bx8  .   .   .   .
 392
 393byte 4:
 394
 395   bit   7   6   5   4   3   2   1   0
 396        bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0
 397
 398         bx8..bx0 = second finger absolute x value
 399
 400byte 5:
 401
 402   bit   7   6   5   4   3   2   1   0
 403        by7 by8 by5 by4 by3 by2 by1 by0
 404
 405         by8..by0 = second finger absolute y value
 406