aiptek.c revision 093cf723b2b06d774929ea07982f6a466ff22314
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Native support for the Aiptek HyperPen USB Tablets 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (4000U/5000U/6000U/8000U/12000U) 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2001 Chris Atenasio <chris@crud.net> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2002-2004 Bryan W. Headley <bwheadley@earthlink.net> 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * based on wacom.c by 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Vojtech Pavlik <vojtech@suse.cz> 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Andreas Bach Aaen <abach@stofanet.dk> 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Clifford Wolf <clifford@clifford.at> 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sam Mosel <sam.mosel@computer.org> 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * James E. Blair <corvus@gnu.org> 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Daniel Egger <egger@suse.de> 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Many thanks to Oliver Kuechemann for his support. 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ChangeLog: 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v0.1 - Initial release 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v0.2 - Hack to get around fake event 28's. (Bryan W. Headley) 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v0.3 - Make URB dynamic (Bryan W. Headley, Jun-8-2002) 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Released to Linux 2.4.19 and 2.5.x 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v0.4 - Rewrote substantial portions of the code to deal with 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * corrected control sequences, timing, dynamic configuration, 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support of 6000U - 12000U, procfs, and macro key support 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (Jan-1-2003 - Feb-5-2003, Bryan W. Headley) 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.0 - Added support for diagnostic messages, count of messages 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * received from URB - Mar-8-2003, Bryan W. Headley 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.1 - added support for tablet resolution, changed DV and proximity 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * some corrections - Jun-22-2003, martin schneebacher 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Added support for the sysfs interface, deprecating the 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * procfs interface for 2.5.x kernel. Also added support for 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Wheel command. Bryan W. Headley July-15-2003. 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.2 - Reworked jitter timer as a kernel thread. 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bryan W. Headley November-28-2003/Jan-10-2004. 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.3 - Repaired issue of kernel thread going nuts on single-processor 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * machines, introduced programmableDelay as a command line 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * parameter. Feb 7 2004, Bryan W. Headley. 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.4 - Re-wire jitter so it does not require a thread. Courtesy of 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Rene van Paassen. Added reporting of physical pointer device 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (e.g., stylus, mouse in reports 2, 3, 4, 5. We don't know 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for reports 1, 6.) 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * what physical device reports for reports 1, 6.) Also enabled 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MOUSE and LENS tool button modes. Renamed "rubber" to "eraser". 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Feb 20, 2004, Bryan W. Headley. 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * v1.5 - Added previousJitterable, so we don't do jitter delay when the 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * user is holding a button down for periods of time. 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTE: 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This kernel driver is augmented by the "Aiptek" XFree86 input 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * driver for your X server, as well as the Gaiptek GUI Front-end 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "Tablet Manager". 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * These three products are highly interactive with one another, 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so therefore it's easier to document them all as one subsystem. 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Please visit the project's "home page", located at, 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * http://aiptektablet.sourceforge.net. 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License as published by 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (at your option) any later version. 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is distributed in the hope that it will be useful, 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GNU General Public License for more details. 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * You should have received a copy of the GNU General Public License 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * along with this program; if not, write to the Free Software 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/jiffies.h> 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h> 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h> 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/input.h> 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h> 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/usb.h> 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h> 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h> 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/unaligned.h> 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Version Information 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DRIVER_VERSION "v1.5 (May-15-2004)" 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DRIVER_AUTHOR "Bryan W. Headley/Chris Atenasio" 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DRIVER_DESC "Aiptek HyperPen USB Tablet Driver (Linux 2.6.x)" 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Aiptek status packet: 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (returned as Report 1 - relative coordinates from mouse and stylus) 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte0 0 0 0 0 0 0 0 1 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte1 0 0 0 0 0 BS2 BS Tip 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte2 X7 X6 X5 X4 X3 X2 X1 X0 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (returned as Report 2 - absolute coordinates from the stylus) 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte0 0 0 0 0 0 0 1 0 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte1 X7 X6 X5 X4 X3 X2 X1 X0 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte2 X15 X14 X13 X12 X11 X10 X9 X8 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte4 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte5 * * * BS2 BS1 Tip IR DV 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte6 P7 P6 P5 P4 P3 P2 P1 P0 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte7 P15 P14 P13 P12 P11 P10 P9 P8 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (returned as Report 3 - absolute coordinates from the mouse) 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte0 0 0 0 0 0 0 1 0 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte1 X7 X6 X5 X4 X3 X2 X1 X0 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte2 X15 X14 X13 X12 X11 X10 X9 X8 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte4 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte5 * * * BS2 BS1 Tip IR DV 1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte6 P7 P6 P5 P4 P3 P2 P1 P0 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte7 P15 P14 P13 P12 P11 P10 P9 P8 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (returned as Report 4 - macrokeys from the stylus) 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte0 0 0 0 0 0 1 0 0 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte1 0 0 0 BS2 BS Tip IR DV 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte2 0 0 0 0 0 0 1 0 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte3 0 0 0 K4 K3 K2 K1 K0 1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte4 P7 P6 P5 P4 P3 P2 P1 P0 1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte5 P15 P14 P13 P12 P11 P10 P9 P8 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (returned as Report 5 - macrokeys from the mouse) 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte0 0 0 0 0 0 1 0 0 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte1 0 0 0 BS2 BS Tip IR DV 1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte2 0 0 0 0 0 0 1 0 1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte3 0 0 0 K4 K3 K2 K1 K0 1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte4 P7 P6 P5 P4 P3 P2 P1 P0 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * byte5 P15 P14 P13 P12 P11 P10 P9 P8 1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IR: In Range = Proximity on 1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DV = Data Valid 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * BS = Barrel Switch (as in, macro keys) 1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * BS2 also referred to as Tablet Pick 1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Command Summary: 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Use report_type CONTROL (3) 1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Use report_id 2 1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Command/Data Description Return Bytes Return Value 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x10/0x00 SwitchToMouse 0 1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x10/0x01 SwitchToTablet 0 1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x18/0x04 SetResolution 0 1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x12/0xFF AutoGainOn 0 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x17/0x00 FilterOn 0 1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x01/0x00 GetXExtension 2 MaxX 1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x01/0x01 GetYExtension 2 MaxY 1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x02/0x00 GetModelCode 2 ModelCode = LOBYTE 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x03/0x00 GetODMCode 2 ODMCode 1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x08/0x00 GetPressureLevels 2 =512 1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x04/0x00 GetFirmwareVersion 2 Firmware Version 1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 0x11/0x02 EnableMacroKeys 0 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * To initialize the tablet: 1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (1) Send Resolution500LPI (Command) 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (2) Query for Model code (Option Report) 1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (3) Query for ODM code (Option Report) 1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (4) Query for firmware (Option Report) 1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (5) Query for GetXExtension (Option Report) 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (6) Query for GetYExtension (Option Report) 1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (7) Query for GetPressureLevels (Option Report) 1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (8) SwitchToTablet for Absolute coordinates, or 1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SwitchToMouse for Relative coordinates (Command) 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (9) EnableMacroKeys (Command) 1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (10) FilterOn (Command) 1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (11) AutoGainOn (Command) 1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (Step 9 can be omitted, but you'll then have no function keys.) 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USB_VENDOR_ID_AIPTEK 0x08ca 1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USB_REQ_GET_REPORT 0x01 1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define USB_REQ_SET_REPORT 0x09 1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* PointerMode codes 1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_POINTER_ONLY_MOUSE_MODE 0 1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_POINTER_ONLY_STYLUS_MODE 1 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_POINTER_EITHER_MODE 2 1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \ 1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \ 2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds a == AIPTEK_POINTER_EITHER_MODE) 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \ 2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \ 2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds a == AIPTEK_POINTER_EITHER_MODE) 2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* CoordinateMode code 2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_COORDINATE_RELATIVE_MODE 0 2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_COORDINATE_ABSOLUTE_MODE 1 2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* XTilt and YTilt values 2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TILT_MIN (-128) 2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TILT_MAX 127 2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TILT_DISABLE (-10101) 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Wheel values 2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_WHEEL_MIN 0 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_WHEEL_MAX 1024 2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_WHEEL_DISABLE (-10101) 2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* ToolCode values, which BTW are 0x140 .. 0x14f 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We have things set up such that if TOOL_BUTTON_FIRED_BIT is 2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not set, we'll send one instance of AIPTEK_TOOL_BUTTON_xxx. 2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Whenever the user resets the value, TOOL_BUTTON_FIRED_BIT will 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * get reset. 2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TOOL_BUTTON(x) ((x) & 0x14f) 2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TOOL_BUTTON_FIRED(x) ((x) & 0x200) 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TOOL_BUTTON_FIRED_BIT 0x200 2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* toolMode codes 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN 2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_PENCIL_MODE BTN_TOOL_PENCIL 2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_BRUSH_MODE BTN_TOOL_BRUSH 2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE BTN_TOOL_AIRBRUSH 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_ERASER_MODE BTN_TOOL_RUBBER 2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_MOUSE_MODE BTN_TOOL_MOUSE 2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_TOOL_BUTTON_LENS_MODE BTN_TOOL_LENS 2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Diagnostic message codes 2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_DIAGNOSTIC_NA 0 2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE 1 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE 2 2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED 3 2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Time to wait (in ms) to help mask hand jittering 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * when pressing the stylus buttons. 2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_JITTER_DELAY_DEFAULT 50 2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Time to wait (in ms) in-between sending the tablet 2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a command and beginning the process of reading the return 2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sequence from the tablet. 2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_25 25 2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_50 50 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_100 100 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_200 200 2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_300 300 2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_400 400 2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PROGRAMMABLE_DELAY_DEFAULT AIPTEK_PROGRAMMABLE_DELAY_400 2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Mouse button programming 2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_MOUSE_LEFT_BUTTON 0x01 2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_MOUSE_RIGHT_BUTTON 0x02 2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_MOUSE_MIDDLE_BUTTON 0x04 2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Stylus button programming 2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_STYLUS_LOWER_BUTTON 0x08 2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_STYLUS_UPPER_BUTTON 0x10 2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Length of incoming packet from the tablet 2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_PACKET_LENGTH 8 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We report in EV_MISC both the proximity and 2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * whether the report came from the stylus, tablet mouse 2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or "unknown" -- Unknown when the tablet is in relative 2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * mode, because we only get report 1's. 2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_REPORT_TOOL_UNKNOWN 0x10 2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_REPORT_TOOL_STYLUS 0x20 2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define AIPTEK_REPORT_TOOL_MOUSE 0x40 2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int programmableDelay = AIPTEK_PROGRAMMABLE_DELAY_DEFAULT; 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int jitterDelay = AIPTEK_JITTER_DELAY_DEFAULT; 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aiptek_features { 2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int odmCode; /* Tablet manufacturer code */ 2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int modelCode; /* Tablet model code (not unique) */ 2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int firmwareCode; /* prom/eeprom version */ 2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char usbPath[64 + 1]; /* device's physical usb path */ 2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char inputPath[64 + 1]; /* input device path */ 3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aiptek_settings { 3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int pointerMode; /* stylus-, mouse-only or either */ 3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int coordinateMode; /* absolute/relative coords */ 3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int toolMode; /* pen, pencil, brush, etc. tool */ 3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int xTilt; /* synthetic xTilt amount */ 3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int yTilt; /* synthetic yTilt amount */ 3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int wheel; /* synthetic wheel amount */ 3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int stylusButtonUpper; /* stylus upper btn delivers... */ 3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int stylusButtonLower; /* stylus lower btn delivers... */ 3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mouseButtonLeft; /* mouse left btn delivers... */ 3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mouseButtonMiddle; /* mouse middle btn delivers... */ 3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int mouseButtonRight; /* mouse right btn delivers... */ 3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int programmableDelay; /* delay for tablet programming */ 3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int jitterDelay; /* delay for hand jittering */ 3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct aiptek { 3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct input_dev inputdev; /* input device struct */ 3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_device *usbdev; /* usb device struct */ 3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct urb *urb; /* urb for incoming reports */ 3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dma_addr_t data_dma; /* our dma stuffage */ 3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek_features features; /* tablet's array of features */ 3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek_settings curSetting; /* tablet's current programmable */ 3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek_settings newSetting; /* ... and new param settings */ 3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int ifnum; /* interface number for IO */ 3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int openCount; /* module use counter */ 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int diagnostic; /* tablet diagnostic codes */ 3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long eventCount; /* event count */ 3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int inDelay; /* jitter: in jitter delay? */ 3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long endDelay; /* jitter: time when delay ends */ 3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int previousJitterable; /* jitterable prev value */ 3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char *data; /* incoming packet data */ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Permit easy lookup of keyboard events to send, versus 3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the bitmap which comes from the tablet. This hides the 3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * issue that the F_keys are not sequentially numbered. 3401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int macroKeyEvents[] = { 3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, 3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, 3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, 3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, KEY_F23, 3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_F24, KEY_STOP, KEY_AGAIN, KEY_PROPS, KEY_UNDO, 3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds KEY_FRONT, KEY_COPY, KEY_OPEN, KEY_PASTE, 0 3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Relative reports deliver values in 2's complement format to 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * deal with negative offsets. 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int aiptek_convert_from_2s_complement(unsigned char c) 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char b = c; 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int negate = 0; 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((b & 0x80) != 0) { 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b = ~b; 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds b--; 3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds negate = 1; 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = b; 3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = (negate == 1) ? -ret : ret; 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * aiptek_irq can receive one of six potential reports. 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The documentation for each is in the body of the function. 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The tablet reports on several attributes per invocation of 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * aiptek_irq. Because the Linux Input Event system allows the 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * transmission of ONE attribute per input_report_xxx() call, 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * collation has to be done on the other end to reconstitute 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a complete tablet report. Further, the number of Input Event reports 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * submitted varies, depending on what USB report type, and circumstance. 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * To deal with this, EV_MSC is used to indicate an 'end-of-report' 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * message. This has been an undocumented convention understood by the kernel 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * tablet driver and clients such as gpm and XFree86's tablet drivers. 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Of the information received from the tablet, the one piece I 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * cannot transmit is the proximity bit (without resorting to an EV_MSC 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * convention above.) I therefore have taken over REL_MISC and ABS_MISC 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (for relative and absolute reports, respectively) for communicating 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Proximity. Why two events? I thought it interesting to know if the 389093cf723b2b06d774929ea07982f6a466ff22314Steven Cole * Proximity event occurred while the tablet was in absolute or relative 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * mode. 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Other tablets use the notion of a certain minimum stylus pressure 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to infer proximity. While that could have been done, that is yet 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * another 'by convention' behavior, the documentation for which 3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * would be spread between two (or more) pieces of software. 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * EV_MSC usage was terminated for this purpose in Linux 2.5.x, and 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * replaced with the input_sync() method (which emits EV_SYN.) 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aiptek_irq(struct urb *urb, struct pt_regs *regs) 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = urb->context; 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char *data = aiptek->data; 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct input_dev *inputdev = &aiptek->inputdev; 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int jitterable = 0; 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck; 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (urb->status) { 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case 0: 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Success */ 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case -ECONNRESET: 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case -ENOENT: 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case -ESHUTDOWN: 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* This urb is terminated, clean up */ 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbg("%s - urb shutting down with status: %d", 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __FUNCTION__, urb->status); 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbg("%s - nonzero urb status received: %d", 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __FUNCTION__, urb->status); 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto exit; 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* See if we are in a delay loop -- throw out report if true. 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->inDelay == 1 && time_after(aiptek->endDelay, jiffies)) { 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds goto exit; 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inDelay = 0; 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->eventCount++; 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Report 1 delivers relative coordinates with either a stylus 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or the mouse. You do not know, however, which input 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * tool generated the event. 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (data[0] == 1) { 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.coordinateMode == 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_COORDINATE_ABSOLUTE_MODE) { 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE; 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds x = aiptek_convert_from_2s_complement(data[2]); 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = aiptek_convert_from_2s_complement(data[3]); 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* jitterable keeps track of whether any button has been pressed. 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We're also using it to remap the physical mouse button mask 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to pseudo-settings. (We don't specifically care about it's 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * value after moving/transposing mouse button bitmasks, except 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * that a non-zero value indicates that one or more 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * mouse button was pressed.) 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds jitterable = data[5] & 0x07; 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds left = (data[5] & aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds right = (data[5] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_LEFT, left); 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_MIDDLE, middle); 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_RIGHT, right); 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, REL_X, x); 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, REL_Y, y); 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, REL_MISC, 1 | AIPTEK_REPORT_TOOL_UNKNOWN); 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Wheel support is in the form of a single-event 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * firing. 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) { 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, REL_WHEEL, 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel); 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Report 2 is delivered only by the stylus, and delivers 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * absolute coordinates. 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (data[0] == 2) { 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) { 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE; 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (!AIPTEK_POINTER_ALLOW_STYLUS_MODE 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (aiptek->curSetting.pointerMode)) { 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED; 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds x = le16_to_cpu(get_unaligned((__le16 *) (data + 1))); 4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = le16_to_cpu(get_unaligned((__le16 *) (data + 3))); 4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds z = le16_to_cpu(get_unaligned((__le16 *) (data + 6))); 4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = (data[5] & 0x01) != 0 ? 1 : 0; 5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dv = (data[5] & 0x02) != 0 ? 1 : 0; 5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tip = (data[5] & 0x04) != 0 ? 1 : 0; 5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Use jitterable to re-arrange button masks 5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds jitterable = data[5] & 0x18; 5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bs = (data[5] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0; 5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pck = (data[5] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0; 5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* dv indicates 'data valid' (e.g., the tablet is in sync 5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and has delivered a "correct" report) We will ignore 5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * all 'bad' reports... 5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dv != 0) { 5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not already sent a tool_button_?? code, do 5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so now. Then set FIRED_BIT so it won't be resent unless 5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user forces FIRED_BIT off. 5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (TOOL_BUTTON_FIRED 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (aiptek->curSetting.toolMode) == 0) { 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TOOL_BUTTON(aiptek->curSetting.toolMode), 5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1); 5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p != 0) { 5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_X, x); 5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_Y, y); 5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_PRESSURE, z); 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_TOUCH, tip); 5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_STYLUS, bs); 5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_STYLUS2, pck); 5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.xTilt != 5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_TILT_DISABLE) { 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, 5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ABS_TILT_X, 5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.xTilt); 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.yTilt != AIPTEK_TILT_DISABLE) { 5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ABS_TILT_Y, 5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.yTilt); 5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Wheel support is in the form of a single-event 5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * firing. 5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.wheel != 5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_WHEEL_DISABLE) { 5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, 5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ABS_WHEEL, 5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel); 5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS); 5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Report 3's come from the mouse in absolute mode. 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (data[0] == 3) { 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) { 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE; 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (!AIPTEK_POINTER_ALLOW_MOUSE_MODE 5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (aiptek->curSetting.pointerMode)) { 5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED; 5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds x = le16_to_cpu(get_unaligned((__le16 *) (data + 1))); 5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = le16_to_cpu(get_unaligned((__le16 *) (data + 3))); 5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds jitterable = data[5] & 0x1c; 5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = (data[5] & 0x01) != 0 ? 1 : 0; 5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dv = (data[5] & 0x02) != 0 ? 1 : 0; 5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds left = (data[5] & aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; 5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds right = (data[5] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; 5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; 5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dv != 0) { 5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not already sent a tool_button_?? code, do 5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so now. Then set FIRED_BIT so it won't be resent unless 5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user forces FIRED_BIT off. 5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (TOOL_BUTTON_FIRED 5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (aiptek->curSetting.toolMode) == 0) { 5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TOOL_BUTTON(aiptek->curSetting.toolMode), 5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1); 5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p != 0) { 5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_X, x); 6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_Y, y); 6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_LEFT, left); 6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_MIDDLE, middle); 6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_RIGHT, right); 6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Wheel support is in the form of a single-event 6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * firing. 6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) { 6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, 6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ABS_WHEEL, 6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel); 6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; 6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, REL_MISC, p | AIPTEK_REPORT_TOOL_MOUSE); 6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Report 4s come from the macro keys when pressed by stylus 6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (data[0] == 4) { 6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds jitterable = data[1] & 0x18; 6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = (data[1] & 0x01) != 0 ? 1 : 0; 6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dv = (data[1] & 0x02) != 0 ? 1 : 0; 6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds tip = (data[1] & 0x04) != 0 ? 1 : 0; 6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0; 6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0; 6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macro = data[3]; 6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds z = le16_to_cpu(get_unaligned((__le16 *) (data + 4))); 6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dv != 0) { 6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not already sent a tool_button_?? code, do 6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so now. Then set FIRED_BIT so it won't be resent unless 6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user forces FIRED_BIT off. 6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TOOL_BUTTON(aiptek->curSetting.toolMode), 6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1); 6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p != 0) { 6501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_TOUCH, tip); 6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_STYLUS, bs); 6521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_STYLUS2, pck); 6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_PRESSURE, z); 6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* For safety, we're sending key 'break' codes for the 6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * neighboring macro keys. 6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro > 0) { 6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 6611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macroKeyEvents[macro - 1], 0); 6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro < 25) { 6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macroKeyEvents[macro + 1], 0); 6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, macroKeyEvents[macro], p); 6681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_MISC, 6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p | AIPTEK_REPORT_TOOL_STYLUS); 6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Report 5s come from the macro keys when pressed by mouse 6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (data[0] == 5) { 6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds jitterable = data[1] & 0x1c; 6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p = (data[1] & 0x01) != 0 ? 1 : 0; 6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dv = (data[1] & 0x02) != 0 ? 1 : 0; 6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; 6811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; 6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; 6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macro = data[3]; 6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (dv != 0) { 6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not already sent a tool_button_?? code, do 6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so now. Then set FIRED_BIT so it won't be resent unless 6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user forces FIRED_BIT off. 6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TOOL_BUTTON(aiptek->curSetting.toolMode), 6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1); 6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (p != 0) { 7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_LEFT, left); 7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_MIDDLE, middle); 7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, BTN_RIGHT, right); 7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* For safety, we're sending key 'break' codes for the 7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * neighboring macro keys. 7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro > 0) { 7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macroKeyEvents[macro - 1], 0); 7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro < 25) { 7131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macroKeyEvents[macro + 1], 0); 7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, macroKeyEvents[macro], 1); 7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_rel(inputdev, ABS_MISC, 7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds p | AIPTEK_REPORT_TOOL_MOUSE); 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We have no idea which tool can generate a report 6. Theoretically, 7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * neither need to, having been given reports 4 & 5 for such use. 7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * However, report 6 is the 'official-looking' report for macroKeys; 7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * reports 4 & 5 supposively are used to support unnamed, unknown 7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * hat switches (which just so happen to be the macroKeys.) 7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds else if (data[0] == 6) { 7301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds macro = le16_to_cpu(get_unaligned((__le16 *) (data + 1))); 7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_regs(inputdev, regs); 7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro > 0) { 7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, macroKeyEvents[macro - 1], 7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0); 7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (macro < 25) { 7381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, macroKeyEvents[macro + 1], 7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0); 7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* If we've not already sent a tool_button_?? code, do 7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so now. Then set FIRED_BIT so it won't be resent unless 7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user forces FIRED_BIT off. 7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (TOOL_BUTTON_FIRED(aiptek->curSetting.toolMode) == 0) { 7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, 7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds TOOL_BUTTON(aiptek->curSetting. 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds toolMode), 1); 7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode |= TOOL_BUTTON_FIRED_BIT; 7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_key(inputdev, macroKeyEvents[macro], 1); 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_report_abs(inputdev, ABS_MISC, 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1 | AIPTEK_REPORT_TOOL_UNKNOWN); 7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_sync(inputdev); 7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbg("Unknown report %d", data[0]); 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Jitter may occur when the user presses a button on the stlyus 7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * or the mouse. What we do to prevent that is wait 'x' milliseconds 7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * following a 'jitterable' event, which should give the hand some time 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * stabilize itself. 7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We just introduced aiptek->previousJitterable to carry forth the 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * notion that jitter occurs when the button state changes from on to off: 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * a person drawing, holding a button down is not subject to jittering. 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * With that in mind, changing from upper button depressed to lower button 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * WILL transition through a jitter delay. 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->previousJitterable != jitterable && 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.jitterDelay != 0 && aiptek->inDelay != 1) { 7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->endDelay = jiffies + 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((aiptek->curSetting.jitterDelay * HZ) / 1000); 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inDelay = 1; 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->previousJitterable = jitterable; 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsexit: 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = usb_submit_urb(urb, GFP_ATOMIC); 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (retval != 0) { 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err("%s - usb_submit_urb failed with result %d", 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds __FUNCTION__, retval); 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * These are the USB id's known so far. We do not identify them to 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * specific Aiptek model numbers, because there has been overlaps, 7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * use, and reuse of id's in existing models. Certain models have 7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * been known to use more than one ID, indicative perhaps of 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * manufacturing revisions. In any event, we consider these 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IDs to not be model-specific nor unique. 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct usb_device_id aiptek_ids[] = { 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x01)}, 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x10)}, 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x20)}, 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x21)}, 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x22)}, 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x23)}, 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x24)}, 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds {} 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE(usb, aiptek_ids); 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Open an instance of the tablet driver. 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int aiptek_open(struct input_dev *inputdev) 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = inputdev->private; 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->openCount++ > 0) { 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->urb->dev = aiptek->usbdev; 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (usb_submit_urb(aiptek->urb, GFP_KERNEL) != 0) { 8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->openCount--; 8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EIO; 8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Close an instance of the tablet driver. 8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aiptek_close(struct input_dev *inputdev) 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = inputdev->private; 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (--aiptek->openCount == 0) { 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_kill_urb(aiptek->urb); 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * aiptek_set_report and aiptek_get_report() are borrowed from Linux 2.4.x, 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * where they were known as usb_set_report and usb_get_report. 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaiptek_set_report(struct aiptek *aiptek, 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char report_type, 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char report_id, void *buffer, int size) 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return usb_control_msg(aiptek->usbdev, 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_sndctrlpipe(aiptek->usbdev, 0), 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_REQ_SET_REPORT, 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_TYPE_CLASS | USB_RECIP_INTERFACE | 8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_DIR_OUT, (report_type << 8) + report_id, 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->ifnum, buffer, size, 5000); 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaiptek_get_report(struct aiptek *aiptek, 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char report_type, 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char report_id, void *buffer, int size) 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return usb_control_msg(aiptek->usbdev, 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_rcvctrlpipe(aiptek->usbdev, 0), 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_REQ_GET_REPORT, 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_TYPE_CLASS | USB_RECIP_INTERFACE | 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds USB_DIR_IN, (report_type << 8) + report_id, 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->ifnum, buffer, size, 5000); 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Send a command to the tablet. 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaiptek_command(struct aiptek *aiptek, unsigned char command, unsigned char data) 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const int sizeof_buf = 3 * sizeof(u8); 8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 *buf; 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf = kmalloc(sizeof_buf, GFP_KERNEL); 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buf) 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = 2; 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = command; 8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = data; 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek_set_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) { 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbg("aiptek_program: failed, tried to send: 0x%02x 0x%02x", 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds command, data); 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(buf); 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret < 0 ? ret : 0; 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Retrieve information from the tablet. Querying info is defined as first 9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sending the {command,data} sequence as a command, followed by a wait 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (aka, "programmaticDelay") and then a "read" request. 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaiptek_query(struct aiptek *aiptek, unsigned char command, unsigned char data) 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const int sizeof_buf = 3 * sizeof(u8); 9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u8 *buf; 9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf = kmalloc(sizeof_buf, GFP_KERNEL); 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!buf) 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0] = 2; 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[1] = command; 9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[2] = data; 9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek_command(aiptek, command, data) != 0) { 9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(buf); 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EIO; 9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds msleep(aiptek->curSetting.programmableDelay); 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek_get_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) { 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds dbg("aiptek_query failed: returned 0x%02x 0x%02x 0x%02x", 9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds buf[0], buf[1], buf[2]); 9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = -EIO; 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ret = le16_to_cpu(get_unaligned((__le16 *) (buf + 1))); 9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(buf); 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Program the tablet into either absolute or relative mode. 9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We also get information about the tablet's size. 9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int aiptek_program_tablet(struct aiptek *aiptek) 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Execute Resolution500LPI */ 9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x18, 0x04)) < 0) 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getModelCode */ 9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x02, 0x00)) < 0) 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->features.modelCode = ret & 0xff; 9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getODMCode */ 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x03, 0x00)) < 0) 9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->features.odmCode = ret; 9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getFirmwareCode */ 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x04, 0x00)) < 0) 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->features.firmwareCode = ret; 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getXextension */ 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0) 9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_X] = 0; 9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_X] = ret - 1; 9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getYextension */ 9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0) 9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_Y] = 0; 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_Y] = ret - 1; 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Query getPressureLevels */ 9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0) 9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_PRESSURE] = 0; 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_PRESSURE] = ret - 1; 9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Depending on whether we are in absolute or relative mode, we will 9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * do a switchToTablet(absolute) or switchToMouse(relative) command. 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.coordinateMode == 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_COORDINATE_ABSOLUTE_MODE) { 9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Execute switchToTablet */ 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x10, 0x01)) < 0) { 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Execute switchToMouse */ 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x10, 0x00)) < 0) { 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Enable the macro keys */ 9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x11, 0x02)) < 0) 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0 10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Execute FilterOn */ 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x17, 0x00)) < 0) 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Execute AutoGainOn */ 10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = aiptek_command(aiptek, 0x12, 0xff)) < 0) 10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Reset the eventCount, so we track events from last (re)programming 10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA; 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->eventCount = 0; 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sysfs functions. Sysfs prefers that individually-tunable parameters 10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * exist in their separate pseudo-files. Summary data that is immutable 10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * may exist in a singular file so long as you don't define a writeable 10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * interface. 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support the 'size' file -- display support 10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletSize(struct device *dev, char *buf) 10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%dx%d\n", 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_X] + 1, 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_Y] + 1); 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* These structs define the sysfs files, param #1 is the name of the 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * file, param 2 is the file permissions, param 3 & 4 are to the 10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * output generator and input parser routines. Absence of a routine is 10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * permitted -- it only means can't either 'cat' the file, or send data 10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to it. 10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL); 10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'product_id' file 10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletProductId(struct device *dev, char *buf) 10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "0x%04x\n", 10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.id.product); 10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL); 10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'vendor_id' file 10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletVendorId(struct device *dev, char *buf) 10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev.id.vendor); 10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL); 10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'vendor' file 10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletManufacturer(struct device *dev, char *buf) 10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval; 10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = snprintf(buf, PAGE_SIZE, "%s\n", aiptek->usbdev->manufacturer); 10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return retval; 10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(vendor, S_IRUGO, show_tabletManufacturer, NULL); 10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'product' file 10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletProduct(struct device *dev, char *buf) 11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int retval; 11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retval = snprintf(buf, PAGE_SIZE, "%s\n", aiptek->usbdev->product); 11081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return retval; 11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(product, S_IRUGO, show_tabletProduct, NULL); 11121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 11141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'pointer_mode' file. Note that this file 11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 11161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletPointerMode(struct device *dev, char *buf) 11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 11201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.pointerMode) { 11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_POINTER_ONLY_STYLUS_MODE: 11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "stylus"; 11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_POINTER_ONLY_MOUSE_MODE: 11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "mouse"; 11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_POINTER_EITHER_MODE: 11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "either"; 11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletPointerMode(struct device *dev, const char *buf, size_t count) 11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "stylus") == 0) { 11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.pointerMode = 11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_POINTER_ONLY_STYLUS_MODE; 11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "mouse") == 0) { 11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.pointerMode = AIPTEK_POINTER_ONLY_MOUSE_MODE; 11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "either") == 0) { 11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE; 11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(pointer_mode, 11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletPointerMode, store_tabletPointerMode); 11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'coordinate_mode' file. Note that this file 11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletCoordinateMode(struct device *dev, char *buf) 11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.coordinateMode) { 11801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_COORDINATE_ABSOLUTE_MODE: 11811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "absolute"; 11821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_COORDINATE_RELATIVE_MODE: 11851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "relative"; 11861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 11891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 11901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 11911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 11921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 11931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 11941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 11951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 11961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletCoordinateMode(struct device *dev, const char *buf, size_t count) 11971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 11981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 11991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 12001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 12011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "absolute") == 0) { 12031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.pointerMode = 12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_COORDINATE_ABSOLUTE_MODE; 12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "relative") == 0) { 12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.pointerMode = 12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_COORDINATE_RELATIVE_MODE; 12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(coordinate_mode, 12131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 12141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletCoordinateMode, store_tabletCoordinateMode); 12151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 12171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'tool_mode' file. Note that this file 12181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 12191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 12201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletToolMode(struct device *dev, char *buf) 12211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 12221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (TOOL_BUTTON(aiptek->curSetting.toolMode)) { 12291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_MOUSE_MODE: 12301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "mouse"; 12311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_ERASER_MODE: 12341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "eraser"; 12351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_PENCIL_MODE: 12381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "pencil"; 12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_PEN_MODE: 12421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "pen"; 12431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_BRUSH_MODE: 12461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "brush"; 12471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE: 12501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "airbrush"; 12511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_TOOL_BUTTON_LENS_MODE: 12541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "lens"; 12551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 12581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 12591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 12601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 12611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 12621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 12651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletToolMode(struct device *dev, const char *buf, size_t count) 12661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 12671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 12681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 12691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 12701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "mouse") == 0) { 12721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_MOUSE_MODE; 12731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "eraser") == 0) { 12741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_ERASER_MODE; 12751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "pencil") == 0) { 12761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_PENCIL_MODE; 12771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "pen") == 0) { 12781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE; 12791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "brush") == 0) { 12801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_BRUSH_MODE; 12811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "airbrush") == 0) { 12821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE; 12831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "lens") == 0) { 12841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.toolMode = AIPTEK_TOOL_BUTTON_LENS_MODE; 12851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 12861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 12881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 12891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(tool_mode, 12911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 12921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletToolMode, store_tabletToolMode); 12931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 12941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 12951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'xtilt' file. Note that this file 12961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 12971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 12981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletXtilt(struct device *dev, char *buf) 12991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.xTilt == AIPTEK_TILT_DISABLE) { 13061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "disable\n"); 13071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 13081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%d\n", 13091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.xTilt); 13101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 13141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletXtilt(struct device *dev, const char *buf, size_t count) 13151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int x; 13181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "disable") == 0) { 13231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.xTilt = AIPTEK_TILT_DISABLE; 13241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 13251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds x = (int)simple_strtol(buf, NULL, 10); 13261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (x >= AIPTEK_TILT_MIN && x <= AIPTEK_TILT_MAX) { 13271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.xTilt = x; 13281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 13311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(xtilt, 13341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, show_tabletXtilt, store_tabletXtilt); 13351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 13371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'ytilt' file. Note that this file 13381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 13391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 13401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletYtilt(struct device *dev, char *buf) 13411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.yTilt == AIPTEK_TILT_DISABLE) { 13481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "disable\n"); 13491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 13501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%d\n", 13511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.yTilt); 13521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 13561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletYtilt(struct device *dev, const char *buf, size_t count) 13571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int y; 13601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "disable") == 0) { 13651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.yTilt = AIPTEK_TILT_DISABLE; 13661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 13671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds y = (int)simple_strtol(buf, NULL, 10); 13681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (y >= AIPTEK_TILT_MIN && y <= AIPTEK_TILT_MAX) { 13691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.yTilt = y; 13701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 13721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 13731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(ytilt, 13761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, show_tabletYtilt, store_tabletYtilt); 13771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 13791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'jitter' file. Note that this file 13801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 13811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 13821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletJitterDelay(struct device *dev, char *buf) 13831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%d\n", aiptek->curSetting.jitterDelay); 13901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 13911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 13931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletJitterDelay(struct device *dev, const char *buf, size_t count) 13941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 13951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 13961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 13971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 13981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 13991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.jitterDelay = (int)simple_strtol(buf, NULL, 10); 14011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 14021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(jitter, 14051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 14061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletJitterDelay, store_tabletJitterDelay); 14071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 14091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'delay' file. Note that this file 14101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows reprogramming. 14111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletProgrammableDelay(struct device *dev, char *buf) 14131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 14151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 14171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 14181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%d\n", 14201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.programmableDelay); 14211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 14241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletProgrammableDelay(struct device *dev, const char *buf, size_t count) 14251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 14271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 14291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 14301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.programmableDelay = (int)simple_strtol(buf, NULL, 10); 14321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 14331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(delay, 14361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 14371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletProgrammableDelay, store_tabletProgrammableDelay); 14381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 14401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'input_path' file. Note that this file 14411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 14421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletInputDevice(struct device *dev, char *buf) 14441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 14461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 14481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 14491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "/dev/input/%s\n", 14511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->features.inputPath); 14521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(input_path, S_IRUGO, show_tabletInputDevice, NULL); 14551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 14571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'event_count' file. Note that this file 14581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 14591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletEventsReceived(struct device *dev, char *buf) 14611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 14631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 14651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 14661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%ld\n", aiptek->eventCount); 14681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 14691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL); 14711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 14731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'diagnostic' file. Note that this file 14741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 14751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 14761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletDiagnosticMessage(struct device *dev, char *buf) 14771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 14781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 14791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *retMsg; 14801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 14821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 14831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->diagnostic) { 14851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_DIAGNOSTIC_NA: 14861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retMsg = "no errors\n"; 14871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE: 14901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retMsg = "Error: receiving relative reports\n"; 14911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE: 14941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retMsg = "Error: receiving absolute reports\n"; 14951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 14961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED: 14981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.pointerMode == 14991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_POINTER_ONLY_MOUSE_MODE) { 15001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retMsg = "Error: receiving stylus reports\n"; 15011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 15021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds retMsg = "Error: receiving mouse reports\n"; 15031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 15041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 15071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 15081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 15091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, retMsg); 15101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 15111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL); 15131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 15151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'stylus_upper' file. Note that this file 15161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 15171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 15181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletStylusUpper(struct device *dev, char *buf) 15191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 15201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 15211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 15221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 15241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 15251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.stylusButtonUpper) { 15271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_STYLUS_UPPER_BUTTON: 15281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "upper"; 15291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_STYLUS_LOWER_BUTTON: 15321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "lower"; 15331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 15361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 15371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 15391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 15401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 15411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 15431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletStylusUpper(struct device *dev, const char *buf, size_t count) 15441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 15451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 15461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 15481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 15491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "upper") == 0) { 15511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.stylusButtonUpper = 15521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_STYLUS_UPPER_BUTTON; 15531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "lower") == 0) { 15541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.stylusButtonUpper = 15551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_STYLUS_LOWER_BUTTON; 15561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 15571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 15581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 15591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(stylus_upper, 15611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 15621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletStylusUpper, store_tabletStylusUpper); 15631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 15651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'stylus_lower' file. Note that this file 15661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 15671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 15681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletStylusLower(struct device *dev, char *buf) 15691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 15701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 15711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 15721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 15741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 15751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.stylusButtonLower) { 15771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_STYLUS_UPPER_BUTTON: 15781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "upper"; 15791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_STYLUS_LOWER_BUTTON: 15821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "lower"; 15831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 15861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 15871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 15881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 15891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 15901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 15911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 15931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletStylusLower(struct device *dev, const char *buf, size_t count) 15941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 15951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 15961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 15971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 15981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 15991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "upper") == 0) { 16011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.stylusButtonLower = 16021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_STYLUS_UPPER_BUTTON; 16031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "lower") == 0) { 16041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.stylusButtonLower = 16051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_STYLUS_LOWER_BUTTON; 16061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 16071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 16081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 16091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(stylus_lower, 16111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 16121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletStylusLower, store_tabletStylusLower); 16131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 16151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'mouse_left' file. Note that this file 16161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 16171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 16181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletMouseLeft(struct device *dev, char *buf) 16191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 16201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 16211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 16221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 16241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 16251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.mouseButtonLeft) { 16271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_LEFT_BUTTON: 16281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "left"; 16291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_MIDDLE_BUTTON: 16321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "middle"; 16331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_RIGHT_BUTTON: 16361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "right"; 16371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 16401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 16411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 16431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 16441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 16451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 16471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletMouseLeft(struct device *dev, const char *buf, size_t count) 16481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 16491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 16501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 16521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 16531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "left") == 0) { 16551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON; 16561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "middle") == 0) { 16571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonLeft = AIPTEK_MOUSE_MIDDLE_BUTTON; 16581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "right") == 0) { 16591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonLeft = AIPTEK_MOUSE_RIGHT_BUTTON; 16601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 16611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 16621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 16631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(mouse_left, 16651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 16661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletMouseLeft, store_tabletMouseLeft); 16671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 16691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'mouse_middle' file. Note that this file 16701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 16711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 16721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletMouseMiddle(struct device *dev, char *buf) 16731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 16741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 16751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 16761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 16781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 16791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.mouseButtonMiddle) { 16811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_LEFT_BUTTON: 16821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "left"; 16831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_MIDDLE_BUTTON: 16861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "middle"; 16871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_RIGHT_BUTTON: 16901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "right"; 16911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 16931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 16941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 16951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 16961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 16971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 16981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 16991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 17011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletMouseMiddle(struct device *dev, const char *buf, size_t count) 17021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 17031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 17041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 17061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 17071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "left") == 0) { 17091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonMiddle = AIPTEK_MOUSE_LEFT_BUTTON; 17101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "middle") == 0) { 17111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonMiddle = 17121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_MOUSE_MIDDLE_BUTTON; 17131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "right") == 0) { 17141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonMiddle = 17151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_MOUSE_RIGHT_BUTTON; 17161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 17171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 17181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 17191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(mouse_middle, 17211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 17221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletMouseMiddle, store_tabletMouseMiddle); 17231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 17251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'mouse_right' file. Note that this file 17261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 17271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 17281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletMouseRight(struct device *dev, char *buf) 17291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 17301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 17311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char *s; 17321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 17341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 17351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds switch (aiptek->curSetting.mouseButtonRight) { 17371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_LEFT_BUTTON: 17381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "left"; 17391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 17401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_MIDDLE_BUTTON: 17421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "middle"; 17431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 17441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds case AIPTEK_MOUSE_RIGHT_BUTTON: 17461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "right"; 17471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 17481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds default: 17501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds s = "unknown"; 17511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 17521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 17531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%s\n", s); 17541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 17551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 17571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletMouseRight(struct device *dev, const char *buf, size_t count) 17581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 17591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 17601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 17621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 17631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strcmp(buf, "left") == 0) { 17651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonRight = AIPTEK_MOUSE_LEFT_BUTTON; 17661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "middle") == 0) { 17671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonRight = 17681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_MOUSE_MIDDLE_BUTTON; 17691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (strcmp(buf, "right") == 0) { 17701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON; 17711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 17721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 17731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 17741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(mouse_right, 17761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, 17771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds show_tabletMouseRight, store_tabletMouseRight); 17781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 17801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'wheel' file. Note that this file 17811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 17821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 17831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletWheel(struct device *dev, char *buf) 17841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 17851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 17861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 17881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 17891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->curSetting.wheel == AIPTEK_WHEEL_DISABLE) { 17911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "disable\n"); 17921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else { 17931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%d\n", 17941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.wheel); 17951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 17961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 17971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 17981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 17991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletWheel(struct device *dev, const char *buf, size_t count) 18001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->newSetting.wheel = (int)simple_strtol(buf, NULL, 10); 18071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 18081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 18091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(wheel, 18111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, show_tabletWheel, store_tabletWheel); 18121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 18141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'execute' file. Note that this file 18151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * both displays current setting and allows for setting changing. 18161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletExecute(struct device *dev, char *buf) 18181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* There is nothing useful to display, so a one-line manual 18251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is in order... 18261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, 18281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds "Write anything to this file to program your tablet.\n"); 18291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 18301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t 18321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstore_tabletExecute(struct device *dev, const char *buf, size_t count) 18331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We do not care what you write to this file. Merely the action 18401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of writing to this file triggers a tablet reprogramming. 18411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memcpy(&aiptek->curSetting, &aiptek->newSetting, 18431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sizeof(struct aiptek_settings)); 18441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek_program_tablet(aiptek) < 0) 18461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -EIO; 18471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return count; 18491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 18501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(execute, 18521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds S_IRUGO | S_IWUGO, show_tabletExecute, store_tabletExecute); 18531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 18551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'odm_code' file. Note that this file 18561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 18571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletODMCode(struct device *dev, char *buf) 18591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.odmCode); 18661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 18671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL); 18691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 18711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'model_code' file. Note that this file 18721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 18731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_tabletModelCode(struct device *dev, char *buf) 18751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.modelCode); 18821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 18831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL); 18851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 18871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * support routines for the 'firmware_code' file. Note that this file 18881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * only displays current setting. 18891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 18901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t show_firmwareCode(struct device *dev, char *buf) 18911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 18921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = dev_get_drvdata(dev); 18931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek == NULL) 18951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 18961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 18971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return snprintf(buf, PAGE_SIZE, "%04x\n", 18981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->features.firmwareCode); 18991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 19001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DEVICE_ATTR(firmware_code, S_IRUGO, show_firmwareCode, NULL); 19021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 19041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This routine removes all existing sysfs files managed by this device 19051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * driver. 19061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 19071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aiptek_delete_files(struct device *dev) 19081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 19091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_size); 19101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_product_id); 19111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_vendor_id); 19121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_vendor); 19131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_product); 19141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_pointer_mode); 19151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_coordinate_mode); 19161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_tool_mode); 19171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_xtilt); 19181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_ytilt); 19191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_jitter); 19201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_delay); 19211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_input_path); 19221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_event_count); 19231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_diagnostic); 19241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_odm_code); 19251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_model_code); 19261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_firmware_code); 19271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_stylus_lower); 19281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_stylus_upper); 19291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_mouse_left); 19301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_mouse_middle); 19311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_mouse_right); 19321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_wheel); 19331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds device_remove_file(dev, &dev_attr_execute); 19341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 19351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 19371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This routine creates the sysfs files managed by this device 19381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * driver. 19391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 19401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int aiptek_add_files(struct device *dev) 19411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 19421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int ret; 19431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((ret = device_create_file(dev, &dev_attr_size)) || 19451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_product_id)) || 19461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_vendor_id)) || 19471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_vendor)) || 19481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_product)) || 19491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_pointer_mode)) || 19501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_coordinate_mode)) || 19511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_tool_mode)) || 19521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_xtilt)) || 19531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_ytilt)) || 19541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_jitter)) || 19551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_delay)) || 19561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_input_path)) || 19571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_event_count)) || 19581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_diagnostic)) || 19591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_odm_code)) || 19601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_model_code)) || 19611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_firmware_code)) || 19621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_stylus_lower)) || 19631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_stylus_upper)) || 19641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_mouse_left)) || 19651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_mouse_middle)) || 19661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_mouse_right)) || 19671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_wheel)) || 19681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (ret = device_create_file(dev, &dev_attr_execute))) { 19691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds err("aiptek: killing own sysfs device files\n"); 19701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek_delete_files(dev); 19711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 19721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return ret; 19731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 19741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 19761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This routine is called when a tablet has been identified. It basically 19771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * sets up the tablet and the driver's internal structures. 19781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 19791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int 19801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsaiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) 19811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 19821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_device *usbdev = interface_to_usbdev(intf); 19831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct usb_endpoint_descriptor *endpoint; 19841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek; 19851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct input_dev *inputdev; 19861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct input_handle *inputhandle; 19871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *node, *next; 19881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds char path[64 + 1]; 19891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 19901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int speeds[] = { 0, 19911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_50, 19921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_400, 19931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_25, 19941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_100, 19951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_200, 19961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PROGRAMMABLE_DELAY_300 19971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds }; 19981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 19991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* programmableDelay is where the command-line specified 20001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * delay is kept. We make it the first element of speeds[], 20011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * so therefore, your override speed is tried first, then the 20021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * remainder. Note that the default value of 400ms will be tried 20031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if you do not specify any command line parameter. 20041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds speeds[0] = programmableDelay; 20061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if ((aiptek = kmalloc(sizeof(struct aiptek), GFP_KERNEL)) == NULL) 20081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 20091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset(aiptek, 0, sizeof(struct aiptek)); 20101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH, 20121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds SLAB_ATOMIC, &aiptek->data_dma); 20131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->data == NULL) { 20141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(aiptek); 20151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 20161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 20171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->urb = usb_alloc_urb(0, GFP_KERNEL); 20191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->urb == NULL) { 20201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data, 20211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->data_dma); 20221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(aiptek); 20231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 20241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 20251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Set up the curSettings struct. Said struct contains the current 20271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * programmable parameters. The newSetting struct contains changes 20281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user makes to the settings via the sysfs interface. Those 20291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * changes are not "committed" to curSettings until the user 20301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * writes to the sysfs/.../execute file. 20311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE; 20331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.coordinateMode = AIPTEK_COORDINATE_ABSOLUTE_MODE; 20341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE; 20351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.xTilt = AIPTEK_TILT_DISABLE; 20361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.yTilt = AIPTEK_TILT_DISABLE; 20371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON; 20381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.mouseButtonMiddle = AIPTEK_MOUSE_MIDDLE_BUTTON; 20391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON; 20401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.stylusButtonUpper = AIPTEK_STYLUS_UPPER_BUTTON; 20411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.stylusButtonLower = AIPTEK_STYLUS_LOWER_BUTTON; 20421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.jitterDelay = jitterDelay; 20431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.programmableDelay = programmableDelay; 20441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Both structs should have equivalent settings 20461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memcpy(&aiptek->newSetting, &aiptek->curSetting, 20481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sizeof(struct aiptek_settings)); 20491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Now program the capacities of the tablet, in terms of being 20511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * an input device. 20521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.evbit[0] |= BIT(EV_KEY) 20541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | BIT(EV_ABS) 20551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | BIT(EV_REL) 20561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds | BIT(EV_MSC); 20571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absbit[0] |= 20591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (BIT(ABS_X) | 20601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(ABS_Y) | 20611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(ABS_PRESSURE) | 20621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(ABS_TILT_X) | 20631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(ABS_TILT_Y) | BIT(ABS_WHEEL) | BIT(ABS_MISC)); 20641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.relbit[0] |= 20661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL) | BIT(REL_MISC)); 20671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.keybit[LONG(BTN_LEFT)] |= 20691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE)); 20701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.keybit[LONG(BTN_DIGI)] |= 20721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (BIT(BTN_TOOL_PEN) | 20731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_RUBBER) | 20741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_PENCIL) | 20751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_AIRBRUSH) | 20761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_BRUSH) | 20771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_MOUSE) | 20781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOOL_LENS) | 20791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2)); 20801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.mscbit[0] = BIT(MSC_SERIAL); 20821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Programming the tablet macro keys needs to be done with a for loop 20841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * as the keycodes are discontiguous. 20851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i) 20871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds set_bit(macroKeyEvents[i], aiptek->inputdev.keybit); 20881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Set up client data, pointers to open and close routines 20901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for the input device. 20911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 20921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.private = aiptek; 20931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.open = aiptek_open; 20941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.close = aiptek_close; 20951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 20961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Determine the usb devices' physical path. 20971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Asketh not why we always pretend we're using "../input0", 20981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * but I suspect this will have to be refactored one 20991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * day if a single USB device can be a keyboard & a mouse 21001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * & a tablet, and the inputX number actually will tell 21011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * us something... 21021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (usb_make_path(usbdev, path, 64) > 0) 21041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sprintf(aiptek->features.usbPath, "%s/input0", path); 21051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Program the input device coordinate capacities. We do not yet 21071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * know what maximum X, Y, and Z values are, so we're putting fake 21081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * values in. Later, we'll ask the tablet to put in the correct 21091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * values. 21101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_X] = 0; 21121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_X] = 2999; 21131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_Y] = 0; 21141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_Y] = 2249; 21151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_PRESSURE] = 0; 21161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_PRESSURE] = 511; 21171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_TILT_X] = AIPTEK_TILT_MIN; 21181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_TILT_X] = AIPTEK_TILT_MAX; 21191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_TILT_Y] = AIPTEK_TILT_MIN; 21201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_TILT_Y] = AIPTEK_TILT_MAX; 21211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmin[ABS_WHEEL] = AIPTEK_WHEEL_MIN; 21221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absmax[ABS_WHEEL] = AIPTEK_WHEEL_MAX - 1; 21231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_X] = 0; 21241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_Y] = 0; 21251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_PRESSURE] = 0; 21261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_TILT_X] = 0; 21271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_TILT_Y] = 0; 21281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absfuzz[ABS_WHEEL] = 0; 21291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_X] = 0; 21301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_Y] = 0; 21311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_PRESSURE] = 0; 21321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_TILT_X] = 0; 21331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_TILT_Y] = 0; 21341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.absflat[ABS_WHEEL] = 0; 21351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.name = "Aiptek"; 21361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.phys = aiptek->features.usbPath; 21371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.id.bustype = BUS_USB; 21381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.id.vendor = le16_to_cpu(usbdev->descriptor.idVendor); 21391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.id.product = le16_to_cpu(usbdev->descriptor.idProduct); 21401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inputdev.id.version = le16_to_cpu(usbdev->descriptor.bcdDevice); 2141e838a0d4d5260bce452c96914a6e86b217c53c55Viktor A. Danilov aiptek->inputdev.dev = &intf->dev; 21421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->usbdev = usbdev; 21441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber; 21451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->inDelay = 0; 21461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->endDelay = 0; 21471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->previousJitterable = 0; 21481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds endpoint = &intf->altsetting[0].endpoint[0].desc; 21501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Go set up our URB, which is called when the tablet receives 21521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * input. 21531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_fill_int_urb(aiptek->urb, 21551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->usbdev, 21561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_rcvintpipe(aiptek->usbdev, 21571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds endpoint->bEndpointAddress), 21581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->data, 8, aiptek_irq, aiptek, 21591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds endpoint->bInterval); 21601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->urb->transfer_dma = aiptek->data_dma; 21621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 21631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Register the tablet as an Input Device 21651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_register_device(&aiptek->inputdev); 21671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* We now will look for the evdev device which is mapped to 21691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the tablet. The partial name is kept in the link list of 21701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * input_handles associated with this input device. 21711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * What identifies an evdev input_handler is that it begins 21721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * with 'event', continues with a digit, and that in turn 21731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * is mapped to /{devfs}/input/eventN. 21741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds inputdev = &aiptek->inputdev; 21761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each_safe(node, next, &inputdev->h_list) { 21771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds inputhandle = to_handle(node); 21781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (strncmp(inputhandle->name, "event", 5) == 0) { 21791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds strcpy(aiptek->features.inputPath, inputhandle->name); 21801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 21811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 21821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 21831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info("input: Aiptek on %s (%s)\n", path, aiptek->features.inputPath); 21851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Program the tablet. This sets the tablet up in the mode 21871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * specified in newSetting, and also queries the tablet's 21881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * physical capacities. 21891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 21901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Sanity check: if a tablet doesn't like the slow programmatic 21911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * delay, we often get sizes of 0x0. Let's use that as an indicator 21921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * to try faster delays, up to 25 ms. If that logic fails, well, you'll 21931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * have to explain to us how your tablet thinks it's 0x0, and yet that's 21941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * not an error :-) 21951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 21961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 21971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) { 21981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.programmableDelay = speeds[i]; 21991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (void)aiptek_program_tablet(aiptek); 22001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek->inputdev.absmax[ABS_X] > 0) { 22011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info("input: Aiptek using %d ms programming speed\n", 22021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->curSetting.programmableDelay); 22031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 22041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 22051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 22061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Associate this driver's struct with the usb interface. 22081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_set_intfdata(intf, aiptek); 22101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Set up the sysfs files 22121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek_add_files(&intf->dev); 22141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Make sure the evdev module is loaded. Assuming evdev IS a module :-) 22161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (request_module("evdev") != 0) 22181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info("aiptek: error loading 'evdev' module"); 22191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 22211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 22221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Forward declaration */ 22241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aiptek_disconnect(struct usb_interface *intf); 22251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct usb_driver aiptek_driver = { 22271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .owner = THIS_MODULE, 22281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .name = "aiptek", 22291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .probe = aiptek_probe, 22301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .disconnect = aiptek_disconnect, 22311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds .id_table = aiptek_ids, 22321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 22331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************** 22351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Deal with tablet disconnecting from the system. 22361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aiptek_disconnect(struct usb_interface *intf) 22381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 22391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct aiptek *aiptek = usb_get_intfdata(intf); 22401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Disassociate driver's struct with usb interface 22421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_set_intfdata(intf, NULL); 22441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (aiptek != NULL) { 22451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* Free & unhook everything from the system. 22461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 22471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_kill_urb(aiptek->urb); 22481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds input_unregister_device(&aiptek->inputdev); 22491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek_delete_files(&intf->dev); 22501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_free_urb(aiptek->urb); 22511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_buffer_free(interface_to_usbdev(intf), 22521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds AIPTEK_PACKET_LENGTH, 22531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek->data, aiptek->data_dma); 22541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(aiptek); 22551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds aiptek = NULL; 22561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 22571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 22581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init aiptek_init(void) 22601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 22611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int result = usb_register(&aiptek_driver); 22621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (result == 0) { 22631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info(DRIVER_VERSION ": " DRIVER_AUTHOR); 22641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds info(DRIVER_DESC); 22651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 22661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return result; 22671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 22681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit aiptek_exit(void) 22701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 22711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds usb_deregister(&aiptek_driver); 22721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 22731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR(DRIVER_AUTHOR); 22751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION(DRIVER_DESC); 22761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL"); 22771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(programmableDelay, int, 0); 22791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(programmableDelay, "delay used during tablet programming"); 22801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(jitterDelay, int, 0); 22811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay"); 22821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 22831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(aiptek_init); 22841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(aiptek_exit); 2285