linux-old/drivers/usb/aiptek.c
<<
>>
Prefs
   1/*
   2 *  Native support for the Aiptek HyperPen USB Tablets
   3 *  (4000U/5000U/6000U/8000U/12000U)
   4 *
   5 *  Copyright (c) 2001      Chris Atenasio   <chris@crud.net>
   6 *  Copyright (c) 2002-2003 Bryan W. Headley <bwheadley@earthlink.net>
   7 *
   8 *  based on wacom.c by
   9 *     Vojtech Pavlik      <vojtech@suse.cz>
  10 *     Andreas Bach Aaen   <abach@stofanet.dk>
  11 *     Clifford Wolf       <clifford@clifford.at>
  12 *     Sam Mosel           <sam.mosel@computer.org>
  13 *     James E. Blair      <corvus@gnu.org>
  14 *     Daniel Egger        <egger@suse.de>
  15 *
  16 *  Many thanks to Oliver Kuechemann for his support.
  17 *
  18 *  ChangeLog:
  19 *      v0.1 - Initial release
  20 *      v0.2 - Hack to get around fake event 28's. (Bryan W. Headley)
  21 *      v0.3 - Make URB dynamic (Bryan W. Headley, Jun-8-2002)
  22 *             Released to Linux 2.4.19 and 2.5.x
  23 *      v0.4 - Rewrote substantial portions of the code to deal with
  24 *             corrected control sequences, timing, dynamic configuration,
  25 *             support of 6000U - 12000U, procfs, and macro key support
  26 *             (Jan-1-2003 - Feb-5-2003, Bryan W. Headley)
  27 *      v1.0 - Added support for diagnostic messages, count of messages
  28 *             received from URB - Mar-8-2003, Bryan W. Headley
  29 *
  30 * NOTE:
  31 *      This kernel driver is augmented by the "Aiptek" XFree86 input
  32 *      driver for your X server, as well as a GUI Front-end "Tablet Manager".
  33 *      These three products are highly interactive with one another, 
  34 *      so therefore it's easier to document them all as one subsystem.
  35 *      Please visit the project's "home page", located at, 
  36 *      http://aiptektablet.sourceforge.net.
  37 *
  38 */
  39
  40/*
  41 * This program is free software; you can redistribute it and/or modify
  42 * it under the terms of the GNU General Public License as published by
  43 * the Free Software Foundation; either version 2 of the License, or
  44 * (at your option) any later version.
  45 *
  46 * This program is distributed in the hope that it will be useful,
  47 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  48 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  49 * GNU General Public License for more details.
  50 *
  51 * You should have received a copy of the GNU General Public License
  52 * along with this program; if not, write to the Free Software
  53 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  54 */
  55
  56#include <linux/kernel.h>
  57#include <linux/slab.h>
  58#include <linux/input.h>
  59#include <linux/module.h>
  60#include <linux/init.h>
  61#include <linux/usb.h>
  62#include <linux/proc_fs.h>
  63#include <asm/uaccess.h>
  64
  65/*
  66 * Version Information
  67 */
  68#define DRIVER_VERSION "v1.0 Mar-8-2003"
  69#define DRIVER_AUTHOR  "Bryan W. Headley/Chris Atenasio"
  70#define DRIVER_DESC    "Aiptek HyperPen USB Tablet Driver (Linux 2.4.x)"
  71
  72MODULE_AUTHOR(DRIVER_AUTHOR);
  73MODULE_DESCRIPTION(DRIVER_DESC);
  74MODULE_LICENSE("GPL");
  75
  76/*
  77 * Aiptek status packet:
  78 * (returned as Report 1)
  79 *
  80 *        bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0
  81 * byte0   0     0     0     0     0     0     1     0
  82 * byte1  X7    X6    X5    X4    X3    X2    X1    X0
  83 * byte2  X15   X14   X13   X12   X11   X10   X9    X8
  84 * byte3  Y7    Y6    Y5    Y4    Y3    Y2    Y1    Y0
  85 * byte4  Y15   Y14   Y13   Y12   Y11   Y10   Y9    Y8
  86 * byte5   *     *     *    BS2   BS1   Tip   DV    IR
  87 * byte6  P7    P6    P5    P4    P3    P2    P1    P0
  88 * byte7  P15   P14   P13   P12   P11   P10   P9    P8
  89 *
  90 * IR: In Range = Proximity on
  91 * DV = Data Valid
  92 * BS = Barrel Switch (as in, macro keys)
  93 * BS2 also referred to as Tablet Pick
  94 *
  95 * Command Summary:
  96 *
  97 * Use report_type CONTROL (3)
  98 * Use report_id   2
  99 *
 100 * Command/Data    Description     Return Bytes    Return Value
 101 * 0x10/0x00       SwitchToMouse       0
 102 * 0x10/0x01       SwitchToTablet      0
 103 * 0x18/0x04       Resolution500LPI    0
 104 * 0x17/0x00       FilterOn            0
 105 * 0x12/0xFF       AutoGainOn          0
 106 * 0x01/0x00       GetXExtension       2           MaxX
 107 * 0x01/0x01       GetYExtension       2           MaxY
 108 * 0x02/0x00       GetModelCode        2           ModelCode = LOBYTE
 109 * 0x03/0x00       GetODMCode          2           ODMCode
 110 * 0x08/0x00       GetPressureLevels   2           =512
 111 * 0x04/0x00       GetFirmwareVersion  2           Firmware Version
 112 * 0x11/0x02       EnableMacroKeys     0
 113 *
 114 *
 115 * To initialize the tablet:
 116 *
 117 * (1) Send Resolution500LPI (Command)
 118 * (2) Query for Model code (Option Report)
 119 * (3) Query for ODM code (Option Report)
 120 * (4) Query for firmware (Option Report)
 121 * (5) Query for GetXExtension (Option Report)
 122 * (6) Query for GetYExtension (Option Report)
 123 * (7) Query for GetPressureLevels (Option Report)
 124 * (8) SwitchToTablet for Absolute coordinates, or
 125 *     SwitchToMouse for Relative coordinates (Command)
 126 * (9) EnableMacroKeys (Command)
 127 * (10) FilterOn (Command)
 128 * (11) AutoGainOn (Command)
 129 *
 130 * (Step 9 can be omitted, but you'll then have no function keys.)
 131 *
 132 *  The procfs interface
 133 *  --------------------
 134 *
 135 *  This driver supports delivering configuration/status reports
 136 *  through {procfs}/driver/usb/aiptek. ("procfs" is normally mounted
 137 *  to /proc.) Said file can be found while the driver is active in
 138 *  memory; it will be removed when the driver is removed, either 
 139 *  through user intervention (rmmod aiptek) or through software
 140 *  such as "hotplug".
 141 *
 142 *  Reading from the Procfs interface
 143 *  ---------------------------------
 144 *
 145 *  The user may determine the status of the tablet by reading the
 146 *  report in the procfs interface, /proc/driver/usb/aiptek.
 147 *  The report as of driver version 1.0, looks like,
 148 *
 149 * Aiptek Tablet (3000x2250, 8.00x6.00", 202x152mm)
 150 * (USB VendorID 0x08ca, ProductID 0x0020, ODMCode 0x0004
 151 *  ModelCode: 0x64, FirmwareCode: 0x0400)
 152 * on /dev/input/event0
 153 * pointer=either
 154 * coordinate=absolute
 155 * tool=pen
 156 * xtilt=disable
 157 * ytilt=disable
 158 * jitter=50
 159 * diagnostic=none
 160 * eventsReceived=0
 161 *
 162 *  (spurious ", for the benefit of vim's syntax highlighting.)
 163 *
 164 *  This report indicates the tablet recognized. (Because Aiptek reuses
 165 *  the USB 'productID' over several tablets, it's pointless for us to
 166 *  guess which model you have: we'll instead tell you the size of
 167 *  the tablet's drawing area, which we indicate in coordinates, inches,
 168 *  and millimeters.) We also indicate datum read from the USB interface,
 169 *  such as vendorId, productId, ODMcode, etc. It's there "just in case."
 170 *
 171 *      on /dev/input/event0
 172 *
 173 *  Linux supports HID-compliant USB devices (such as this tablet) by
 174 *  transposing their reports to the Linux Input Event System format. Which
 175 *  means, if you want to data from the tablet, that's where it will be
 176 *  made available from. For information on the Input Event System, see
 177 *  the docs in ./Documentation/input, in the kernel source tree.
 178 *
 179 *  And yes, depending on the order in which other supported Input Event
 180 *  devices are recognized and configured, the tablet may be allocated
 181 *  to a different device driver name: it's all dynamic. Use of the devfs
 182 *  file system is a help.
 183 *
 184 *  The keyword=value part of the report mostly shows what the programmable
 185 *  parameters have been set to. We describe those below, and how to
 186 *  program/reprogram them. Note: tablet parameters are to be programmed
 187 *  while the tablet is attached and active. They are not set as arguments
 188 *  to the kernel during bootup.
 189 *
 190 *  Here are the "read-only" parameters, and what they mean:
 191 *
 192 *      diagnostic=stringValue
 193 *      eventsReceived=numericValue
 194 *
 195 * diagnostic: The tablet driver attempts to explain why things are not
 196 *      working correctly. (To the best of it's insular abilities)
 197 *
 198 *      By default, the tablet boots up in Relative Coordinate
 199 *      mode. This driver initially attempts to program it in Absolute
 200 *      Coordinate mode (and of course, the user can subsequently choose
 201 *      which mode they want.) So, therefore, the situation can arise
 202 *      where the tablet is in one mode, and the driver believes it
 203 *      is in the other mode. The driver, however, cannot divine
 204 *      this mismatch until input events are received.  
 205 *      Two reports indicate such mode-mismatches between the tablet
 206 *      and the driver, and are,
 207 *
 208 *          "tablet sending relative reports"
 209 *          "tablet sending absolute reports"
 210 *
 211 *      The next diagnostic operates in conjunction with the "pointer="
 212 *      programmable parameter. With it, you can indicate that you want
 213 *      the tablet to only accept reports from the stylus, or only from the 
 214 *      mouse. (You can also specify to allow reports from either.) What
 215 *      happens when you specify that you only want mouse reports, yet
 216 *      the tablet keeps receiving reports from the stylus? Well, first,
 217 *      it's a "pilot error", but secondly, it tries to diagnose the issue
 218 *      with the following reports,
 219 *
 220 *          "tablet seeing reports from stylus"
 221 *          "tablet seeing reports from mouse"
 222 *
 223 *      What if there is nothing to report? The inference in the diagnostic
 224 *      reports is that something is happening which shouldn't: when things
 225 *      appear to be working right, the report is,
 226 *
 227 *          "none"
 228 *
 229 *      The error diagnostic report is dynamic: it only reports issues
 230 *      that are happening, or have happened as of the last event received.
 231 *      It will reset following any attempt to reprogram the tablet's mode.
 232 *
 233 * eventsReceived: Occasionally, your movements on the tablet are not being
 234 *      reported. Usually, this indicates that your tablet is out of sync
 235 *      with the USB interface driver, or itself is not sending reports
 236 *      out. To help diagnose this, we keep an active count of events
 237 *      received from the tablet. So, if you move the stylus, and yet 
 238 *      your client application doesn't notice, make
 239 *      note of the eventsReceived, and then move the stylus again. If the
 240 *      event counter's number doesn't change, then the tablet indeed has
 241 *      "froze". 
 242 *
 243 *      We have found that sending the tablet a command sequence often
 244 *      will clear up "frozen" tablets. Which segues into the section
 245 *      about how to program your tablet through the procfs interface,
 246 *
 247 *  Writing to the procfs interface
 248 *  -------------------------------
 249 *
 250 *  The user may configure the tablet by writing ASCII
 251 *  commands to the /proc/driver/usb/aiptek file. Commands which are
 252 *  accepted are,
 253 *
 254 *      pointer=stringvalue      {stylus|mouse|either}
 255 *      coordinate=stringvalue   {absolute|relative}
 256 *      tool=stringvalue         {mouse|rubber|pen|pencil|brush|airbrush}
 257 *      xtilt=string_or_numeric  {disable|[-128..127]}
 258 *      ytilt=string_or_numeric  {disable|[-128..127]}
 259 *      jitter=numericvalue      {0..xxx}
 260 *
 261 *  pointer: you can specify that reports are to be excepted ONLY from the
 262 *      stylus, or ONLY from the mouse. 'either' allows reports from either
 263 *      device to be accepted, and is the default.
 264 *  coordinate: you can specify that either absolute or relative coordinate
 265 *      reports are issued by the tablet. By default, absolute reports are
 266 *      sent.
 267 *  tool: The stylus by default prepends TOOL_BTN_PEN events with it's
 268 *      reports. But you may decide that you want your stylus to behave
 269 *      like an eraser (named 'rubber', following tablet conventions,)
 270 *      or a pencil, etc. The behavior is dependent upon the client software
 271 *      consuming the tablet's events, e.g., the XFree86 tablet driver.
 272 *  xtilt: By default this is disabled. However, other tablets have a notion
 273 *      of measuring the angle at which the stylus pen is held against the
 274 *      drawing surface, along the X axis. Aiptek tablets cannot sense this,
 275 *      but if you want to send "held-at-angle" reports, specify the value,
 276 *      an integer between -128 and 127 (inclusive) that you want to send.
 277 *      This data will be sent along with regular tablet input. Obviously,
 278 *      the inference here is that your hand does not change angles 
 279 *      while drawing (until you go back to this procfs interface, and
 280 *      change the value)!
 281 *
 282 *      When you consider actual drawing tools (real pens, brushes),
 283 *      knowing the tools' tip shape and the angle that you hold the tool 
 284 *      becomes important, insofar as calculating the surface of the tip 
 285 *      that actually touches the surface of the paper. Knowledge of what 
 286 *      to do with xtilt reports is solely in the realm of your client 
 287 *      software.
 288 *
 289 *      Yes, there is a difference between xtilt=0 and xtilt=disable
 290 *      settings. The former sends a report that the angle is a 0;
 291 *      the other indicates that NO xtilt reports are to be sent at all.
 292 *  ytilt: By default this is disabled. This provides similar functionality
 293 *      to xtilt, except that we're measuring the angle the stylus pen is
 294 *      held against the drawing surface, along the Y axis. Same cavaets
 295 *      apply as for xtilt.
 296 *  jitter: By default, this is set to 50. When pressing a button on
 297 *      either the mouse or the stylus pen, you will probably notice that
 298 *      the tool moves slightly from it's original position, until your
 299 *      hand steadies it. During that period of time, the pen is "jittering",
 300 *      sending spurious movement events that perhaps you'd like it not to
 301 *      send. What we do is set a moratorium, measured in milliseconds,
 302 *      during which we do not send movement events. So, the default is 50ms;
 303 *      you obviously can set it to zero or incredibly unreasonable values
 304 *      (no reports for 4 seconds following the pressing of a stylus button!)
 305 *
 306 * Interesting Side-Note
 307 * ---------------------
 308 *
 309 *  The tablet has "frozen" and you'd like to send it a command to wake it
 310 *  up. But you don't want to change how the driver's currently configured.
 311 *
 312 *  1. Send a command to /proc/driver/usb/aiptek with the same setting
 313 *     already reported by the driver.
 314 *  2. Send an illegal string to procfs file ("wakeup=now" is always good)
 315 *  3. Because, the driver always attempts to reprogram the tablet to it's
 316 *     current settings following a write to the procfs interface.
 317 *
 318 *  Hmm, still does not work.
 319 *  -------------------------
 320 *
 321 *  This is slightly harder to diagnose. You may be receiving frame errors
 322 *  from the USB interface driver (see /var/log/messages for any diagnostics).
 323 *
 324 *  Alternatively, you may be running something like 'hotplug' that attempts
 325 *  to match discovered USB devices to it's list of device drivers. 
 326 *  Unfortunately, because this is a tablet that can send relative X,Y events,
 327 *  it "looks like" a mouse! A usb mouse driver may have possession of
 328 *  input from the tablet. On the other hand, the tablet also supports 
 329 *  absolute reports from barrel switches, which sounds a lot like a "joystick",
 330 *  and the software again can be fooled into loading the wrong driver for
 331 *  the tablet. The distinction is, USB HID devices tell you what they
 332 *  are capable of, rather than what they are.
 333 *
 334 *  Come visit this driver's home page at http://aiptektablet.sourceforge.net
 335 *  for further assistance.
 336 */
 337
 338#define USB_VENDOR_ID_AIPTEK   0x08ca
 339
 340#define AIPTEK_POINTER_ONLY_MOUSE_MODE      0
 341#define AIPTEK_POINTER_ONLY_STYLUS_MODE     1
 342#define AIPTEK_POINTER_EITHER_MODE          2
 343
 344#define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \
 345        (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \
 346         a == AIPTEK_POINTER_EITHER_MODE)
 347#define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \
 348        (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \
 349         a == AIPTEK_POINTER_EITHER_MODE)
 350
 351#define AIPTEK_COORDINATE_RELATIVE_MODE 0
 352#define AIPTEK_COORDINATE_ABSOLUTE_MODE 1
 353
 354#define AIPTEK_TILT_MIN                      (-128)
 355#define AIPTEK_TILT_MAX                      127
 356#define AIPTEK_TILT_DISABLE                  (-10101)
 357
 358#define AIPTEK_TOOL_BUTTON_PEN_MODE          0
 359#define AIPTEK_TOOL_BUTTON_PENCIL_MODE       1
 360#define AIPTEK_TOOL_BUTTON_BRUSH_MODE        2
 361#define AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE     3
 362#define AIPTEK_TOOL_BUTTON_RUBBER_MODE       4
 363#define AIPTEK_TOOL_BUTTON_MOUSE_MODE        5
 364
 365#define AIPTEK_DIAGNOSTIC_NA                 0
 366#define AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE  1
 367#define AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE  2
 368#define AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED               3
 369
 370    // Time to wait (in ms) to help mask hand jittering
 371    // when pressing the stylus buttons.
 372#define AIPTEK_JITTER_DELAY_DEFAULT         50
 373
 374struct aiptek_features {
 375        char *name;
 376        int pktlen;
 377        int x_max;
 378        int y_max;
 379        int pressure_max;
 380        int odmCode;
 381        int modelCode;
 382        int firmwareCode;
 383        void (*irq) (struct urb * urb);
 384};
 385
 386struct aiptek {
 387        signed char data[10];
 388        struct input_dev dev;
 389        struct usb_device *usbdev;
 390        struct urb *irq;
 391        struct aiptek_features *features;
 392        unsigned int ifnum;
 393        int open_count;
 394        int pointer_mode;
 395        int coordinate_mode;
 396        int tool_mode;
 397        int xTilt;
 398        int yTilt;
 399        int diagnostic;
 400        unsigned long eventCount;
 401        int jitterDelay;
 402#ifdef CONFIG_PROC_FS
 403        struct proc_dir_entry *usbProcfsEntry;
 404        struct proc_dir_entry *aiptekProcfsEntry;
 405#endif
 406};
 407
 408/*
 409 * Permit easy lookup of keyboard events to send, versus
 410 * the bitmap which comes from the tablet. This hides the
 411 * issue that the F_keys are not sequentially numbered.
 412 */
 413static int macroKeyEvents[] = { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
 414        KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12,
 415        KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, KEY_F18,
 416        KEY_F19, KEY_F20, KEY_F21, KEY_F22, KEY_F23, KEY_F24,
 417        KEY_STOP, KEY_AGAIN, KEY_PROPS, KEY_UNDO, KEY_FRONT, KEY_COPY,
 418        KEY_OPEN, KEY_PASTE, 0
 419};
 420
 421#ifdef CONFIG_PROC_FS
 422extern struct proc_dir_entry *proc_root_driver;
 423#endif
 424
 425static int
 426aiptek_convert_from_2s_complement(unsigned char c)
 427{
 428        unsigned char b = c;
 429        int negate = 0;
 430        int ret;
 431
 432        if (b & 0x80) {
 433                b = ~b;
 434                b--;
 435                negate = 1;
 436        }
 437        ret = b;
 438        ret = (negate == 1) ? -ret : ret;
 439        return ret;
 440}
 441
 442/*
 443 * aiptek_irq can receive one of six potential reports.
 444 * The documentation for each is in the body of the function.
 445 *
 446 * The tablet reports on several attributes per invocation of
 447 * aiptek_irq. Because the Linux Input Event system allows the
 448 * transmission of ONE attribute per input_report_xxx() call,
 449 * collation has to be done on the other end to reconstitute
 450 * a complete tablet report. Further, the number of Input Event reports
 451 * submitted varies, depending on what USB report type, and circumstance.
 452 * To deal with this, EV_MSC is used to indicate an 'end-of-report'
 453 * message. This has been an undocumented convention understood by the kernel
 454 * tablet driver and clients such as gpm and XFree86's tablet drivers.
 455 *
 456 * Of the information received from the tablet, the one piece I
 457 * cannot transmit is the proximity bit (without resorting to an EV_MSC
 458 * convention above.) I therefore have taken over REL_MISC and ABS_MISC
 459 * (for relative and absolute reports, respectively) for communicating
 460 * Proximity. Why two events? I thought it interesting to know if the
 461 * Proximity event occured while the tablet was in absolute or relative
 462 * mode.
 463 *
 464 * Other tablets use the notion of a certain minimum stylus pressure
 465 * to infer proximity. While that could have been done, that is yet
 466 * another 'by convention' behavior, the documentation for which
 467 * would be spread between two (or more) pieces of software.
 468 *
 469 * EV_MSC usage is terminated in Linux 2.5.x.
 470 */
 471
 472static void
 473aiptek_irq(struct urb *urb)
 474{
 475        struct aiptek *aiptek = urb->context;
 476        unsigned char *data = aiptek->data;
 477        struct input_dev *dev = &aiptek->dev;
 478        int jitterable = 0;
 479
 480        if (urb->status)
 481                return;
 482
 483        aiptek->eventCount++;
 484
 485        // Report 1 delivers relative coordinates with either a stylus
 486        // or the mouse. You do not know which tool generated the event.
 487        if (data[0] == 1) {
 488                if (aiptek->coordinate_mode == AIPTEK_COORDINATE_ABSOLUTE_MODE) {
 489                        aiptek->diagnostic =
 490                            AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE;
 491                } else {
 492                        int x, y, left, right, middle;
 493
 494                        if (aiptek->tool_mode != AIPTEK_TOOL_BUTTON_MOUSE_MODE) {
 495                                aiptek->tool_mode =
 496                                    AIPTEK_TOOL_BUTTON_MOUSE_MODE;
 497                                input_report_key(dev, BTN_TOOL_MOUSE, 1);
 498                        }
 499                        x = aiptek_convert_from_2s_complement(data[2]);
 500                        y = aiptek_convert_from_2s_complement(data[3]);
 501
 502                        left = data[5] & 0x01;
 503                        right = data[5] & 0x02;
 504                        middle = data[5] & 0x04;
 505
 506                        jitterable = left | right | middle;
 507
 508                        input_report_key(dev, BTN_LEFT, left);
 509                        input_report_key(dev, BTN_MIDDLE, middle);
 510                        input_report_key(dev, BTN_RIGHT, right);
 511                        input_report_rel(dev, REL_X, x);
 512                        input_report_rel(dev, REL_Y, y);
 513                        input_report_rel(dev, REL_MISC, 1);
 514
 515                        input_event(dev, EV_MSC, MSC_SERIAL, 0);
 516                }
 517        }
 518        // Report 2 is delivered only by the stylus, and delivers
 519        // absolute coordinates.
 520        else if (data[0] == 2) {
 521                if (aiptek->coordinate_mode == AIPTEK_COORDINATE_RELATIVE_MODE) {
 522                        aiptek->diagnostic =
 523                            AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
 524                } else
 525                    if (!AIPTEK_POINTER_ALLOW_STYLUS_MODE(aiptek->pointer_mode))
 526                {
 527                        aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
 528                } else {
 529                        int x = ((__u32) data[1]) | ((__u32) data[2] << 8);
 530                        int y = ((__u32) data[3]) | ((__u32) data[4] << 8);
 531                        int z = ((__u32) data[6]) | ((__u32) data[7] << 8);
 532
 533                        int p = data[5] & 0x01;
 534                        int dv = data[5] & 0x02;
 535                        int tip = data[5] & 0x04;
 536                        int bs = data[5] & 0x08;
 537                        int pck = data[5] & 0x10;
 538
 539                        // dv indicates 'data valid' (e.g., the tablet is in sync
 540                        // and has delivered a "correct" report) We will ignore
 541                        // all 'bad' reports...
 542                        if (dv != 0) {
 543                                switch (aiptek->tool_mode) {
 544                                case AIPTEK_TOOL_BUTTON_PEN_MODE:
 545                                        {
 546                                                input_report_key(dev,
 547                                                                 BTN_TOOL_PEN,
 548                                                                 1);
 549                                        }
 550                                        break;
 551
 552                                case AIPTEK_TOOL_BUTTON_PENCIL_MODE:
 553                                        {
 554                                                input_report_key(dev,
 555                                                                 BTN_TOOL_PENCIL,
 556                                                                 1);
 557                                        }
 558                                        break;
 559
 560                                case AIPTEK_TOOL_BUTTON_BRUSH_MODE:
 561                                        {
 562                                                input_report_key(dev,
 563                                                                 BTN_TOOL_BRUSH,
 564                                                                 1);
 565                                        }
 566                                        break;
 567
 568                                case AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE:
 569                                        {
 570                                                input_report_key(dev,
 571                                                                 BTN_TOOL_AIRBRUSH,
 572                                                                 1);
 573                                        }
 574                                        break;
 575
 576                                case AIPTEK_TOOL_BUTTON_RUBBER_MODE:
 577                                        {
 578                                                input_report_key(dev,
 579                                                                 BTN_TOOL_RUBBER,
 580                                                                 1);
 581                                        }
 582                                        break;
 583
 584                                case AIPTEK_TOOL_BUTTON_MOUSE_MODE:
 585                                        {
 586                                                input_report_key(dev,
 587                                                                 BTN_TOOL_MOUSE,
 588                                                                 1);
 589                                        }
 590                                        break;
 591                                }
 592
 593                                input_report_abs(dev, ABS_X, x);
 594                                input_report_abs(dev, ABS_Y, y);
 595
 596                                /*
 597                                 * The user is allowed to switch from one of the
 598                                 * stylus tools to the Mouse using the front-end GUI.
 599                                 * An issue that will arise, however, is what happens
 600                                 * when the user HAS issued a TOOL_BTN_MOUSE, but has not
 601                                 * yet swapped tools. Well, we can "pretend" to be a mouse
 602                                 * by sending overriding tip, barrelswitch and pick.
 603                                 * This stupidity should not be used as an excuse not
 604                                 * to physically move your Aiptek mouse into the tablet's
 605                                 * active area -- it merely provides momentary convenience
 606                                 * during that transition.
 607                                 */
 608                                if (aiptek->tool_mode ==
 609                                    AIPTEK_TOOL_BUTTON_MOUSE_MODE) {
 610                                        input_report_key(dev, BTN_LEFT, tip);
 611                                        input_report_key(dev, BTN_RIGHT, bs);
 612                                        input_report_key(dev, BTN_MIDDLE, pck);
 613
 614                                        jitterable = tip | bs | pck;
 615                                } else {
 616                                        input_report_abs(dev, ABS_PRESSURE, z);
 617
 618                                        input_report_key(dev, BTN_TOUCH, tip);
 619                                        input_report_key(dev, BTN_STYLUS, bs);
 620                                        input_report_key(dev, BTN_STYLUS2, pck);
 621
 622                                        jitterable = tip | bs | pck;
 623
 624                                        if (aiptek->xTilt !=
 625                                            AIPTEK_TILT_DISABLE)
 626                                                input_report_abs(dev,
 627                                                                 ABS_TILT_X,
 628                                                                 aiptek->xTilt);
 629                                        if (aiptek->yTilt !=
 630                                            AIPTEK_TILT_DISABLE)
 631                                                input_report_abs(dev,
 632                                                                 ABS_TILT_Y,
 633                                                                 aiptek->yTilt);
 634                                }
 635                                input_report_abs(dev, ABS_MISC, p);
 636                                input_event(dev, EV_MSC, MSC_SERIAL, 0);
 637                        }
 638                }
 639        }
 640        // Report 3's come from the mouse in absolute mode.
 641        else if (data[0] == 3) {
 642                if (aiptek->coordinate_mode == AIPTEK_COORDINATE_RELATIVE_MODE) {
 643                        aiptek->diagnostic =
 644                            AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE;
 645                } else
 646                    if (!AIPTEK_POINTER_ALLOW_MOUSE_MODE(aiptek->pointer_mode))
 647                {
 648                        aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED;
 649                } else {
 650                        int x = ((__u32) data[1]) | ((__u32) data[2] << 8);
 651                        int y = ((__u32) data[3]) | ((__u32) data[4] << 8);
 652                        int p = data[5] & 0x01;
 653                        int dv = data[5] & 0x02;
 654                        int left = data[5] & 0x04;
 655                        int right = data[5] & 0x08;
 656                        int middle = data[5] & 0x10;
 657
 658                        if (dv != 0) {
 659                                input_report_key(dev, BTN_TOOL_MOUSE, 1);
 660                                input_report_abs(dev, ABS_X, x);
 661                                input_report_abs(dev, ABS_Y, y);
 662
 663                                input_report_key(dev, BTN_LEFT, left);
 664                                input_report_key(dev, BTN_MIDDLE, middle);
 665                                input_report_key(dev, BTN_RIGHT, right);
 666
 667                                jitterable = left | middle | right;
 668
 669                                input_report_rel(dev, REL_MISC, p);
 670                                input_event(dev, EV_MSC, MSC_SERIAL, 0);
 671                        }
 672                }
 673        }
 674        // Report 4s come from the macro keys when pressed by stylus
 675        else if (data[0] == 4) {
 676                int p = data[1] & 0x01;
 677                int dv = data[1] & 0x02;
 678                int tip = data[1] & 0x04;
 679                int bs = data[1] & 0x08;
 680                int pck = data[1] & 0x10;
 681
 682                int m = data[3];
 683                int z = ((__u32) data[4]) | ((__u32) data[5] << 8);
 684
 685                if (dv != 0) {
 686                        input_report_key(dev, BTN_TOUCH, tip);
 687                        input_report_key(dev, BTN_STYLUS, bs);
 688                        input_report_key(dev, BTN_STYLUS2, pck);
 689
 690                        jitterable = tip | bs | pck;
 691
 692                        input_report_key(dev, macroKeyEvents[m - 1], 1);
 693                        input_report_abs(dev, ABS_PRESSURE, z);
 694                        input_report_abs(dev, ABS_MISC, p);
 695                        input_event(dev, EV_MSC, MSC_SERIAL, 0);
 696                }
 697        }
 698        // Report 5s come from the macro keys when pressed by mouse
 699        else if (data[0] == 5) {
 700                int p = data[1] & 0x01;
 701                int dv = data[1] & 0x02;
 702                int left = data[1] & 0x04;
 703                int right = data[1] & 0x08;
 704                int middle = data[1] & 0x10;
 705                int macro = data[3];
 706
 707                if (dv != 0) {
 708                        input_report_key(dev, BTN_LEFT, left);
 709                        input_report_key(dev, BTN_MIDDLE, middle);
 710                        input_report_key(dev, BTN_RIGHT, right);
 711
 712                        jitterable = left | middle | right;
 713
 714                        input_report_key(dev, macroKeyEvents[macro - 1], 1);
 715                        input_report_rel(dev, ABS_MISC, p);
 716                        input_event(dev, EV_MSC, MSC_SERIAL, 0);
 717                }
 718        }
 719        // We have no idea which tool can generate a report 6. Theoretically,
 720        // neither need to, having been given reports 4 & 5 for such use.
 721        // However, report 6 is the 'official-looking' report for macroKeys;
 722        // reports 4 & 5 supposively are used to support unnamed, unknown
 723        // hat switches (which just so happen to be the macroKeys.)
 724        else if (data[0] == 6) {
 725                int macro = ((__u32) data[1]) | ((__u32) data[2] << 8);
 726
 727                input_report_key(dev, macroKeyEvents[macro - 1], 1);
 728                input_report_abs(dev, ABS_MISC, 1);
 729                input_event(dev, EV_MSC, MSC_SERIAL, 0);
 730        } else {
 731                dbg("Unknown report %d", data[0]);
 732        }
 733
 734        // Jitter may occur when the user presses a button on the stlyus
 735        // or the mouse. What we do to prevent that is wait 'x' milliseconds
 736        // following a 'jitterable' event, which should give the hand some time
 737        // stabilize itself.
 738        if (jitterable != 0 && aiptek->jitterDelay != 0) {
 739                wait_ms(aiptek->jitterDelay);
 740        }
 741}
 742
 743/*
 744 * We are not able to reliably determine the tablet featureset by
 745 * asking for the USB productID. Therefore, we will query the
 746 * tablet dynamically and populate the struct in aiptek_probe().
 747 */
 748
 749struct aiptek_features aiptek_features[] = {
 750        {"Aiptek", 8, 0, 0, 0, 0, 0, 0, aiptek_irq},
 751        {NULL, 0}
 752};
 753
 754/*
 755 * These are the USB id's known so far. We do not identify them to
 756 * specific Aiptek model numbers, because there has been overlaps,
 757 * use, and reuse of id's in existing models. Certain models have
 758 * been known to use more than one ID, indicative perhaps of
 759 * manufacturing revisions. In any event, we consider these 
 760 * IDs to not be model-specific nor unique.
 761 */
 762
 763struct usb_device_id aiptek_ids[] = {
 764      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x01), driver_info:0},
 765      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x10), driver_info:0},
 766      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x20), driver_info:0},
 767      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x21), driver_info:0},
 768      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x22), driver_info:0},
 769      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x23), driver_info:0},
 770      {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x24), driver_info:0},
 771        {}
 772};
 773
 774MODULE_DEVICE_TABLE(usb, aiptek_ids);
 775
 776static int
 777aiptek_open(struct input_dev *dev)
 778{
 779        struct aiptek *aiptek = dev->private;
 780        if (aiptek->open_count++)
 781                return 0;
 782
 783        aiptek->irq->dev = aiptek->usbdev;
 784        if (usb_submit_urb(aiptek->irq))
 785                return -EIO;
 786
 787        return 0;
 788}
 789
 790static void
 791aiptek_close(struct input_dev *dev)
 792{
 793        struct aiptek *aiptek = dev->private;
 794
 795        if (!--aiptek->open_count)
 796                usb_unlink_urb(aiptek->irq);
 797}
 798
 799/*
 800 * Send a command to the tablet. No reply is expected.
 801 */
 802static void
 803aiptek_command(struct usb_device *dev, unsigned int ifnum,
 804               unsigned char command, unsigned char data)
 805{
 806        __u8 buf[3];
 807
 808        buf[0] = 2;
 809        buf[1] = command;
 810        buf[2] = data;
 811
 812        if (usb_set_report(dev, ifnum, 3, 2, buf, sizeof (buf)) != sizeof (buf)) {
 813                dbg("aiptek_command failed, sending: 0x%02x 0x%02x", command,
 814                    data);
 815        }
 816}
 817
 818/*
 819 * Send a query to the tablet. This is done by sending the query stream
 820 * first as a command, waiting a few milliseconds, then submitting the
 821 * same stream as a query.
 822 */
 823static unsigned int
 824aiptek_query(struct usb_device *dev, unsigned int ifnum,
 825             unsigned char command, unsigned char data)
 826{
 827        unsigned int ret;
 828        __u8 buf[8];
 829        buf[0] = 2;
 830        buf[1] = command;
 831        buf[2] = data;
 832
 833        aiptek_command(dev, ifnum, command, data);
 834        wait_ms(400);
 835
 836        if (usb_get_report(dev, ifnum, 3, 2, buf, 3) < 3) {
 837                dbg("aiptek_query failed: returns 0x%02x 0x%02x 0x%02x",
 838                    buf[0], buf[1], buf[2]);
 839                return 0;
 840        }
 841        ret = ((__u32) buf[1]) | ((__u32) buf[2] << 8);
 842        return ret;
 843}
 844
 845/*
 846 * Program the tablet into either absolute or relative mode.
 847 *
 848 * We also get information about the tablet's size.
 849 */
 850static void
 851aiptek_program_tablet(struct aiptek *aiptek)
 852{
 853        int modelCode, odmCode, firmwareCode;
 854        int xResolution, yResolution, zResolution;
 855
 856        aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA;
 857
 858        // execute Resolution500LPI
 859        aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x18, 0x04);
 860        // query getModelCode
 861        modelCode = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x02, 0x00);
 862        // query getODMCode
 863        odmCode = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x03, 0x00);
 864        // query getFirmwareCode
 865        firmwareCode = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x04, 0x00);
 866        // query getXextension
 867        xResolution = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x01, 0x00);
 868        // query getYextension
 869        yResolution = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x01, 0x01);
 870        // query getPressureLevels
 871        zResolution = aiptek_query(aiptek->usbdev, aiptek->ifnum, 0x08, 0x00);
 872
 873        // Depending on whether we are in absolute or relative mode, we will
 874        // do a switchToTablet(absolute) or switchToMouse(relative) command.
 875        if (aiptek->coordinate_mode == AIPTEK_COORDINATE_ABSOLUTE_MODE) {
 876                // execute switchToTablet
 877                aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x10, 0x01);
 878        } else {
 879                // execute switchToMouse
 880                aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x10, 0x00);
 881        }
 882        // This command enables the macro keys
 883        aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x11, 0x02);
 884        // execute FilterOn
 885        aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x17, 0x00);
 886        // execute AutoGainOn
 887        aiptek_command(aiptek->usbdev, aiptek->ifnum, 0x12, 0xff);
 888
 889        aiptek->features->odmCode = odmCode;
 890        aiptek->features->modelCode = modelCode & 0xff;
 891        aiptek->features->firmwareCode = firmwareCode;
 892        aiptek->features->pressure_max = zResolution;
 893        aiptek->features->x_max = xResolution;
 894        aiptek->features->y_max = yResolution;
 895
 896        aiptek->eventCount = 0;
 897}
 898
 899#if defined(CONFIG_PROC_FS)
 900/*
 901 * This routine determines keywords and their associated values, and
 902 * maps them to supported modes in this driver. It's input comes from
 903 * aiptek_procfs_write().
 904 */
 905static void
 906aiptek_procfs_parse(struct aiptek *aiptek, char *keyword, char *value)
 907{
 908        if (strcmp(keyword, "pointer") == 0) {
 909                if (strcmp(value, "stylus") == 0) {
 910                        aiptek->pointer_mode = AIPTEK_POINTER_ONLY_STYLUS_MODE;
 911                } else if (strcmp(value, "mouse") == 0) {
 912                        aiptek->pointer_mode = AIPTEK_POINTER_ONLY_MOUSE_MODE;
 913                } else if (strcmp(value, "either") == 0) {
 914                        aiptek->pointer_mode = AIPTEK_POINTER_EITHER_MODE;
 915                }
 916        } else if (strcmp(keyword, "coordinate") == 0) {
 917                if (strcmp(value, "relative") == 0) {
 918                        aiptek->coordinate_mode =
 919                            AIPTEK_COORDINATE_RELATIVE_MODE;
 920                } else if (strcmp(value, "absolute") == 0) {
 921                        aiptek->coordinate_mode =
 922                            AIPTEK_COORDINATE_ABSOLUTE_MODE;
 923                }
 924        } else if (strcmp(keyword, "xtilt") == 0) {
 925                if (strcmp(value, "disable") == 0) {
 926                        aiptek->xTilt = AIPTEK_TILT_DISABLE;
 927                } else {
 928                        int x = (int) simple_strtol(value, 0, 10);
 929                        if (x >= AIPTEK_TILT_MIN && x <= AIPTEK_TILT_MAX)
 930                                aiptek->xTilt = x;
 931                }
 932        } else if (strcmp(keyword, "ytilt") == 0) {
 933                if (strcmp(value, "disable") == 0) {
 934                        aiptek->yTilt = AIPTEK_TILT_DISABLE;
 935                } else {
 936                        int y = (int) simple_strtol(value, 0, 10);
 937                        if (y >= AIPTEK_TILT_MIN && y <= AIPTEK_TILT_MAX)
 938                                aiptek->yTilt = y;
 939                }
 940        } else if (strcmp(keyword, "jitter") == 0) {
 941                aiptek->jitterDelay = (int) simple_strtol(value, 0, 10);
 942        } else if (strcmp(keyword, "tool") == 0) {
 943                if (strcmp(value, "mouse") == 0) {
 944                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_MOUSE_MODE;
 945                } else if (strcmp(value, "rubber") == 0) {
 946                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_RUBBER_MODE;
 947                } else if (strcmp(value, "pencil") == 0) {
 948                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_PENCIL_MODE;
 949                } else if (strcmp(value, "pen") == 0) {
 950                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_PEN_MODE;
 951                } else if (strcmp(value, "brush") == 0) {
 952                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_BRUSH_MODE;
 953                } else if (strcmp(value, "airbrush") == 0) {
 954                        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE;
 955                }
 956        }
 957}
 958
 959/*
 960 * This routine reads the status of the aiptek driver, and makes it
 961 * available as a procfs file. The description of the procfs file
 962 * is at the top of this driver source code.
 963 */
 964static int
 965aiptek_procfs_read(char *page, char **start, off_t offset, int count,
 966                   int *eof, void *data)
 967{
 968        int len;
 969        char *out = page;
 970        struct aiptek *aiptek = data;
 971
 972        out +=
 973            sprintf(out, "Aiptek Tablet (%dx%d)\n",
 974                    aiptek->features->x_max, aiptek->features->y_max);
 975
 976        out +=
 977            sprintf(out,
 978                    "(USB VendorID 0x%04x, ProductID 0x%04x, ODMCode 0x%04x\n",
 979                    aiptek->dev.idvendor, aiptek->dev.idproduct,
 980                    aiptek->features->odmCode);
 981        out +=
 982            sprintf(out, " ModelCode: 0x%02x, FirmwareCode: 0x%04x)\n",
 983                    aiptek->features->modelCode,
 984                    aiptek->features->firmwareCode);
 985
 986        out += sprintf(out, "on /dev/input/event%d\n", aiptek->dev.number);
 987        out += sprintf(out, "pointer=%s\n",
 988                       (aiptek->pointer_mode == AIPTEK_POINTER_ONLY_MOUSE_MODE
 989                        ? "mouse"
 990                        : (aiptek->pointer_mode ==
 991                           AIPTEK_POINTER_ONLY_STYLUS_MODE ? "stylus" :
 992                           "either")));
 993        out +=
 994            sprintf(out, "coordinate=%s\n",
 995                    (aiptek->coordinate_mode ==
 996                     AIPTEK_COORDINATE_RELATIVE_MODE ? "relative" :
 997                     "absolute"));
 998
 999        out += sprintf(out, "tool=");
1000        switch (aiptek->tool_mode) {
1001        case AIPTEK_TOOL_BUTTON_MOUSE_MODE:
1002                out += sprintf(out, "mouse\n");
1003                break;
1004
1005        case AIPTEK_TOOL_BUTTON_RUBBER_MODE:
1006                out += sprintf(out, "rubber\n");
1007                break;
1008
1009        case AIPTEK_TOOL_BUTTON_PEN_MODE:
1010                out += sprintf(out, "pen\n");
1011                break;
1012
1013        case AIPTEK_TOOL_BUTTON_PENCIL_MODE:
1014                out += sprintf(out, "pencil\n");
1015                break;
1016
1017        case AIPTEK_TOOL_BUTTON_BRUSH_MODE:
1018                out += sprintf(out, "brush\n");
1019                break;
1020
1021        case AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE:
1022                out += sprintf(out, "airbrush\n");
1023                break;
1024        }
1025
1026        out += sprintf(out, "xtilt=");
1027        if (aiptek->xTilt == AIPTEK_TILT_DISABLE) {
1028                out += sprintf(out, "disable\n");
1029        } else {
1030                out += sprintf(out, "%d\n", aiptek->xTilt);
1031        }
1032
1033        out += sprintf(out, "ytilt=");
1034        if (aiptek->yTilt == AIPTEK_TILT_DISABLE) {
1035                out += sprintf(out, "disable\n");
1036        } else {
1037                out += sprintf(out, "%d\n", aiptek->yTilt);
1038        }
1039
1040        out += sprintf(out, "jitter=%d\n", aiptek->jitterDelay);
1041
1042        out += sprintf(out, "diagnostic=");
1043        switch (aiptek->diagnostic) {
1044        case AIPTEK_DIAGNOSTIC_NA:
1045                out += sprintf(out, "none\n");
1046                break;
1047        case AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE:
1048                out += sprintf(out, "tablet sending relative reports\n");
1049                break;
1050        case AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE:
1051                out += sprintf(out, "tablet sending absolute reports\n");
1052                break;
1053        case AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED:
1054                out += sprintf(out, "tablet seeing reports from ");
1055                if (aiptek->pointer_mode == AIPTEK_POINTER_ONLY_MOUSE_MODE)
1056                        out += sprintf(out, "stylus\n");
1057                else
1058                        out += sprintf(out, "mouse\n");
1059                break;
1060        }
1061
1062        out += sprintf(out, "eventsReceived=%lu\n", aiptek->eventCount);
1063
1064        len = out - page;
1065        len -= offset;
1066        if (len < count) {
1067                *eof = 1;
1068                if (len <= 0) {
1069                        return 0;
1070                }
1071        } else {
1072                len = count;
1073        }
1074
1075        *start = page + offset;
1076
1077        return len;
1078}
1079
1080/*
1081 * This routine permits the setting of driver parameters through a
1082 * procfs file. Writing to the procfs file (/proc/driver/usb/aiptek),
1083 * you can program the tablet's behavior. Parameters that can be programmed
1084 * (and their legal values) are described at the top of this driver.
1085 *
1086 *
1087 * This parser is order-insensitive, and supports one or many parameters
1088 * to be sent in one write request. As many parameters as you may fit
1089 * in 64 bytes; we only require that you separate them with \n's.
1090 *
1091 * Any command that is not understood by the parser is silently ignored.
1092 */
1093static int
1094aiptek_procfs_write(struct file *file, const char *buffer, unsigned long count,
1095                    void *data)
1096{
1097        char buf[64];
1098        char *scan;
1099        char *keyword = NULL;
1100        char *value = NULL;
1101        struct aiptek *aiptek = data;
1102        int num;
1103
1104        num = (count < 64) ? count : 64;
1105        if (copy_from_user(buf, buffer, num))
1106                return -EFAULT;
1107        buf[num] = '\0';
1108
1109        scan = buf;
1110        while (*scan) {
1111                if (*scan == '\n' || *scan == '\0') {
1112                        if (*scan == '\n') {
1113                                *scan = '\0';
1114                                scan++;
1115                        }
1116                        if (keyword && value) {
1117                                aiptek_procfs_parse(aiptek, keyword, value);
1118                        }
1119                        keyword = NULL;
1120                        value = NULL;
1121                        continue;
1122                }
1123
1124                if (*scan != '=' && keyword == NULL) {
1125                        keyword = scan;
1126                } else if (*scan == '=') {
1127                        *scan++ = '\0';
1128                        value = scan;
1129                }
1130                scan++;
1131        }
1132        // We're insensitive as to whether the buffer ended in a \n or not.
1133        if (keyword && value) {
1134                aiptek_procfs_parse(aiptek, keyword, value);
1135        }
1136
1137        aiptek_program_tablet(aiptek);
1138
1139        return num;
1140}
1141
1142/*
1143 * This routine destroys our procfs device interface. This will occur
1144 * when you remove the driver, either through rmmod or the hotplug system.
1145 */
1146static void
1147destroy_procfs_file(struct aiptek *aiptek)
1148{
1149        if (aiptek->aiptekProcfsEntry)
1150                remove_proc_entry("aiptek", aiptek->usbProcfsEntry);
1151        if (aiptek->usbProcfsEntry)
1152                remove_proc_entry("usb", proc_root_driver);
1153
1154        aiptek->usbProcfsEntry = NULL;
1155        aiptek->aiptekProcfsEntry = NULL;
1156}
1157
1158/*
1159 * This routine builds the procfs file. The file is located at,
1160 *      procfs/driver/usb/aiptek.
1161 */
1162static void
1163create_procfs_file(struct aiptek *aiptek)
1164{
1165        // Make procfs/driver/usb directory
1166        aiptek->usbProcfsEntry = create_proc_entry("usb", S_IFDIR,
1167                                                   proc_root_driver);
1168        if (!aiptek->usbProcfsEntry) {
1169                dbg("create_procfs_file failed; no procfs/driver/usb control file.");
1170                destroy_procfs_file(aiptek);
1171                return;
1172        }
1173        aiptek->usbProcfsEntry->owner = THIS_MODULE;
1174
1175        // Make procfs/driver/usb/aiptek file
1176        aiptek->aiptekProcfsEntry = create_proc_entry("aiptek",
1177                                                      S_IFREG | S_IRUGO |
1178                                                      S_IWUGO,
1179                                                      aiptek->usbProcfsEntry);
1180        if (!aiptek->aiptekProcfsEntry) {
1181                dbg("create_procfs_file failed; no procfs/driver/usb control file.");
1182                destroy_procfs_file(aiptek);
1183                return;
1184        }
1185        aiptek->aiptekProcfsEntry->owner = THIS_MODULE;
1186        aiptek->aiptekProcfsEntry->data = aiptek;
1187        aiptek->aiptekProcfsEntry->read_proc = aiptek_procfs_read;
1188        aiptek->aiptekProcfsEntry->write_proc = aiptek_procfs_write;
1189}
1190#endif
1191
1192static void *
1193aiptek_probe(struct usb_device *dev, unsigned int ifnum,
1194             const struct usb_device_id *id)
1195{
1196        struct usb_endpoint_descriptor *endpoint;
1197        struct aiptek *aiptek;
1198        int i;
1199
1200        if (!(aiptek = kmalloc(sizeof (struct aiptek), GFP_KERNEL)))
1201                return NULL;
1202
1203        memset(aiptek, 0, sizeof (struct aiptek));
1204
1205        aiptek->irq = usb_alloc_urb(0);
1206        if (!aiptek->irq) {
1207                kfree(aiptek);
1208                return NULL;
1209        }
1210        // This used to be meaningful, when we had a matrix of
1211        // different models with statically-assigned different
1212        // features. Now we ask the tablet about everything.
1213
1214        aiptek->features = aiptek_features;
1215
1216        // Reset the tablet. The tablet boots up in 'SwitchtoMouse'
1217        // mode, which indicates relative coordinates. 'SwitchToTablet'
1218        // infers absolute coordinates. (Ergo, mice are inferred to be
1219        // relative-only devices, which is not true. A misnomer.)
1220        // The routine we use, aiptek_program_tablet, has been generalized
1221        // enough such that it's callable through the procfs interface.
1222        // This is why we use struct aiptek throughout.
1223        aiptek->usbdev = dev;
1224        aiptek->ifnum = ifnum;
1225        aiptek->pointer_mode = AIPTEK_POINTER_EITHER_MODE;
1226        aiptek->coordinate_mode = AIPTEK_COORDINATE_ABSOLUTE_MODE;
1227        aiptek->tool_mode = AIPTEK_TOOL_BUTTON_PEN_MODE;
1228        aiptek->xTilt = AIPTEK_TILT_DISABLE;
1229        aiptek->yTilt = AIPTEK_TILT_DISABLE;
1230        aiptek->jitterDelay = AIPTEK_JITTER_DELAY_DEFAULT;
1231
1232#ifdef CONFIG_PROC_FS
1233        create_procfs_file(aiptek);
1234#endif
1235
1236        aiptek_program_tablet(aiptek);
1237
1238        aiptek->dev.evbit[0] |= BIT(EV_KEY)
1239            | BIT(EV_ABS)
1240            | BIT(EV_MSC);
1241
1242        aiptek->dev.absbit[0] |= BIT(ABS_X)
1243            | BIT(ABS_Y)
1244            | BIT(ABS_PRESSURE)
1245            | BIT(ABS_TILT_X)
1246            | BIT(ABS_TILT_Y)
1247            | BIT(ABS_MISC);
1248
1249        aiptek->dev.relbit[0] |= BIT(REL_X)
1250            | BIT(REL_Y)
1251            | BIT(REL_MISC);
1252
1253        // Set the macro keys up. They are discontiguous, so it's better
1254        // to set the bitmask this way.
1255
1256        for (i = 0; i < sizeof (macroKeyEvents) / sizeof (macroKeyEvents[0]);
1257             ++i) {
1258                set_bit(macroKeyEvents[i], aiptek->dev.keybit);
1259        }
1260
1261        aiptek->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT)
1262            | BIT(BTN_RIGHT)
1263            | BIT(BTN_MIDDLE);
1264
1265        aiptek->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN)
1266            | BIT(BTN_TOOL_RUBBER)
1267            | BIT(BTN_TOOL_PENCIL)
1268            | BIT(BTN_TOOL_AIRBRUSH)
1269            | BIT(BTN_TOOL_BRUSH)
1270            | BIT(BTN_TOOL_MOUSE)
1271            | BIT(BTN_TOUCH)
1272            | BIT(BTN_STYLUS)
1273            | BIT(BTN_STYLUS2);
1274
1275        aiptek->dev.mscbit[0] = BIT(MSC_SERIAL);
1276
1277        aiptek->dev.absmax[ABS_X] = aiptek->features->x_max;
1278        aiptek->dev.absmax[ABS_Y] = aiptek->features->y_max;
1279        aiptek->dev.absmax[ABS_PRESSURE] = aiptek->features->pressure_max;
1280        aiptek->dev.absmax[ABS_TILT_X] = AIPTEK_TILT_MAX;
1281        aiptek->dev.absmax[ABS_TILT_Y] = AIPTEK_TILT_MAX;
1282        aiptek->dev.absfuzz[ABS_X] = 0;
1283        aiptek->dev.absfuzz[ABS_Y] = 0;
1284
1285        aiptek->dev.private = aiptek;
1286        aiptek->dev.open = aiptek_open;
1287        aiptek->dev.close = aiptek_close;
1288
1289        aiptek->dev.name = aiptek->features->name;
1290        aiptek->dev.idbus = BUS_USB;
1291        aiptek->dev.idvendor = dev->descriptor.idVendor;
1292        aiptek->dev.idproduct = dev->descriptor.idProduct;
1293        aiptek->dev.idversion = dev->descriptor.bcdDevice;
1294        aiptek->usbdev = dev;
1295
1296        endpoint = dev->config[0].interface[ifnum].altsetting[0].endpoint + 0;
1297
1298        usb_fill_int_urb(aiptek->irq,
1299                         dev,
1300                         usb_rcvintpipe(dev, endpoint->bEndpointAddress),
1301                         aiptek->data,
1302                         aiptek->features->pktlen,
1303                         aiptek->features->irq, aiptek, endpoint->bInterval);
1304
1305        input_register_device(&aiptek->dev);
1306
1307        printk(KERN_INFO "input%d: %s on usb%d:%d.%d\n",
1308               aiptek->dev.number,
1309               aiptek->features->name, dev->bus->busnum, dev->devnum, ifnum);
1310
1311        return aiptek;
1312}
1313
1314static struct usb_driver aiptek_driver;
1315
1316static void
1317aiptek_disconnect(struct usb_device *dev, void *ptr)
1318{
1319        struct aiptek *aiptek = ptr;
1320#ifdef CONFIG_PROC_FS
1321        destroy_procfs_file(aiptek);
1322#endif
1323        usb_unlink_urb(aiptek->irq);
1324        input_unregister_device(&aiptek->dev);
1325        usb_free_urb(aiptek->irq);
1326        kfree(aiptek);
1327}
1328
1329static struct usb_driver aiptek_driver = {
1330        name:"aiptek",
1331        probe:aiptek_probe,
1332        disconnect:aiptek_disconnect,
1333        id_table:aiptek_ids,
1334};
1335
1336static int __init
1337aiptek_init(void)
1338{
1339        usb_register(&aiptek_driver);
1340        info(DRIVER_VERSION ": " DRIVER_AUTHOR);
1341        info(DRIVER_DESC);
1342        return 0;
1343}
1344
1345static void __exit
1346aiptek_exit(void)
1347{
1348        usb_deregister(&aiptek_driver);
1349}
1350
1351module_init(aiptek_init);
1352module_exit(aiptek_exit);
1353
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.