'

Linuxwacom HOWTO

From linuxwacom
Revision as of 18:01, 13 March 2012 by Favux (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Copyright (C) 2002-2011 - LinuxWacom

Permission is granted to copy, distribute and/or modify this document

under the terms of the GNU GENERAL PUBLIC LICENSE as published by the

Free Software Foundation; either version 2 of the License, or

(at your option) any later version. A copy of the license is included in

the section entitled GNU GENERAL PUBLIC LICENSE.


Contents

Introduction

This document began in November 2002 as a HOWTO for setting up a USB Wacom Intuos2 on Redhat 8.0. It has since grown to cover all Wacom tablets, USB and serial, running on various different Linux distributions. As of December 2002, this project has transformed into the Linux Wacom Project. Work on this document is on-going so if you find an error, have a question, or have something to add, please send an email to: linuxwacom-discuss@lists.sourceforge.net.

How To Use This Document

In terms of document organization, if you have not figured it out already, you can browse the document one page at a time, or you can click on the ALL link and view the entire thing in one long page.

Where the guide differs between distributions or packages, I have added a comment which appears indented with an aqua background.

Also, it bears mentioning since it's a detail often missed: there are two drivers in the Linux Wacom Project- wacom.o and wacom_drv.o. The first driver is the USB kernel driver. The second driver is the XFree86 Wacom driver. Serial users need only be concerned with the wacom_drv.o driver. USB users need both. If you try to use the wacom_drv.o driver in place of the wacom.o kernel driver or visa-versa, things generally won't work.

Next, this document was written with the assumption that you are starting from scratch with a relatively recent legacy distribution of the Linux kernel. Also, if you have already added lines to your XFree86/Xorg configuration file (XF86Config/XF86Config-4 or xorg.conf), you should comment them out and restart X. Since we'll be stepping through the entire process, we need X to ignore the tablet until we're ready. Otherwise, X will just get in the way.

Finally, if you know what you're doing, you can leave your X settings intact, print this out, switch to runlevel 3, and follow along from the console. An HTML version of this document can be found in the docs directory at docs.html.

Wacom Driver Theory of Operation

Wacom tablets are available in serial and USB configurations. They are also sold as embedded products in certain tablet PC's. I will cover all three types, but the serial case is the most straightforward, so we'll start there.

Serial Tablet Operation - The Short Story

When a Wacom serial tablet is connected to a COM port, software can interact with it directly by opening the appropriate device, usually /dev/ttyS0. The XFree86 Wacom driver (wacom_drv.o) does precisely this, and all stylus movements are converted into XInput events for programs like the Gimp to turn into fluid brush strokes.

Wacom tablets are capable of handling a number of different data protocols, and the Linux Wacom Project code currently utilitizes two, Wacom Protocol IV and Protocol V. Each operates with a fixed-sized packet, the length of which depends on the model and ROM version.

When the serial tablet is reset, it defaults to a standard baud rate, often 9600 baud. From there, the device type can be queried, and if the tablet supports it, the baud rate increased to a higher value. Additionally, model parameters like tablet size can be queried directly to determine which features are available.

Once configured, the tablet streams data back to the application as tools are brought into and out of proximity, are pressed against the tablet surface, or are tilted or inverted.

USB Tablet Operation - The Long Story

Initially at least, the USB Wacom tablet is an HID compliant device, and when first connected to the computer, will identify itself as such. Unfortunately, this is not what you want because in this mode, you will not get any of the fancy features. The hid-core.c, mousedev.c, and usbmouse.c kernel drivers contain exceptions for the wacom; when the device is detected, they ignore the tablet. In this way, the more sophisticated wacom driver has the opportunity to assume control.

The first thing that the driver does is register itself with the USB subsystem and wait for work to do. When the user> Ping plugs the device in, or the device is first detected, the USB subsystem shops the vendor and device identifier around, checking it against different drivers. The wacom driver takes responsibility for the tablet and then notifies the event system that it will be providing data. It then asks the tablet to switch from HID-compliant mode to "mode 2", a wacom-specific protocol which allows for values like pressure, Z rotation, and tilt. As information arrives, the wacom driver dutifully converts the data into real-world values and hands it on to the event system.

From here, any usermode application can get access to the event data by opening /dev/input/event0. A stream of events including mouse movements, clicks, and proximity updates can be read from the device. Similar to the serial case, XFree86's Wacom driver (wacom_drv.o) has the ability to read this device, and performs filtering on the data before convert the Linux input events into XInput events.

By breaking the responsibility for the data into three distinct levels, the kernel code remains simple and robust, the applications generalized, and the fancy features commonly accessible to all GUI applications in the X window system itself. This document walks down the entire data path from the USB kernel driver to the gimp application.

Embedded Device Operation - Tablet PC with Wacom Digitizer

Refer to Tablet PC page for detail.

Getting It Together

This section is devoted to preparing your system for the installation. Every distribution handles kernel modules and file locations a bit differently, so the goal here is to return everything to a known state.

USB users will need to pay specific attention to discussions related to kernel drivers and modules. Serial tablet users have it much easier, and can bypass this. Both users will need to make changes to the XFree86/Xorg configuration file.

Before We Start

From the beginning, let's make certain that we are on the same page. First, if you have Wacom related lines in your XF86Config/XF86Config-4 or xorg.conf files already, you should comment them out or remove them. In particular, this includes InputDevice sections with a driver set to "wacom" and their corresponding InputDevice lines in ServerLayout. When that's done, restart X.

It would be a wise idea at this time to check your XFree86 or Xorg log file for references to wacom, wcm, or tablet. If X persists in trying to interact with the tablet, things will only be problematic later. The log file is often found at /var/log/XFree86.0.log or /var/log/Xorg.0.log.

To be prepared for the coming steps, it would be nice if you know what X server and Linux kernel versions are running on your system. The X -version command reveals those information for you.

If you have a USB tablet, you need to check Wacom kernel driver first The USB Kernel Driver. Serial tablet or Tablet PC users can go directly to the next section Downloading the Code page.

Downloading the Code

The file linuxwacom-0.8.8-10.tar.bz2 is the stable package and contains files that you will need to get your serial or USB tablet working. The current beta package linuxwacom-0.8.7-2.tar.bz2 is also available and may be used by people who are willing to help test new features. I will never put a beta package on this site that I am not running myself on my primary development machine. So you can be certain that if there are any obvious show stoppers, they will be fixed before you get to see them.

Unpacking the tarball is usually a one-step process, but I show both steps in case the typical -jxf option doesn't work with tar.

   [jej@ayukawa jej]$ bunzip2 linuxwacom-0.8.8-10.tar.bz2
   [jej@ayukawa jej]$ tar -xf linuxwacom-0.8.8-10.tar
   [jej@ayukawa jej]$ cd linuxwacom-0.8.8-10

Once in the package directory, you need only to configure and build the code. This is described in more detail as you continue. The executables and wacom_drv.o are installed automatically; the kernel drivers have different installation procedures depend on the kernel source you use.

If you are interested, the following tables contain the package contents and release dates. Otherwise, let's continue.

Stable files included for linuxwacom-0.8.8-10:

File Comment
configure - configure script for distribution independent builds
prebuilt/install - installer for the executables and Wacom X driver to a system identical to the development system.
prebuilt/uninstall - unistaller for the executables
prebuilt/wacom.4x.gz - man page for Wacom driver
prebuilt/32 - Wacom X driver and its utility programs for XFree86 and X11R6/Xorg on x86 systems
prebuilt/64 - Wacom X driver and its utility programs for XFree86 and X11R6/Xorg on x86-64 systems
src/util/wacdump.c - a simple program for displaying tablet event data directly using ncurses
src/util/xidump.c - a diagnostic program for displaying XInput event data
src/util/wacscrn.c - curses library for wacdump
src/util/wactablet.c - wacom tablet library for wacdump
src/util/wacusb.c - wacom USB protocol library for wacdump
src/util/wacserial.c - wacom serial protocol library for wacdump
src/util/wactablet.h - wacom tablet library for wacdump
src/util/wacusb.h - wacom USB protocol library for wacdump
src/util/wacserial.h - wacom serial protocol library for wacdump
src/util/xsetwacom.c - a command line configuration tool for Wacom X driver
src/util/wacomcfg.c - configuration option library for xsetwacom
src/util/wcmAction.c - keystroke and modifier encoding/decoding
src/util/wcmAction.h - keystroke routine definitions
src/util/hal-setup-wacom.c - a HAL service program for Wacom devices
src/util/10-linuxwacom.fdi - a HAL script for Wacom devices
src/include/Xwacom.h - configuration options for xsetwacom
src/2.6.x/wacom_sys.c - wacom kernel driver specific to each major kernel release, where x can be 16 and 30
src/2.6.x/wacom_wac.c - wacom kernel driver processes tablet specific information, where x can be 16 or 30
src/2.6.x/wacom.h - wacom kernel driver header specific to each major kernel release, where x can be 16, 18, 24, and 30
src/2.6./wacom_wac.h - part of wacom kernel driver header for tablet specific declaration and definitionsx, where x can be 16 or 30
src/2.6.16/hid-core.c - replacement kernel driver for kernels 2.6.16 and 2.6.17
src/xdrv/xf86Wacom.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Binary available in prebuilt directory.
src/xdrv/xf86Wacom.h - source for wacom_drv.o; requires XFree86/Xorg build environment to compile.
src/xdrv/wcmCommon.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Common to USB and serial tablets
src/xdrv/wcmXCommand.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. APIs to xsetwacom.
src/xdrv/wcmCompat.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. XFree86 4.x support
src/xdrv/wcmConfig.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Configuration setup
src/xdrv/wcmFilter.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Raw data filters
src/xdrv/wcmFilter.h - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Raw data filters
src/xdrv/wcmISDV4.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. General Tablet PC
src/xdrv/wcmSerial.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Serial tablet support
src/xdrv/wcmSerial.h - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Serial tablet support
src/xdrv/wcmUSB.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. USB tablet support
src/xdrv/wcmTilt2Rotation.c - source for wacom_drv.o; requires XFree86/Xorg build environment to compile. Converting mouse tilt to rotation
src/wacomxi/wacomcpl-exec - a graphic configuration tool for wacom XFree86 driver
src/wacomxi/wacomxi.c - calibration library for xsetwacom
src/wacomxi/wacomxi.h - calibration library for xsetwacom
GPL - the GNU General Public License, in case you did not already have one lying around

Stable Packages by Version and Date:

File Date Comment
linuxwacom-0.9.3.tar.bz2 2012-1-16 Adds the Cintiq 24HD and LED support for Intuos4 small. Distinguish right wheel (wheel2) from left one.
linuxwacom-0.9.2.tar.bz2 2011-10-27 Remove the old LED usbfs defines. Tilt2R applies to I4 mouse.
linuxwacom-0.9.1.tar.bz2 2011-10-19 Adds LED support for Cintiq21UX2 and Intuos4.
linuxwacom-0.9.0.tar.bz2 2011-06-20 Adds "ignore the first two USB motion events" back to prevent cursor jump at first proximity and "-lc" to src/xdrv/Makefile.am for
SLED11, required when "AutoAddDevices" option is true in xorg.conf.
linuxwacom-0.8.8-11.tar.bz2 2011-03-04 Maintenance: fixes a race condition that crashes the X server. Kernel regression bug for Cintiq fixed for kernels 2.6.16 - 2.6.18.
linuxwacom-0.8.8-10.tar.bz2 2010-10-01 Support: Cintiq 21UX2, DTU-2231 & -1631, and Intuos4 USB Endpoint; kernels 2.6.16 up to 2.6.35; Xorg older than 1.7.
linuxwacom-0.8.6-2.tar.bz2 2010-05-12 Support: tablets 0xE2, 0xE3, and 0x9F. Support new serial ISDv4 Tablet PCs. Avoid duplicated and invalid devices and types for X
server 1.4 and later. Support kernels up to 2.6.35. Add 5 new Bamboo devices.
linuxwacom-0.8.4-4.tar.bz2 2009-11-13 Support: Intuos4; kernels up to 2.6.31; Xorg up to 1.6.0.
linuxwacom-0.8.2-2.tar.bz2 2009-01-19 Support: USB Tablet PC with and without touch; kernels up to 2.6.28; Bamboo1 and Monarch; new wacomcpl features.
linuxwacom-0.8.0-3.tar.bz2 2008-05-23 Support: kernels up to 2.6.25; Keystrokes for both buttons and expresskeys; New tablets: Bamboo series and Cintiq 12WX & 20WSX,
and so much more that you can not afford to miss.
linuxwacom-0.7.8-3.tar.bz2 2007-08-15 Supports new tablet, Bamboo. Provides prebuilt Wacom X driver and its utility programs for x86_32 and x86_64 systems.
Adds many new xsetwacom options.
linuxwacom-0.7.6-4.tar.bz2 2006-12-01 Updated xsetwacom and support kernel 2.6.17/18, Intuos3 4x6 and on-the-fly tablet rotation.
linuxwacom-0.7.4-3.tar.bz2 2006-06-19 Supports kernels 2.6.15/16, 2 new Intuos3 (12x12 and 12x19), and DTF 521.
linuxwacom-0.7.2.tar.bz2 2005-12-21 Updated configuration script and support kernel 2.6.13/14, Graphire4, PL710, DTF720, Intuos3 6x11 and Volito2 .
linuxwacom-0.7.0-1.tar.bz2 2005-09-23 Updated wacomcpl and support 16 buttons for all tools.
linuxwacom-0.7.0-x86-64-1.tar.bz2 2005-09-23 Updated wacomcpl and support 16 buttons for all tools.

Beta Packages by Version and Date:

File Date Comment
linuxwacom-0.8.9.tar.bz2 2011-05-04 Put wacom_ioctl back for Intuous4 OLED. Fixed error path in wacom_probe. Updated wacomcfg.c for touch device. Some minor kernel updates.
linuxwacom-0.8.7-2.tar.bz2 2010-05-21 Support kernels from 2.6.16 to 2.6.35. Support Cintiq 21UX2, Intuos4 WL (USB Endpoint).
linuxwacom-0.8.5-12.tar.bz2 2010-03-26 Support tablets 0xE2, 0xE3, and 0x9F. Support new serial ISDv4 Tablet PCs. Avoid duplicated and invalid devices and types for X server 1.4
and later. Support kernels up to 2.6.34. Add 5 new Bamboo devices.
linuxwacom-0.8.3-6.tar.bz2 2009-06-28 Support Inutos4 tablets. Support kernel upto 2.6.29. Support Xorg 1.6. Updated multi-monitor suppport
linuxwacom-0.8.1-6.tar.bz2 2008-10-24 Support USB Tablet PC with and without touch. Support kernel 2.6.27
linuxwacom-0.7.9-11.tar.bz2 2008-04-11 Support kernel 2.6.22 & 2.6.24. Temporary workaround for Xorg 7.3. Support Bamboo series and Cintiq 12WX & 20WSX. Updated wacomcpl for
keystrokes. Support serial Tablet PC with touch.
linuxwacom-0.7.7-12.tar.bz2 2007-06-15 Support Bamboo. Updated installer under prebuilt directory to install X driver as well as its associated utilities. Support non-overlapped
multi-areas for same InputDevice. Support pad with button and keystroke events through xsetwacom.
linuxwacom-0.7.5-4.tar.bz2 2006-09-29 Support kernel 2.6.17/18, Intuos3 4x6, and tablet detach/attach as well as rotation while X running.
linuxwacom-0.7.3-1.tar.bz2 2006-04-07 Support kernel 2.6.15/16, Intuos3 12x12 and 12x19.
linuxwacom-0.7.1-2.tar.bz2 2005-12-06 Support kernel 2.6.13/14, Graphire4, PL710, DTF720, Intuos3 6x11 and Volito2.

The Root Account

If you are comfortable with the root account, paths, the /sbin directory, and programs like modprobe, you can skip this section. This is largely to clarify some things for people who are new to Linux and get tripped up with the root account and paths. This is not meant to be a tutorial, so if this is over your head, I would recommend reading a book on Linux command line usage. All examples in this document assume the bash shell.

Many of the procedures in this document need root access, and the commands that are executed are located in places on the system that are not normally accessed by typical users. In order to run the modprobe command, for instance, you must have root access. Additionally, if the /sbin directory which contains modprobe does not appear in your path, you must specify the full pathname, /sbin/modprobe, to run the command. Here is an example of the problem, followed by solutions.

   [jej@ayukawa jej]$ modprobe foo
   bash: modprobe: command not found
   [jej@ayukawa jej]$ locate modprobe
   /sbin/modprobe
   [jej@ayukawa jej]$ echo $PATH
   /bin:/usr/bin: ... :/home/jej/bin

Normal users do not have /sbin in their path, so running modprobe directly fails. Running the program using the full pathname (/sbin/modprobe) will solve this, as will adding /sbin to the path. But there is another problem, as we will see:

   [jej@ayukawa jej]$ /sbin/modprobe foo
   foo.o: create_module: Operation not permitted

Normal users are not allowed to run this command. For that, we need to be root. The su command stands for "substitute user" since it can be used to become any user on the system, but it is generally known by the incorrect but very memorable mnemonic "superuser."

   [jej@ayukawa jej]$ su
   Password:
   [root@ayukawa jej]# whoami
   root

Note the change to the root account, and the additional change from $ to # on the prompt. I maintain this convention in all the examples in this document, so if you get an "access denied" error, check the prompt. You probably need to be root.

Now that we have root access, is /sbin in our path? No. We have only been granted the privileges of root; we are not really in the root account's environment. Most notably, the home directory ($HOME) changes, but the path ($PATH) stays the same. Thus, becoming root is not sufficient to run modprobe without the full pathname, but does solve the access problem.

   [root@ayukawa jej]# modprobe foo
   bash: modprobe: command not found
   [root@ayukawa jej]# export PATH=$PATH:/sbin
   [root@ayukawa jej]# modprobe foo
   [root@ayukawa jej]#

In this example, the user adds the /sbin directory to the path and can run modprobe normally. export is a bash shell command that changes aspects of your environment; in this case, /sbin is appended to the path. In the highly unlikely event that you are using a different shell, which for novice users seems unwise to me, you would need to use a different command. Redhat, Mandrake, and similar distributions all use bash by default, so it is unlikely that you would be using anything else.

At any rate, changing the path is a reasonably good solution, if you can remember the syntax of the export command.

Another approach to this problem is to do more than just "be root," but to run in the root account's environment. This is accomplished with the "su -" command and provides you with root's normal path, including the /sbin directory. The unfortunate side-effect is that you wind up in root's home directory, requiring you to cd back to the original directory in which you were working.

   [jej@ayukawa src]$ pwd
   /home/jej/src/linuxwacom/src
   [jej@ayukawa src]$ su -
   [root@ayukawa root]# cd /home/jej/src/linuxwacom/src
   [root@ayukawa src]# echo $PATH
   /bin:/sbin:/usr/bin: ... :/root/bin

Here, the user starts in the package's src directory, but upon invoking "su -" is magically shuttled off to root's home directory. A quick cd back to the package directory and all is better. And, as demonstrated above, the path conveniently contains /sbin.

So that leaves you with two immediate options, and one potential long-term option:

Option One: Become root and add /sbin to the path.

   [jej@ayukawa src]$ su
   [jej@ayukawa src]# export PATH=$PATH:/sbin

Option Two: Become root using root's environment and cd back.

   [jej@ayukawa src]$ su -
   [root@ayukawa root]# cd /home/jej/src/linuxwacom/src

Option Three (recommended): Add /sbin to your personal account's path

   [jej@ayukawa src]$ export PATH=$PATH:/sbin
   [jej@ayukawa src]$ su
   [root@ayukawa src]# echo $PATH
   /bin:/usr/bin: ... :/home/jej/bin:/sbin

By adding the path early in the session, it becomes available every time you su to root later on. You could also add the export command to the .bash_profile file in your home directory and have the path set automatically when you log in.

To exit from the root account and return to your normal account, you can use the exit command or type Ctrl-D on an empty line.

   [root@ayukawa src]# exit
   [jej@ayukawa src]$

If any of this is not explained clearly, drop me a line and let me know where you got stuck. I'd be happy to clarify directly and update this page for future readers.

Install from Prebuilt

We have created 2 sets of prebuilt Wacom X driver and its utility programs under linuxwacom-0.8.8-10/prebuilt; one for x86-32 systems, the other for x86-64 systems.

If you don't plan to change anything in the driver, following steps will install the prebuilt files for you:

Note: Please remove the existing linuxwacom package if your distro has installed one for you. Use the command, such as yum remove or apt-get uninstall, provided by your distro. Please DO NOT remove the driver files manually by rm.

   [jej@ayukawa jej]$ cd linuxwacom-0.8.8-10/prebuilt
   [jej@ayukawa prebuilt]$ su
   [jej@ayukawa prebuilt]# ./uninstall
   [jej@ayukawa prebuilt]# ./install

Serial tablet (most Tablet PCs are serial) users can skip the rest sections and go to Viewing Wacom Data (wacdump) page for details on viewing the tablet output now.

If you use an older USB tablet and your running kernel was released 6 months later than your tablet was first seen in market, you most probably can skip next section of this chapter and the whole chapter 4 too. If you would like to make certain, continue to next section.

Note:If the prebuilt driver doesn't work for you, you would probably end up building your own driver in the following sections. Kory Prince has provided a Python script, getwacom.py, to download, compile, and install the latest linuxwacom release. Please try Kory's script if you would like to take a shortcut to install the driver.

Configuring the Package

This section describes how to configure the package. You can run the configure script now as the samples below demonstrate, or later when you reach the section of the document that explains what specifically needs to be configured and why. This page is provided largely as a reference.

By default, xidump, wacdump, xsetwacom, wacom_drv.o, and wacomcpl are built. Additional options include replacement of kernel drivers for hid, mousedev, evdev, and usbmouse as well as building the XFree86/Xorg driver from scratch. Lastly, remember that for every --enable option, there is also an equivalent --disable option.

The configuration options are listed on this page. You can also see the online list by issuing ./configure -help under linuxwacom's base directory.

Note: You should remove the existing linuxwacom package on your system before installing the drivers and utilities from this project.

Building Kernel Modules - USB Only

In order to build kernel modules, you will need the kernel source installed on your system. If you are running on Redhat or Mandrake, you can get it by installing the kernel-source RPM.

The kernel source directory is assumed to be in /usr/src/linux, /usr/src/linux-2.6, /usr/src/linux-`uname -r`, or /lib/modules/`uname -r`/source. If your kernel sources are elsewhere, you will need to specify the directory with the --with-kernel option described below.

For 2.6.16 and 2.6.17 kernels, you need to configure the kernel modules (wacom and hid) under your kernel source directory before configuring linuxwacom.

Note, for kernel 2.6.18 and later, no need to build hid any more. Refer to Testing Tablet Detection to see if you need to build hid or not.

Module Versioning - USB Only

The script attempts to discover if the kernel is using module versioning by detecting the presence of version numbers in the hid.o module of the currently active kernel. Recent package versions also check for hid.o.gz which exist on Mandrake systems. The configure script may not be able to determine if kernel module versioning should be enabled or not, in which case it will say "unknown, assuming no."

If module versioning is disabled when it should be enabled, depmod will complain about missing symbols but otherwise, things will probably work fine. If it is enabled when it should be disabled, the code may not compile, and it almost certainly will not load properly. If the configure script fails to determine the correct value, the default action of disabling module versioning is the better choice, and you can allows enable it manually and rebuild if depmod complains.

The XFree86/Xorg XInput Driver - USB and Serial

Generally, you will not need to build wacom_drv.o since it ships in binary form in the prebuilt directory. There are prebuilt binaries for XFree86 and Xorg corresponding to x86 and x86-64 systems, respectively. If no one works for you, building from source may be your only option. See the Building wacom_drv.o from Scratch page for more information.

Library Dependencies - ncurses and XLib

Various utilities in the linuxwacom package require not only specific libraries, but their development header files as well. The ncurses package is one such example. Most distributions install the ncurses libraries by default, but the header files are often located in a separate package. You will need both.

Similarly, if you wish to test your tablet using xidump to view XFree86/Xorg input events, you will need the XFree86/Xorg development headers. On Redhat/Fedore Core, they are contained in the XFree86-devel/xorg-sdk package.

If any packages are missing, the configuration will warn you and disable building any programs that depend on them.

Processor Type

The processor type is determined by the script and used to build the kernel modules. If it guesses incorrectly, or you would prefer a different setting, use the --with-arch option described below.

Linux Specific Features

The Linux wacom driver uses the Linux input subsystem, as does the USB portions of the XFree86/Xorg driver. Consequently, if you are building on a non-Linux system, the USB code will not work for you. This is detected, and a comment to that effect is added to the configuration summary. I recognize that FreeBSD and similar systems have USB support; however, until someone can bridge the gap between the FreeBSD kernel and the XFree86/X.org driver, the problem is largely unsolved. Contributions are of course welcome. The Linux-specific features can be enabled/disabled using the --with-linux argument.

Configuration Options

The following options are provided as reference. Normally, you will only need a few of these options. Some obscure systems or you want to build a driver for another platform may need all of them. Each section of the document identifies which options are needed and when.

Option Default Builds
--enable-wacom no wacom.o kernel driver
--enable-wacdump yes wacdump LinuxInput event monitor
--enable-xidump yes xidump XInput event monitor
--enable-libwacomcfg yes libwacomcfg Dynamic library for xsetwacom
--enable-libwacomxi yes libwacomxi Dynamic library for wacomcpl
--enable-xsetwacom yes xsetwacom XFree86 wacom driver configuration comannd
--enable-quirk-tablet-rescale best guess Enable tablet to screen rescale code. Note: If you have TwinView setup running on a X server 1.4 and later, and your mapping doesn't work
properly, enable this option may resolve the issue.
--enable-quirk-Uninit-called best guess Enable Uninit called
--enable-hid no hid.o replacement kernel driver (not normally needed)
--enable-usbmouse no usbmouse.o replacement kernel driver (not normally needed)
--enable-evdev no evdev.o replacement kernel driver (not normally needed)
--enable-mousedev no mousedev.o replacement kernel driver (not normally needed)
--enable-wacomdrv yes wacom_drv.o XFree86/Xorg driver (binary is available in prebuilt directory)
--enable-modver=yes/no best guess enables kernel module versioning; usually guesses correctly, but can be enabled or disabled if not
--with-kernel=dir best guess Specifies the kernel source directory if configure cannot guess correctly.
--with-x-src=dir best guess Specifies the X driver build source directory
--with-xorg-sdk=dir best guess Specifies the Xorg SDK directory
--with-tcl=dir /usr Specifies the tcl directory. The tcl's include and lib directories should be under this directory. If tcl.h is not in dir/include, it will be
searched under dir directly
--with-tk=dir /usr Specifies the tk directory. If tk is under the same directory as tcl, this option can be eliminated. Otherwise, the tk's include and lib directories
should be under this directory. If tk.h is not in dir/include, it will be searched under dir directly
--with-arch=arch best guess Specifies the architecture if configure guesses incorrectly
--enable-xserver64=yes/no best guess enables 64-bit X server. You probably need to define xlib directory by adding option --with-xlib=xlib-dir so compiler can link with the right Xlib.
--with-linux=yes/no best guess Specifies if compiled on a Linux system; USB code is Linux specific
--with-xlib=yes/no best guess Specifies if building xlib-based programs; xidump uses XInput headers
--enable-dlloader=yes/no best guess Enable dlloader build option and built wacom_drv.so instead of wacom_drv.o
--with-xmoduledir=dir best guess Specify wacom_drv path explicitly. Implies --enable-dlloader

Configuration Samples

Here is a sample output of the script on a Fedora Core 5 system:

    [jej@ayukawa linuxwacom]$ ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    ...
    checking for arch type... i386-redhat-linux
    checking for kernel type... Linux
    checking for linux-based kernel... yes
    checking for kernel sources... /lib/modules/2.6.20-1.2320.fc5/source
    checking for kernel module support... yes
    checking for kernel module versioning... yes
    checking for valid Xorg SDK... ok
    checking for X... libraries , headers
    ...
    checking for X lib directory... found
    checking for tclsh... /usr/bin/tclsh
    checking for tcl version... 8.4
    checking for tcl header files... /usr/include/
    checking for tk header files... found
    checking ncurses.h usability... yes
    checking ncurses.h presence... yes
    checking for ncurses.h... yes
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i386-redhat-linux
           linux kernel - yes 2.6.18
      module versioning - yes -DCONFIG_MODVERSIONS -DMODVERSIONS -include /lib/modules/2.6.20-1.2320.fc5/source/include/linux/modversions.h
          kernel source - yes /lib/modules/2.6.20-1.2320.fc5/source
               Xorg SDK - yes /usr/include/xorg
              XSERVER64 - no 
               dlloader - yes 
                   XLib - yes /usr/lib
                    TCL - yes /usr/include
                     TK - yes /usr/include
                ncurses - yes

      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
                  hid.o - no
             usbmouse.o - no
                evdev.o - no
             mousedev.o - no
                input.o - no
            tabletdev.o - no
           wacom_drv.so - yes /usr/lib/xorg/modules/input
            wacom_drv.o - no
      wacom*_drv quirks - libc-wrapper key-events dixScreenOrigins
    ----------------------------------------

If the configure script fails to find something that it is looking for, it may disable some options that you previously enabled on the command-line. If this happens, check the output for a warning like the following:

    checking for valid XFree86/X.org build environment... xf86Version.h missing
    Tried /usr/programs/Xserver/hw/xfree86 and /usr/xc/programs/Xserver/hw/xfree86
    ...
    ***
    *** WARNING:
    *** Unable to compile wacom_drv.{o,so}
    *** without Xorg SDK or XFree86 build environment
    *** wacom_drv.o will not be built
    ***

In this particular case, the X driver was enabled. The --with-x-src option was not specified. And the configure can not find the header file, xf86Version.h, under any of the predefined paths. Without the build environment, the module cannot be compiled and was consequently disabled.

The following sample command-line will build everything but wacdump while disabling module versioning. It also has a user-specified kernel source directory:

    [jej@ayukawa linuxwacom]$ ./configure --enable-wacom --disable-wacdump

    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    ...
    checking for HAL... yes
    checking for arch type... i586-suse-linux
    checking for kernel type... Linux
    checking for linux-based kernel... yes
    checking for kernel source/headers... /lib/modules/2.6.25.20-0.7-default/source
    checking kernel version... 2.6.25.20-0.7-default
    checking for kernel module support... yes
    checking for Xlib... yes
    checking for XSERVER... yes
    checking for xserver libc-wrapper header-files... yes
    checking if scaling tablet to screen size is needed... yes
    checking if Xorg server is version 1.4 or later... yes
    checking if Xorg is 7.3 or earlier... no
    checking if Xorg server is version 1.5.2 or later... no
    checking if Xorg server is version 1.6 or later... no
    checking if Xorg SDK defined IsXExtensionPointer... yes
    checking if Xorg SDK defines dixScreenOrigins... yes
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i686
           linux kernel - yes 2.6.24
      module versioning - no
          kernel source - yes /lib/modules/2.6.25.20-0.7-default/source
                XFree86 - no
               Xorg SDK - yes /usr/include/xorg
              XSERVER64 - no
               dlloader - yes
             xf86config - no
                   XLib - yes /usr/X11R6/lib
                    TCL - yes /usr/local/ActiveTcl
                     TK - yes /usr/local/ActiveTcl
                ncurses - yes

      BUILD OPTIONS:
                wacom.o - yes
                wacdump - no
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
           wacom_drv.so - yes
            wacom_drv.o - no
      wacom*_drv quirks - hal libc-wrapper tablet-screen-scaling IsXExtensionPointer key-events dixScreenOrigins Uninit-called
    ----------------------------------------

Notice that the configure script guessed module versioning was enabled by default, but was disabled by the command-line option --disable-modver. Similarly, the wacdump program which is enabled by default was also disabled. All the kernel modules and the XFree86 wacom driver are enabled.

The USB Kernel Driver

Serial tablet users rejoice: you can skip this entire section. Please go to the Viewing Wacom Data (wacdump) page for details on viewing the tablet output. USB users stay put; we need to tweak your kernel.

Kernel modules must be recompiled for each new kernel so I can't just provide binaries. By the time you read this, my present kernel will be entirely out of date with yours.

In any event, many new features are available in the latest drivers from the Linux Wacom Project, so I wholly recommend using them over the drivers provided by your standard distribution. Rest assured, continuous efforts are being made to get these changes merged back into the Linux kernel. However, the changes can normally only merged into the next kernel release, instead of the current one.

For those who don't like upgrading kernels, here is a safe statement: if you are not using a newly released tablet model and you are running a recently released kernel version, chances are that you don't need to update your kernel driver from linuxwacom.

Note: If your system is running on a 2.6.9 or older kernel and you want to use a new Wacom device, upgrading to a newer version (preferablely 2.6.18 or later) is required since we do not support kernels older than 2.6.9 any more.

Testing Tablet Detection

In this section we will determine which driver, if any, claims control over the tablet. There are at least two drivers that are interested: 1) (usb)hid.o which may think it is an HID device (for kernel 2.6.17 or older), 2) the wacom driver which should identify the tablet as its own.

To see which driver is driving the tablet, issuing more /proc/bus/usb/devices should list something similiar to the following:

    [jej@ayukawa wacom]$more /proc/bus/usb/devices
    T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=12  MxCh= 0
    D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
    P:  Vendor=056a ProdID=0042 Rev= 1.15
    S:  Manufacturer=Tablet
    S:  Product=XD-0608-U
    C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=140mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=wacom
    E:  Ad=81(I) Atr=03(Int.) MxPS=  10 Ivl=5ms

where Vendor=056a indicates a Wacom device. Driver=wacom means Wacom driver is in control of the tablet. If you see anything other than wacom after Driver=, at least hid-core.c needs to be updated.

On newer 2.6 systems, more /proc/bus/input/devices gives you

    [jej@ayukawa wacom]$more /proc/bus/input/devices
    I: Bus=0003 Vendor=056a Product=0042 Version=1.15
    N: Name="Wacom Intuos2 6x8"
    P: Phys=usb-0000:00:1d.1-2/input0
    H: Handlers=event3
    B: EV=1f
    B: KEY=1cff 0 1f00ff 0 0 0 0 0 0 0 0
    B: REL=100
    B: ABS=f00017b
    B: MSC=1

where, again, Vendor=056a indicates a Wacom device. Name="Wacom Intuos2 6x8" means an Intuos2 6x8 tablet reported to /dev/input/event3. If there is no Wacom after Name=, you need to update wacom.c.

On older 2.6 kernel systems, unplug then replug your tablet after issuing tail -f /var/log/messages, you should see a flurry of activity. The exact output depends a lot on your particular kernel and distribution.

   This is Suse 10.2 (2.6.25.20-0.7):
    [jej@ayukawa usb]# tail /var/log/messages
    usb 2-2: USB disconnect, address 2
    usb 2-2: new full speed USB device using uhci_hcd and address 3
    usb 2-2: configuration #1 chosen from 1 choice
    input: Wacom Intuos4 6x9 as /devices/pci0000:00/0000:00:1f.4/usb2/2-2/2-2:1.0/input/input8
    usb 2-2: New USB device found, idVendor=056a, idProduct=00b9
    usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    usb 2-2: Product: PTK-640
    usb 2-2: Manufacturer: Tablet

If all went well like above, the USB device was successfully detected and handled by the wacom driver. This presumably means that information like pressure and tilt will be received on /dev/input/event3. You are ready to configure the X driver Downloading the Code.

If instead you got any of the following lines in your log, the wacom driver did not get control. Either your wacom driver doesn't support your tablet or hid is in control.

    	input0,hiddev0: USB HID v1.00 Mouse [Tablet PTK-640] on usb1:5.0
    	input0: Tablet PTK-640 on usb1:5.0

Updated wacom.c

The USB Wacom tablet may be assigned to a different /dev/input/event# after each reboot. To resolve this issue, you can link Wacom USB tablet to "/dev/input/wacom". It can be done by adding the following rules in /etc/udev/rules.d/60-wacom.rules. Some distributions use a different number for the file name. Please look for proper one with wacom under /etc/udev/rules.d.

Below are examples from Debian GNU/Linux distribution:

60-wacom.rules on systems using ATTRS

Systems with only one Wacom device:

    # udev rules for wacom tablets.

    KERNEL!="event[0-9]*", GOTO="wacom_end"

    # Multiple interface support for stylus and touch devices.
    DRIVERS=="wacom", ATTRS{bInterfaceNumber}=="00", ENV{WACOM_TYPE}="stylus"
    DRIVERS=="wacom", ATTRS{bInterfaceNumber}=="01", ENV{WACOM_TYPE}="touch"

    # Convenience links for the common case of a single tablet.  We could do just this:
    #ATTRS{idVendor}=="056a", SYMLINK+="input/wacom-$env{WACOM_TYPE}"
    # but for legacy reasons, we keep the input/wacom link as the generic stylus device.
    ATTRS{idVendor}=="056a", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom"
    ATTRS{idVendor}=="056a", ENV{WACOM_TYPE}=="touch", SYMLINK+="input/wacom-touch"

    # Check and repossess the device if a module other than the wacom one
    # is already bound to it.
    ATTRS{idVendor}=="056a", ACTION=="add", RUN+="check_driver wacom $devpath $env{ID_BUS}"

    LABEL="wacom_end"

Systems with more than one Wacom devices:

    # udev rules for wacom tablets.
    # These rules were compiled for the Debian GNU/Linux distribution,
    # but others may, and indeed are encouraged to, use them also.
    #
    # Should you do so, PLEASE CO-ORDINATE ANY CHANGES OR ADDITIONS
    # of new devices with Ron  so that we can try
    # to present users with a standard set of device nodes
    # which they can rely on across the board.

    KERNEL!="event[0-9]*", GOTO="wacom_end"

    # Port specific link for users of multiple tablets of the same type.
    # The ID_PATH variable is set by the "path_id" script in an earlier rule file.
    ATTRS{idVendor}=="056a", ENV{ID_PATH}=="?*", SYMLINK="input/by-path/$env{ID_PATH}-wacom"

    # Multiple interface support for stylus and touch devices.
    DRIVERS=="wacom", ATTRS{bInterfaceNumber}=="00", ENV{WACOM_TYPE}="stylus"
    DRIVERS=="wacom", ATTRS{bInterfaceNumber}=="01", ENV{WACOM_TYPE}="touch"

    # Type-named links for multiple tablets.  If you want to use multiple
    # tablets of the _same_ type, you will probably need to use the links
    # from /dev/input/by-path to identify which is plugged into what usb
    # port.  For different tablet types though, just pick your links from
    # the list below.
    #
    # We override SYMLINK for tabletpc devices because the by-path link
    # is not required with such devices, there will only ever be one.
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0000", SYMLINK+="input/tablet-penpartner"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0003", SYMLINK+="input/tablet-cintiq_partner"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0010", SYMLINK+="input/tablet-graphire"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0011", SYMLINK+="input/tablet-graphire2-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0012", SYMLINK+="input/tablet-graphire2-5x7"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0013", SYMLINK+="input/tablet-graphire3"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0014", SYMLINK+="input/tablet-graphire3-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0015", SYMLINK+="input/tablet-graphire4-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0016", SYMLINK+="input/tablet-graphire4-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0017", SYMLINK+="input/tablet-bamboofun-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0018", SYMLINK+="input/tablet-bamboofun-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0019", SYMLINK+="input/tablet-bamboo1-medium"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0020", SYMLINK+="input/tablet-intuos-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0021", SYMLINK+="input/tablet-intuos-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0022", SYMLINK+="input/tablet-intuos-9x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0023", SYMLINK+="input/tablet-intuos-12x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0024", SYMLINK+="input/tablet-intuos-12x18"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0030", SYMLINK+="input/tablet-pl400"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0031", SYMLINK+="input/tablet-pl500"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0032", SYMLINK+="input/tablet-pl600"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0033", SYMLINK+="input/tablet-pl600sx"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0034", SYMLINK+="input/tablet-pl550"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0035", SYMLINK+="input/tablet-pl800"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0037", SYMLINK+="input/tablet-pl700"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0038", SYMLINK+="input/tablet-pl510"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0039", SYMLINK+="input/tablet-dtu710"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="003f", SYMLINK+="input/tablet-cintiq21ux"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0041", SYMLINK+="input/tablet-intuos2-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0042", SYMLINK+="input/tablet-intuos2-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0043", SYMLINK+="input/tablet-intuos2-9x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0044", SYMLINK+="input/tablet-intuos2-12x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0045", SYMLINK+="input/tablet-intuos2-12x18"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0047", SYMLINK+="input/tablet-intuos2-6x8a"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0060", SYMLINK+="input/tablet-volito"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0061", SYMLINK+="input/tablet-penstation2"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0062", SYMLINK+="input/tablet-volito2-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0063", SYMLINK+="input/tablet-volito2-2x3"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0064", SYMLINK+="input/tablet-penpartner2"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0065", SYMLINK+="input/tablet-bamboo"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0069", SYMLINK+="input/tablet-bamboo1"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="006A", SYMLINK+="input/tablet-bamboo1-4x6"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="006B", SYMLINK+="input/tablet-bamboo1-5x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0081", SYMLINK+="input/tablet-graphire_bt-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0090", SYMLINK="input/tablet-tpc90"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0093", SYMLINK="input/tablet-tpc93-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="0097", SYMLINK="input/tablet-tpc97"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="009a", SYMLINK="input/tablet-tpc9a-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b0", SYMLINK+="input/tablet-intuos3-4x5"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b1", SYMLINK+="input/tablet-intuos3-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b2", SYMLINK+="input/tablet-intuos3-9x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b3", SYMLINK+="input/tablet-intuos3-12x12"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b4", SYMLINK+="input/tablet-intuos3-12x19"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b5", SYMLINK+="input/tablet-intuos3-6x11"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b7", SYMLINK+="input/tablet-intuos3-4x6"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b8", SYMLINK+="input/tablet-intuos4-4x6"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00b9", SYMLINK+="input/tablet-intuos4-6x9"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00ba", SYMLINK+="input/tablet-intuos4-8x13"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00bb", SYMLINK+="input/tablet-intuos4-12x19"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00c0", SYMLINK+="input/tablet-dtf521"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00c4", SYMLINK+="input/tablet-dtf720"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00c5", SYMLINK+="input/tablet-cintiq20wsx"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00c6", SYMLINK+="input/tablet-cintiq12wx"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00c7", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/tablet-dtu1931"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d0", SYMLINK="input/tablet-bamboo2fg-touch-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", SYMLINK="input/tablet-bamboo2fg-pt-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d2", SYMLINK="input/tablet-bamboo2fg-craft-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d3", SYMLINK="input/tablet-bamboo2fg-fun-6x8-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d4", SYMLINK+="input/tablet-bamboo-p-4x5"    
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d5", SYMLINK+="input/tablet-bamboo-p-6x8"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d6", SYMLINK="input/tablet-bamboo2fg-newpt-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d7", SYMLINK="input/tablet-bamboo2fg-fun-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d8", SYMLINK="input/tablet-bamboo2fg-comic-6x8-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00dA", SYMLINK="input/tablet-bamboo4fg-se-4x5-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00dB", SYMLINK="input/tablet-bamboo4fg-se-6x8-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00e2", SYMLINK="input/tablet-tpcE2-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00e3", SYMLINK="input/tablet-tpcE3-$env{WACOM_TYPE}"
    ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00e6", SYMLINK="input/tablet-tpcE6-$env{WACOM_TYPE}"

    # Convenience links for the common case of a single tablet.  We could do just this:
    #ATTRS{idVendor}=="056a", SYMLINK+="input/wacom-$env{WACOM_TYPE}"
    # but for legacy reasons, we keep the input/wacom link as the generic stylus device.
    ATTRS{idVendor}=="056a", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom"
    ATTRS{idVendor}=="056a", ENV{WACOM_TYPE}=="touch", SYMLINK+="input/wacom-touch"

    # Check and repossess the device if a module other than the wacom one
    # is already bound to it.
    ATTRS{idVendor}=="056a", ACTION=="add", RUN+="check_driver wacom $devpath $env{ID_BUS}"

    LABEL="wacom_end"

60-wacom.rules on systems using SYSFS

1. Systems with only one Wacom device

    # udev rules for wacom devices
    # will create:
    #	/dev/input/wacom
    #	/dev/input/wacom-touch
    BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="00", ENV{WACOM_TYPE}="stylus"
    BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="01", ENV{WACOM_TYPE}="touch"

    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", ENV{WACOM_TYPE}=="touch", SYMLINK+="input/wacom-touch"

2. Systems with more than one Wacom devices

    # udev rules for wacom devices
    # will create:
    #	/dev/input/wacom
    #	/dev/input/wacom-tablets/
    #	/dev/input/wacom-tablets/-
    #
    # The last rule is intended for cases when you have more than one tablet
    # of the same model. The id is usb port dependent.
    #
    BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="00", ENV{WACOM_TYPE}="stylus"
    BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="01", ENV{WACOM_TYPE}="touch"

    # Type-named links for multiple tablets.  If you want to use multiple
    # tablets of the _same_ type, you will probably need to use the links
    # from /dev/input/wacom-tablets to identify which is plugged into what usb
    # port.  For different tablet types though, just pick your links from
    # the list below.
    #
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0000", SYMLINK+="input/wacom-tablets/penpartner input/wacom-tablets/penpartner-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0010", SYMLINK+="input/wacom-tablets/graphire input/wacom-tablets/graphire-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0011", SYMLINK+="input/wacom-tablets/graphire2-4x5 input/wacom-tablets/graphire2-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0012", SYMLINK+="input/wacom-tablets/graphire2-5x7 input/wacom-tablets/graphire2-5x7-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0013", SYMLINK+="input/wacom-tablets/graphire3 input/wacom-tablets/graphire3-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0014", SYMLINK+="input/wacom-tablets/graphire3-6x8 input/wacom-tablets/graphire3-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0015", SYMLINK+="input/wacom-tablets/graphire4-4x5 input/wacom-tablets/graphire4-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0016", SYMLINK+="input/wacom-tablets/graphire4-6x8 input/wacom-tablets/graphire4-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0017", SYMLINK+="input/wacom-tablets/bamboofun-4x5 input/wacom-tablets/bamboofun-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0018", SYMLINK+="input/wacom-tablet/bamboofun-6x8 input/wacom-tablets/bamboofun-6x8"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0019", SYMLINK+="input/wacom-tablet/bamboo1-medium input/wacom-tablets/bamboo1-medium"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0060", SYMLINK+="input/wacom-tablets/volito input/wacom-tablets/volito-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0061", SYMLINK+="input/wacom-tablets/penstation2 input/wacom-tablets/penstation2-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0062", SYMLINK+="input/wacom-tablets/volito2-4x5 input/wacom-tablets/volito2-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0063", SYMLINK+="input/wacom-tablets/volito2-2x3 input/wacom-tablets/volito2-2x3-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0064", SYMLINK+="input/wacom-tablets/penpartner2 input/wacom-tablets/penpartner2-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0020", SYMLINK+="input/wacom-tablets/intuos-4x5 input/wacom-tablets/intuos-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0021", SYMLINK+="input/wacom-tablets/intuos-6x8 input/wacom-tablets/intuos-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0022", SYMLINK+="input/wacom-tablets/intuos-9x12 input/wacom-tablets/intuos-9x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0023", SYMLINK+="input/wacom-tablets/intuos-12x12 input/wacom-tablets/intuos-12x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0024", SYMLINK+="input/wacom-tablets/intuos-12x18 input/wacom-tablets/intuos-12x18-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0030", SYMLINK+="input/wacom-tablets/pl400 input/wacom-tablets/pl400-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0031", SYMLINK+="input/wacom-tablets/pl500 input/wacom-tablets/pl500-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0032", SYMLINK+="input/wacom-tablets/pl600 input/wacom-tablets/pl600-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0033", SYMLINK+="input/wacom-tablets/pl600sx input/wacom-tablets/pl600sx-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0034", SYMLINK+="input/wacom-tablets/pl550 input/wacom-tablets/pl550-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0035", SYMLINK+="input/wacom-tablets/pl800 input/wacom-tablets/pl800-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0037", SYMLINK+="input/wacom-tablets/pl700 input/wacom-tablets/pl700-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0038", SYMLINK+="input/wacom-tablets/pl510 input/wacom-tablets/pl510-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0039", SYMLINK+="input/wacom-tablets/dtu710 input/wacom-tablets/dtu710-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00c0", SYMLINK+="input/wacom-tablets/dtf521 input/wacom-tablets/dtf521-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00c4", SYMLINK+="input/wacom-tablets/dtf720 input/wacom-tablets/dtf720-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0003", SYMLINK+="input/wacom-tablets/cintiq_partner input/wacom-tablets/cintiq_partner-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0041", SYMLINK+="input/wacom-tablets/intuos2-4x5 input/wacom-tablets/intuos2-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0042", SYMLINK+="input/wacom-tablets/intuos2-6x8 input/wacom-tablets/intuos2-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0043", SYMLINK+="input/wacom-tablets/intuos2-9x12 input/wacom-tablets/intuos2-9x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0044", SYMLINK+="input/wacom-tablets/intuos2-12x12 input/wacom-tablets/intuos2-12x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0045", SYMLINK+="input/wacom-tablets/intuos2-12x18 input/wacom-tablets/intuos2-12x18-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b0", SYMLINK+="input/wacom-tablets/intuos3-4x5 input/wacom-tablets/intuos3-4x5-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b1", SYMLINK+="input/wacom-tablets/intuos3-6x8 input/wacom-tablets/intuos3-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b2", SYMLINK+="input/wacom-tablets/intuos3-9x12 input/wacom-tablets/intuos3-9x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b3", SYMLINK+="input/wacom-tablets/intuos3-12x12 input/wacom-tablets/intuos3-12x12-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b4", SYMLINK+="input/wacom-tablets/intuos3-12x19 input/wacom-tablets/intuos3-12x19-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b5", SYMLINK+="input/wacom-tablets/intuos3-6x11 input/wacom-tablets/intuos3-6x11-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="003f", SYMLINK+="input/wacom-tablets/cintiq21ux input/wacom-tablets/cintiq21ux-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00cc", SYMLINK+="input/wacom-tablets/cintiq12ux2 input/wacom-tablets/cintiq21ux2-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0047", SYMLINK+="input/wacom-tablets/intuos2-6x8a input/wacom-tablets/intuos2-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b7", SYMLINK+="input/wacom-tablets/intuos3-4x6 input/wacom-tablets/intuos3-4x6-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b8", SYMLINK+="input/wacom-tablets/intuos4-4x6 input/wacom-tablets/intuos4-4x6-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00b9", SYMLINK+="input/wacom-tablets/intuos4-6x9 input/wacom-tablets/intuos4-6x9-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00ba", SYMLINK+="input/wacom-tablets/intuos4-8x13 input/wacom-tablets/intuos4-8x13-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00bb", SYMLINK+="input/wacom-tablets/intuos4-12x19 input/wacom-tablets/intuos4-12x19-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00bc", SYMLINK+="input/wacom-tablets/intuos4-wl-usb input/wacom-tablets/intuos4-wl-usb-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00bd", SYMLINK+="input/wacom-tablets/intuos4-wl input/wacom-tablets/intuos4-wl-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0065", SYMLINK+="input/wacom-tablets/bamboo input/wacom-tablets/bamboo-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00c6", SYMLINK+="input/wacom-tablets/cintiq12wx input/wacom-tablets/cintiq12wx-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00c5", SYMLINK+="input/wacom-tablets/cintiq20wsx input/wacom-tablets/cintiq20wsx-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00c7", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom-tablets/dtu1931 input/wacom-tablets/dtu1931-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00f0", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom-tablets/dtu1631 input/wacom-tablets/dtu1631-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00ce", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom-tablets/dtu2231 input/wacom-tablets/dtu2231-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0069", SYMLINK+="input/wacom-tablets/bamboo1 input/wacom-tablets/bamboo1-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="006A", SYMLINK+="input/wacom-tablets/bamboo1-4x6 input/wacom-tablets/bamboo1-4x6-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="006B", SYMLINK+="input/wacom-tablets/bamboo1-5x8 input/wacom-tablets/bamboo1-5x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0081", SYMLINK+="input/wacom-tablets/graphire_bt-6x8 input/wacom-tablets/graphire_bt-6x8-%b"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0090", SYMLINK="input/wacom-tablets/tpc90"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0093", SYMLINK="input/wacom-tablets/tpc93-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="0097", SYMLINK="input/wacom-tablets/tpc97"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="009a", SYMLINK="input/wacom-tablets/tpc9a-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00e2", SYMLINK="input/wacom-tablets/tpce2-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00e3", SYMLINK="input/wacom-tablets/tpce3-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d0", SYMLINK="input/tablet-bamboo2fg-touch-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d1", SYMLINK="input/tablet-bamboo2fg-pt-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d2", SYMLINK="input/tablet-bamboo2fg-craft-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d3", SYMLINK="input/tablet-bamboo2fg-fun-6x8-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d4", SYMLINK+="input/tablet-bamboo-p-4x5"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d6", SYMLINK="input/tablet-bamboo2fg-newpt-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d7", SYMLINK="input/tablet-bamboo2fg-fun-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00d8", SYMLINK="input/tablet-bamboo2fg-comic-6x8-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00dA", SYMLINK="input/tablet-bamboo4fg-se-4x5-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00dB", SYMLINK="input/tablet-bamboo4fg-se-6x8-$env{WACOM_TYPE}"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", SYSFS{idProduct}=="00e6", SYMLINK="input/wacom-tablets/tpcE6-$env{WACOM_TYPE}"

    # Convenience links for the common case of a single tablet.  We could do just this:
    #SYSFS{idVendor}=="056a", SYMLINK+="input/wacom-$env{WACOM_TYPE}"
    # but for legacy reasons, we keep the input/wacom link as the generic stylus device.
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", ENV{WACOM_TYPE}!="touch", SYMLINK+="input/wacom"
    BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a", ENV{WACOM_TYPE}=="touch", SYMLINK+="input/wacom-touch"
Newer Mandriva Linux (Mandriva 2007 Spring and later) has an application called mousedrake which takes care of the setup and configuration of linuxwacom driver. If you use Mandriva Linux and you see InputDevice sections for Wacom device in your Xorg.conf, chances are your Wacom tablet is ready for you to draw.

Building wacom.c

To build the wacom.ko kernel module, you need to configure wacom as a kernel module under your kernel source tree first. The kernel sources are required as described on the Configuration page.

Then, you need to configure the package with --enable-wacom option. Here's how the configuration should generally look:

    [jej@ayukawa linuxwacom]$ ./configure --enable-wacom
    ...
    checking for valid kernel source tree... ok
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i686
           linux kernel - yes 2.6.9
      module versioning - yes
                 kernel - yes /usr/src/linux
                XFree86 - no
                   XLib - yes /usr/X11R6
                    TCL - yes /usr
                     TK - yes /usr
                ncurses - yes
                    GTK - 2.0.6

      BUILD OPTIONS:
                wacom.o - yes
                wacdump - yes
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
                  hid.o - no
            wacom_drv.o - no
    ----------------------------------------

As shown above, the kernel directory was detected and the wacom kernel module will be built. If the kernel option shows "no", you will need to specify the --with-kernel option and the correct directory.

For those who feel comfortable to build everything from the source tree, please skip the make and install steps below. Scroll down to the end of this page and see Manually Build the Wacom kernel driver.

If you wanted to build the kernel driver and you do not see the yes after "wacom.o -" in the the "BUILD OPTIONS:", run 'make oldconfig; make prepare; make' on your kernel source should fix the issue.

To build the driver, just run make.

If everything works properly, you'll see the following from the make:

    [jej@ayukawa linuxwacom]$ make
    ...
    Making all in 2.6.9
    make[3]: Entering directory `/home/jej/linuxwacom/src/2.6.9'
        Building linuxwacom drivers for 2.6 kernel.
    make -C /usr/src/linux M=/home/jej/linuxwacom/src/2.6.9
    make[4]: Entering directory `/home/jej/linux-2.6.9'
      LD      /home/jej/linuxwacom/src/2.6.9/built-in.o
      CC [M]  /home/jej/linuxwacom/src/2.6.9/wacom.o
      Building modules, stage 2.
      MODPOST
      CC      /home/jej/linuxwacom/src/2.6.9/wacom.mod.o
      LD [M]  /home/jej/linuxwacom/src/2.6.9/wacom.ko
    make[4]: Leaving directory `/usr/src/linux'
    make[3]: Leaving directory `/home/jej/linuxwacom/src/2.6.9'
    ...

Manually Build the Wacom kernel driver

This part is for those who want to manually build the wacom kernel driver in source tree. If you already followed the steps above, you can move on to next page.

Please backup wacom.c in your kernel tree first. Then copy wacom.c (or wacom_wac.c, wacom_wac.h, wacom_sys.c, and wacom.h if defined) from the related linuxwacom directory to the source tree (if 4 files were copies, you need to add wacom-objs := wacom_sys.o wacom_wac.o to the Makefile under your kernel source input directory) and rebuild the kernel. An example for kernel 2.6.9 is as following:

    [jej@ayukawa linuxwacom]$ cp /usr/src/linux/drivers/usb/input/wacom.c /usr/src/linux/drivers/usb/input/wacom.c.2.6.9 	 
    [jej@ayukawa linuxwacom]$ cp src/2.6.9/wacom.c /usr/src/linux/drivers/usb/input/ 	 
    [jej@ayukawa linuxwacom]$ cd /usr/src/linux 	 
    [jej@ayukawa linux]$ make 	 
    [jej@ayukawa linux]$ su 	 
    [jej@ayukawa linux]#make install 	 
    [jej@ayukawa linux]#make modules_install 	 
    [jej@ayukawa linux]#reboot 	 

Testing If wacom.(k)o Will Load

Before we install the wacom driver, we need to test that it will load properly. We do this by loading the driver manually. We will also need to be root to do this.

WARNING: there is a small chance that this will bomb your kernel, so we run sync to write all the stale buffers to the disk. People using ext3 have little to worry about, but it's always good to be prepared for the worst. At the very least, save your work.

    [root@ayukawa linuxwacom]# sync

From the package's associated kernel directory, we unload any previous modules and load the new one. The following example is from a kernel 2.6.24 system.

    [root@ayukawa linuxwacom]# cd src/2.6.24
    [root@ayukawa 2.6.24]# /sbin/rmmod wacom
    [root@ayukawa 2.6.24]# /sbin/insmod ./wacom.ko

Well, if you did not bomb, then good. And if you did, well, sorry. So far, we have not had any reports of this happening, so please send in yours.

Incidentally, if you run "/sbin/insmod wacom.ko" and happen to be in the wrong directory, the old driver reloads, sometimes without warning. I therefore changed this to read "/sbin/insmod ./wacom.ko" which seems to prevent this from happening. To be certain, you can check the log file for the correct version number.

    [root@ayukawa src]# tail /var/log/messages
    Feb 10 20:34:41 ayukawa kernel: usb.c: registered new driver wacom
    Feb 10 20:34:41 ayukawa kernel: Reporting max 30480, 31680
    Feb 10 20:34:41 ayukawa kernel: wacom.c: Setting tablet report for tablet data
    Feb 10 20:34:41 ayukawa kernel: input0: Wacom Intuos2 12x12 on usb2:3.0
    Feb 10 20:34:41 ayukawa kernel: wacom.c: $1.43-0.8.8-10 Vojtech Pavlik <vojtech@suse.cz>
    Feb 10 20:34:41 ayukawa kernel: wacom.c: USB Wacom tablet driver

The important detail is the version number. A version number like "1.52" is an original kernel version and not from the linuxwacom package. The correct version should also have the -j#.# or -pc#.# portion as well. This is to help differentiate between the stock kernel driver and those available from the Linux Wacom Project.

If you get errors inserting the module, then you may need to reconfigure and build with module versioning disabled. If it loads without a hitch, move on to the next part.

Installing wacom.(k)o

To install or not to install, that is the question. Since the driver is in memory, you can pretty much use it this way throughout the rest of this document. Anywhere you see "modprobe wacom", you'll instead need to "insmod ./wacom.ko". You'll also need to be careful that you are in the package's src directory. If you instead use the less-specific command "insmod wacom.ko" from a directory other than the package's src directory, insmod will load the driver from the kernel modules directory instead. The result is that you'll be using the wrong driver.

Why would you not install the driver? Well, for one, you may be building a driver against a wrong kernel source, and if the system crashes (you get an Oops or things come unglued in other ways), it would be nice to reboot and have the original drivers load instead.

When should I install the driver? When you're comfortable that the driver will not crash your system. If you really know what you're doing, just load the drivers manually like in the previous section Testing If wacom.(k)o Will Load.

On some distributions, Mandriva (a.k.a Mandrake) included, the wacom.ko driver that appears in the kernel modules directory appears to be compressed. If you cannot find wacom.ko using the method below, try locating wacom.ko.gz instead. People who encountered this problem were able to run gzip on the module and copy that instead.

Installing the driver requires knowing where it belongs. A little research will help here. By using the locate command, you can find all copies of the original driver on the computer.

    jej@ayukawa wacom]$ locate wacom.ko
    /lib/modules/2.6.17-1.2157_FC5/kernel/drivers/usb/input/wacom.ko
    /lib/modules/2.6.17-1.2174_FC5/kernel/drivers/usb/input/wacom.ko

    [jej@ayukawa wacom]$ uname -r
    2.6.17-1.2157_FC5

On this computer, there are two kernels installed. uname identifies the currently active kernel as 2.6.17-1.2157_FC5. The correct driver to replace is therefore at /lib/modules/2.6.17-1.2157_FC5/kernel/drivers/usb/input/wacom.ko. You will need to be root to replace this file, and it is a very good idea to make a backup copy.

    [jej@ayukawa wacom]$ su
    [jej@ayukawa root]# cd /lib/modules/2.6.17-1.2157_FC5/kernel/drivers/usb/input
    [jej@ayukawa usb]# cp wacom.ko /home/jej/linuxwacom/src/2.6.16/wacom_old.ko
    [jej@ayukawa usb]# cp /home/jej/linuxwacom/src/2.6.16/wacom.ko wacom.ko

Here, I've saved the original to wacom_old.ko and copied my new driver over it. You should substitute directory names as appropriate.

NOTE: Don't leave the backup copy in the same directory as the original. depmod will treat both as valid drivers, regardless of their names. Copy the original somewhere outside of the kernel module directory to ensure that this does not happen. In at least one case, the backup driver was loaded instead of the new one due to a curious dependency issue.

Finally, it is always a good thing to update the module dependencies. This is where you find out if the module was compiled without kernel module versioning. The following command, even if it generates errors is relatively benign. If it fails, then there is no harm done. It just means that you will have to load modules in the correct order since the system will not be able to guess for you.

    [jej@ayukawa usb]# depmod -e

If you get no errors and no output, everything is fine, and the module was compiled, linked, and installed properly. If you received unresolved symbols like usb_set_idle or printk, then you need to reconfigure with module versioning enabled and recompile.

Loading the wacom Driver

For Kernel 2.6.x, replace wacom.o with wacom.ko where it is used.

If you have installed the driver, now is the time to test whether it will load when needed. If you have not installed it, but are instead using insmod, substitute insmod mydir/src/wacom.o where you see modprobe wacom below. It is important that you use the correct wacom.o file, the one you just built, since insmod may load the old driver if it cannot find the one you have specified.

    [jej@ayukawa usb]# rmmod wacom
    [jej@ayukawa usb]# modprobe usb-uhci      (or usb-ohci)
    [jej@ayukawa usb]# modprobe input
    [jej@ayukawa usb]# modprobe mousedev
    [jej@ayukawa usb]# modprobe wacom         (or insmod mydir/src/wacom.o)
    [jej@ayukawa usb]# modprobe evdev

Check the system log for status messages pertaining to the wacom. Here's a copy of the messages from my version of the driver.

    [jej@ayukawa usb]# grep -i wacom /var/log/messages | tail
    Feb 10 21:23:35 ayukawa kernel: usb.c: registered new driver wacom
    Feb 10 21:23:35 ayukawa kernel: wacom.c: v1.43-0.8.8-10 Vojtech Pavlik <vojtech@suse.cz>
    Feb 10 21:23:35 ayukawa kernel: wacom.c: USB Wacom Graphire and Wacom Intuos tablet driver (MODIFIED)

The original driver was version 1.43. This version number is 1.43-0.8.8-10 so the correct driver was loaded.

Building (usb)hid.ko

In the linuxwacom-0.8.8-10.tar.bz2 file, you will find hid-core.c, which have special exceptions for wacom. This file is not built by default, so you will need to reconfigure the package and run make again.

Note, for kernel 2.6.18 and later, no need to build hid any more. For other kernels, refer to Testing Tablet Detection to see if you need to build hid or not.

You need to configure usbhid as a module under your kernel source tree before configuring linuxwacom.

On some distributions, Mandrake or Mandriva included, the (usb)hid.ko driver that located in the kernel modules directory appears to be compressed. You need to run gzip on the module and copy (usb)hid.ko.gz instead.
    [jej@ayukawa wacom]$./configure --enable-hid --with-kernel=your-kernel-src-dir
    ...
      BUILD OPTIONS:
                  hid.o - yes
    ...

Kernel 2.6.11 and 2.6.12 are in src/2.6.11. Kernels 2.6.16 and 2.6.17 are handled in src/2.6.16. Kernels 2.6.18/19/20/21/22 are in src/2.6.18. All the other kernels are processed in its own src/2.6.x. New 2.6 directories will be created when compatibility issue occurs.

For those who like to build everything from the source tree, please skip the make and install steps below. Scroll down to the end of this page to Manually Build the kernel drivers.

If everything works properly, you'll see the following from the make:

    [jej@ayukawa linuxwacom]$ make
    ...
    Making all in 2.6.9
    make[3]: Entering directory `/home/jej/linuxwacom/src/2.6.9'
        Building linuxwacom drivers for 2.6 kernel.
    make -C /usr/src/linux M=/home/jej/linuxwacom/src/2.6.9
    make[4]: Entering directory `/home/jej/linux-2.6.9'
      LD      /home/jej/linuxwacom/src/2.6.9/built-in.o
      CC [M]  /home/jej/linuxwacom/src/2.6.9/hid-core.o
      CC [M]  /home/jej/linuxwacom/src/2.6.9/hid-input.o
      LD [M]  /home/jej/linuxwacom/src/2.6.9/usbhid.o
      Building modules, stage 2.
      MODPOST
      CC      /home/jej/linuxwacom/src/2.6.9/usbhid.mod.o
      LD [M]  /home/jej/linuxwacom/src/2.6.9/usbhid.ko
    make[4]: Leaving directory `/usr/src/linux'
    ...

Then, use the following steps to install the driver:

    [jej@ayukawa linuxwacom]$su
    [jej@ayukawa linuxwacom]#cd src/2.6.9
    [jej@ayukawa 2.6.9]#cp usbhid.ko /lib/modules/your-kernel-ver/kernel/drivers/usb/input
    [jej@ayukawa 2.6.9]#reboot

Manually Build the kernel drivers

This part is for those who want to manually build the kernel drivers from source tree. If you already followed the steps above, you can move on to next page.

Please backup your related kernel files first then copy the source from the related linuxwacom directory to the source tree and rebuild the kernel. An example for kernel 2.6.9 is as following:

    [jej@ayukawa linuxwacom]$ cp /usr/src/linux/drivers/usb/input/hid-core.c /usr/src/linux/drivers/usb/input/hid-core.c.2.6.9
    [jej@ayukawa linuxwacom]$ cp src/2.6.9/hid-core.c /usr/src/linux/drivers/usb/input/
    [jej@ayukawa linuxwacom]$ cd /usr/src/linux
    [jej@ayukawa linux]$ make
    [jej@ayukawa linux]$ su
    [jej@ayukawa linux]# make install
    [jej@ayukawa linux]# make modules_install
    [jej@ayukawa linux]# reboot

Unknown Tablet?

To determine whether your device is listed in the driver, we need to determine the device identifier. It can be discovered by issuing more /proc/bus/usb/devices:

    [jej@ayukawa linuxwacom]# more /proc/bus/usb/devices
    T:  Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=12  MxCh= 0
    D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
    P:  Vendor=056a ProdID=0044 Rev= 1.15
    S:  Manufacturer=Tablet
    S:  Product=XD-1212-U
    C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=140mA
    I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=02 Driver=wacom
    E:  Ad=81(I) Atr=03(Int.) MxPS=  10 Ivl=5ms

In this case, the tablet identifier is in Vendor=056a ProdID=0044. The model (Product=XD-1212-U) is determined by ProdID; the Intuos2 12x12 is 0x44 for instance.

In the wacom.c (kernel 2.6.9/10) or wacom_wac.c (kernels 2.6.11 or later) file under linuxwacom/src/2.6.x, you will find a table called "wacom_ids". Look for your device identifier. Only the identifiers listed are handled by the wacom driver, so if it is missing, it needs to be added. Also look for routine usb_hid_configure() in hid-core.c if you are running a kernel older than 2.6.18. At the beginning of the routine, we added the following lines to let HID driver ignore all Wacom devices:

    	/* ignore all Wacom devices */
    	if (dev->descriptor.idVendor == USB_VENDOR_ID_WACOM)
    		return NULL;

If you've gotten this far, and still cannot get it to work, email me with your device identifier and as much of an explanation of where things did and did not work as described. I'll see what I can do about at least finding out why it did not work. Then we can go on to solutions.

The next section assumes you have things working up to this point.

Viewing the Raw Data (xxd)

View the raw data from the tablet, by returning to the /dev/input directory and streaming the data directly from the device. Be patient here because this is where a lot of people are getting stuck.

    [root@ayukawa usb]# cd /dev/input
    [root@ayukawa input]# xxd event0
    0000000: e65d c33d 597d 0100 0100 4101 0100 0000  .].=Y}....A.....
    0000010: e65d c33d 5c7d 0100 0400 0000 b701 2800  .].=\}........(.
    0000020: e65d c33d d9bb 0100 0100 4101 0000 0000  .].=......A.....
    0000030: e65d c33d dcbb 0100 0400 0000 b701 2800  .].=..........(.
    (Ctrl-C)

First off, you have to move the mouse or tap the pen to get any output. If the tablet is mapped to event0, a continuously data stream will be displayed while you move the mouse or pen on the tablet. Second, you might not get anything at all. Don't panic. This seems to happen occasionally. If absolutely no output occurs, try event1 and event2. If no output occurs on those ports, reload the drive:

    [jej@sasami root]# /sbin/rmmod wacom
    [jej@sasami root]# /sbin/modprobe wacom       (or /sbin/insmod mydir/src/wacom.o)
    [jej@sasami root]# tail /var/log/messages
    Feb 10 17:31:31 sasami kernel: usb.c: deregistering driver wacom
    Feb 10 17:31:34 sasami kernel: usb.c: registered new driver wacom
    Feb 10 17:31:35 sasami kernel: input0: Wacom Intuos2 12x12 on usb1:2.0
    Feb 10 17:31:35 sasami kernel: wacom.c: v1.43-0.8.8-10 Vojtech Pavlik <vojtech@suse.cz>

The device driver and the tablet occassionally get out of sync with the tablet thinking it's still in HID mode when in fact it should be in "mode 2." By unloading and reloading the driver manually, the initialization code has another opportunity to get it right. Try the xxd /dev/input/event0 again. This time, it should work. If not, send me some email.

Incidentally, if you have a program running that is connected to /dev/input/event0 (like X or wacdump for instance), it is possible that the tablet will not reattach back to the same event. I have seen the wacom reattach to /dev/input/event1 when unloading and reloading the wacom driver with wacdump running for instance. So, try xxd on event1 or event2 if event0 fails.

You should also try running xxd on /dev/input/mouse0. You should get streams of data when the mouse and pen are moved around the surface of the tablet. It is this device that X will look at for mouse movement. Use Ctrl-C to exit xxd.

Viewing Wacom Data (wacdump)

The wacdump program parses and displays raw data from the Linux event subsystem or serial port. It is very handy for verifying that your tablet works without having to hassle with X server. Generally, you must be root to run it unless you've set the permissions on the appropriate device such that you can read them.

Running wacdump

In the case of USB tablets, this program can run simultaneously with X, but it's best if X has not been configured for the tablet yet. X will not share the serial port with wacdump, so serial users should comment out the wacom InputDevice sections from XF86Config (or xorg.conf) before using. Alternatively, you could move your serial tablet to COM2 and try /dev/ttyS1 instead.

The command line usage of wacdump is pretty simple:

    Usage: wacdump [options] device
    Options:
      -h, --help               - usage
      -c, --class device_cls   - use specified class (see below)
      -f, --force device_name  - use specified device (see below)
      -l, --list               - list all supported devices
      -v, --verbose            - increase log output; multiple OK
      -V, --version            - display version number
      --logfile log_file       - output log to file

    Example devices:
      /dev/input/event0        - usb tablet device
      /dev/ttyS0               - serial tablet on com1
      /dev/ttyUSB0             - serial tablet on USB adapter

    Supported device classes:
      serial, usb
    Supported device names:
      serial: art, art2, dig, dig2, pp, gr, pl, int, int2, c100
      usb: pp, gr, gr2, int, int2, pl, vol

Older versions of wacdump assumed the device to be /dev/input/event0. This is now deprecated. You should instead specify which device to use on the command line directly. If you get an end-of-file error or the device does not exist, then the wacom may be attached to a different event. Serial users may experience a timeout error which indicates that either the tablet is not responding or X server has it open. Access denied errors probably indicate that you are not root. If you get different types of errors, let me know so we can get them documented.

Serial users are advised that now is a good time to plug in your tablet, if you haven't already.

Let's run wacdump. Here are some command line examples:

    [jej@ayukawa src]$ ./wacdump /dev/input/event0        # typical USB tablet
    [jej@ayukawa src]$ ./wacdump /dev/input/event1        # USB tablet on event1

When you run wacdump, it will attempt to initialize and query the tablet. For a number of reasons, it may not display anything immediately, but if you place a mouse or pen near the surface, the screen should update. You will then be presented with a screen similar to the following:

    wacdump v0.4.0
    MODEL=Wacom Intuos2 12x12               ROM=1.1-5
    CLS=USB  VNDR=Wacom  DEV=Intuos2  SUB=XD-1212-U

    TOOLTYPE=NONE                             SERIAL=0x00000000
     IN_PROX=+00000 (+00000 .. +00000)        BUTTON=+00000 (+00000 .. +00000)
       POS_X=+00000 (+00000 .. +30480)         POS_Y=+00000 (+00000 .. +31680)
       ROT_Z=+00000 (-00900 .. +00899)      DISTANCE=+00000 (+00000 .. +00015)
    PRESSURE=+00000 (+00000 .. +01023)        TILT_X=+00000 (+00000 .. +00127)
      TILT_Y=+00000 (+00000 .. +00127)      ABSWHEEL=+00000 (+00000 .. +01023)
    RELWHEEL=+00000 (-00001 .. +00001)      THROTTLE=+00000 (-01023 .. +01023)

        LEFT=             MIDDLE=              RIGHT=              EXTRA=
        SIDE=              TOUCH=             STYLUS=            STYLUS2=

The top portion identifies the tablet, and unless you specifically override the device type with the -f option, it should be auto-detected from the tablet directly. In this case, the model is XD-1212-U, a USB Intuos2 12x12.

The next section describes the dynamic attributes of the tablet, including the current position of the pointer, the type of tool in proximity to the surface, its pressure, and tilt. Some tablets (Protocol V tablets, such as Intuos 1, 2, and 3 as well as Cintiq 21UX) provide serial numbers for their tools. When a button is pressed, the button heading will change to something like "STYLUS=DOWN".

Some tablet tools report wheel movements as single increments forward and reverse, while others provide absolute positions. The 4D mouse has a throttle instead of a wheel. All three cases are reported independently.

Different tablets will have different options. Here is the lowly ArtPadII for comparison.

    wacdump v0.4.0
    MODEL=Wacom ArtPadII 4x5                ROM=1.3-6
    CLS=Serial  VNDR=Wacom  DEV=ArtPadII  SUB=KT-0405-R

    TOOLTYPE=NONE                            IN_PROX=+00000 (+00000 .. +00000)
      BUTTON=+00000 (+00000 .. +00000)         POS_X=+00000 (+00000 .. +06400)
       POS_Y=+00000 (+00000 .. +04800)      PRESSURE=+00000 (+00000 .. +00255)

        LEFT=             MIDDLE=              RIGHT=              EXTRA=
        SIDE=              TOUCH=             STYLUS=            STYLUS2=

Notice that this tablet has no tilt, and the pressure range is considerably reduced. This version of wacdump does not distinguish between tablets with mice, so the left, right, and middle buttons are present, even though the tablet itself has no mouse.

Configuring X11

Two steps must be completed to get X to recognize your tablet. First, you need to add some lines to XF86Config/xorg.conf to inform X of the tablet's existence. Second, you need to update the XInput driver that pertains to the tablet since the one that ships with XFree86/Xorg is not very functional. Neither driver holds a candle to the windows driver though, so you'll have to take what you get for the time being. Updates to the XFree86/Xorg driver are available in the stable and beta releases on the Downloading the Code page.

Adding the InputDevices

The X Window system identifies the stylus (tip and side switches of your pen), eraser (the other end of your pen if it is clickable), cursor (your Wacom mouse), and pad (buttons, strips and rings on your tablet if your tablet has any) as XInput devices. Most settings, such as stylus pressure level and system cursor movement mode can be done in /etc/X11/XF86Config or /etc/X11/xorg.conf configuration file before X server starts or live through command-line xsetwacom or the simple GUI control panel wacomcpl while Wacom driver is running.

However, adding the InputDevice sections to your XF86Config/ xorg.conf file for Wacom devices is required. You should add these devices to the ServerLayout section of your XF86Config/xorg.conf file too.

We assume you are running Either XFree86 4.2 or later Or Xorg. On some distributions, this file is called XF86Config-4. Notice that the serial and USB configurations are different, so only include the appropriate lines. The default serial devices are given. For serial Tablet PCs, options "ForceDevice" should be included. You should also change the device (e.g. ttyS0 or /dev/input/wacom) to the correct one for your tablet. Tablet PC and Cintiq/PL/DTF models don't support cursor type. All the new driver options are listed in the manual page below.

    Section "InputDevice"
      Driver        "wacom"
      Identifier    "stylus"
      Option        "Device"        "/dev/ttyS0"          # SERIAL ONLY
      Option        "Device"        "/dev/input/wacom"    # USB ONLY
      Option        "Type"          "stylus"
      Option        "USB"           "on"                  # USB ONLY
      Option        "ForceDevice"   "ISDV4"               # Serial Tablet PC ONLY
    EndSection

    Section "InputDevice"
      Driver        "wacom"
      Identifier    "eraser"
      Option        "Device"        "/dev/ttyS0"          # SERIAL ONLY
      Option        "Device"        "/dev/input/wacom"    # USB ONLY
      Option        "Type"          "eraser"
      Option        "USB"           "on"                  # USB ONLY
      Option        "ForceDevice"   "ISDV4"               # Serial Tablet PC ONLY
    EndSection

    Section "InputDevice"
      Driver        "wacom"
      Identifier    "cursor"                              # Wacom tablet mouse
      Option        "Device"        "/dev/ttyS0"          # SERIAL ONLY
      Option        "Device"        "/dev/input/wacom"    # USB ONLY
      Option        "Type"          "cursor"
      Option        "USB"           "on"                  # USB ONLY
      Option        "ForceDevice"   "ISDV4"               # Serial Tablet PC ONLY
    EndSection

    # This section is for Intuos3, Intuos4, CintiqV5, Graphire4, or Bamboo without touch
    Section "InputDevice"
      Driver        "wacom"
      Identifier    "pad"                                 # Tablet buttons
      Option        "Device"        "/dev/ttyS0"          # SERIAL ONLY
      Option        "Device"        "/dev/input/wacom"    # USB ONLY
      Option        "Type"          "pad"
      Option        "USB"           "on"                  # USB ONLY
    EndSection

    # This section is for USB BambooPT with touch
    Section "InputDevice"
      Driver        "wacom"
      Identifier    "pad"                                 # Tablet buttons
      Option        "Device"        "/dev/input/wacom-touch"    # USB ONLY
      Option        "Type"          "pad"
      Option        "USB"           "on"                  # USB ONLY
    EndSection

    # This section is for TabletPCs & BambooPTs that support touch
    Section "InputDevice"
      Driver        "wacom"
      Identifier    "touch"
      Option        "Device"        "/dev/ttyS0"          # SERIAL ONLY
      Option        "Device"        "/dev/input/wacom-touch"    # USB ONLY
      Option        "Type"          "touch"
      Option        "ForceDevice"   "ISDV4"               # Serial Tablet PC ONLY
      Option        "USB"           "on"                  # USB ONLY
    EndSection

The above four sections identify the stylus, eraser, cursor, touch, and pad devices to XInput. Notice that all four reference the same device /dev/ttyS0 or /dev/input/wacom depending on whether its a serial or USB tablet. Please refer to Testing Tablet Detection and Updated wacom.c pages to see which port your tablet is actually mapped to.

The configuration options listed by your system's man page may be way out of date. Below is an updated wacom man page which will be installed by default when you issue make install.

    WACOM(4)                                                              WACOM(4)

    NAME
           wacom - Wacom input driver

    SYNOPSIS
           Section "InputDevice"
             Identifier "idevname"
             Driver "wacom"
             Option "Device"   "devpath"
             ...
           EndSection

    DESCRIPTION
           wacom is an X input driver for Wacom devices.

           The  wacom  driver functions as a pointer input device, and may be used
           as the X server's core pointer.

    SUPPORTED HARDWARE
           This driver supports the Wacom IV and Wacom V protocols. Serial tablets
           only  need  this driver.  USB tablet support is available on some Linux
           platforms.  USB tablets needs  wacom Linux  kernel driver  being loaded 
           before this  driver starts.  Please check linuxwacom.sf.net  for latest 
           updates of Wacom X and kernel drivers.

    CONFIGURATION DETAILS
           Please refer to xorg.conf(5x) for general configuration details and for
           options  that can be used  with all input  drivers.  This  section only
           covers configuration details specific to this driver.

           Multiple  instances  of the Wacom devices can cohabit. It can be useful
           to define multiple devices with different  active  zones.  Each  device
           supports the following entries:

                   Option "Type" "stylus"|"eraser"|"cursor"|"touch"|"pad"
                       sets the type of tool the device represents. This option is
                       mandatory.  The core options,  such as  "SendCoreEvents" or
                       "AlwaysCore",  are unnecessary in Gimp if you don't need to
                       move system cursor outside of Gimp  drawing area.  "pad" is 
                       for Intuos 3 and  CintiqV5  ExpressKeys and menu strips, or 
                       Graphire 4 and Bamboo  tablet buttons and wheel/ring. It is
                       required for Intuos3,  CintiqV5,  Graphire 4,  or Bamboo if 
                       you want to use keystroke features. "pad" is  reported as a  
                       second tool in the  driver.  "touch" is for the tablet with 
                       touch support.  Right now only a few  Tablet PCs  have this
                       feature.

                   Option "Device" "path"
                       sets the path to the special file which  represents  serial
                       line  where  the tablet is plugged.  You have to specify it
                       for each subsection with the same value if you want to have
                       multiple  devices  with  the  same  tablet.  This option is
                       mandatory.

                   Option "USB" "on"
                       tells the driver to dialog with the  tablet  the  USB  way.
                       This option is mandatory for USB tablets.

                   Option "ForceDevice" "ISDV4"
                       tells the  driver to  dialog  with the  tablet  the  serial
                       Tablet PC way.  It is a special  Wacom IV protocol,  called
                       ISDV4  protocol. This option is mandatory for serial Tablet 
                       PCs only.

                   Option "DeviceName" "name"
                       sets the name of the X device.

                   Option "Suppress" "number"
                       sets  the  position  increment  under which not to transmit
                       coordinates.  This entry must  be  specified  only  in  the
                       first Wacom subsection if you have multiple devices for one
                       tablet.  The default value is 2.  If you don't specify this
                       entry or your  value is  less  than  the  default  vaule or 
                       greater  than 100,  the  default  value  will be  used.  To 
                       disable suppression, the entry should be specified as 0.
                       When  suppress is defined,  an event will be sent only when
                       at least one of the following conditions is met:

                       the  change  between  the  current  X  coordinate  and  the
                       previous one is greater than suppress;

                       the  change  between  the  current  Y  coordinate  and  the
                       previous one is greater than suppress;

                       the change between the  current pressure  and the  previous
                       one is greater than suppress;

                       the  change  between the  current  degree  of  rotation and
                       the previous one of the transducer is greater than suppress;

                       the change between the current absolute wheel value and the
                       previous one is equal to or greater than suppress;

                       the change  between the current tilt value and the previous 
                       one  is  equal to or  greater  than  suppress  (if  tilt is
                       supported);

                       relative wheel value has changed;

                       button value has changed;

                       proximity has changed.		   

                   Option "Mode" "Relative"|"Absolute"
                       sets the  mode of the device.  The default value for stylus
                       and  eraser is Absolute;  cursor is  Relative;  pad mode is
                       decided  according to its core  option due to its nature of
                       not moving system cursor:  Relative if it is a core device;
                       Absolute, otherwise.

                   Option "TopX" "number"
                       X  coordinate  of  the  top  corner  of  the  active  zone.
                       Default to 0. 

                   Option "TopY" "number"
                       Y  coordinate  of  the  top  corner  of  the  active  zone. 
                       Default to 0.

                   Option "BottomX" "number"
                       X  coordinate of  the bottom  corner  of the  active  zone.
                       Default to width of the tablet.

                   Option "BottomY" "number"
                       Y  coordinate  of the  bottom  corner of  the active  zone.
                       Default to height of the tablet.

                   Option "ButtonsOnly" "on"|"off"
                       disables the device's motion events.  Default to off.

                   Option "ButtonM" "AC"
                       reports an action AC  when button M is pressed,  where M is
                       one of the device supported button numbers,  it can be 1 to
                       32. The default action reported to Xinput is mouse button M   
                       click.  To ignore the button click, i.e., to not report any
                       button click event to Xinput,  use "0" or "button 0".  

                   Option "TPCButton" "on"|"off"
                       enables the  stylus  buttons as  Tablet PC  buttons,  i.e.,
                       reports  stylus button event only  when its tip is pressed. 
                       Default to "on" for Tablet PCs; "off" for all other models.

                   Option "Touch" "on"|"off"
                       enables  the touch  device  for  models that  support touch
                       feature. Default to "on" for tablets with touch; "off"  for
                       all other models.

                   Option "Gesture" "on"|"off"
                       enables the  touch  gestures for  tablets that  support two
                       finger   touch.   Three   gesture   modes  are   supported:
                       Add-a-Finger,  Scroll,  and  Zoom.  Once  the  driver is in
                       gesture  mode, it stays in the same mode until both fingers
                       leave the tablet.  When second  finger taps on the  tablet,
                       Add-a-Finger  mode is in  and a  right-click  event will be
                       issued  upon the  leaving of the  second  finger;  When two
                       fingers moving in the same direction and parallel vertically
                       or  horizontally,  Scroll  mode  is  in  and a  vertical or
                       horizontal scroll event will be  issued;  When both fingers
                       stay on the tablet and at least one finger  moves away from
                       its  initial  position  or both  fingers move in  different
                       directions, Zoom mode is in. Default to "on" for Tablet PCs
                       that support two finger touch;  "off" for all other models.
                       However, this option can be turned on for those tablets that
                       support two finger touch.

                   Option "ZoomDistance" "integer"
                       minimum  distance  required before starting a zoom  gesture
                       (default is 50).

                   Option "ScrollDistance" "integer"
                       minimum  finger  motion  distance  required for  starting a
                       scroll gesture (default is 20).

                   Option "TapTime" "integer"
                       maximum time between taps required for a right  mouse click
                       (default is 250 ms).

                   Option "Speed" "Rspeed"
                       sets the cursor's  relative  movement speed to Rspeed.  The
                       default value is 1.0.  A Rspeed greater than 1.0 will speed
                       up the cursor's  relative movement.  A Rspeed less than 1.0 
                       but greater  than 0 will slow  down the  cursor's  relative 
                       movement. A Rspeed too close to 0 is not recommanded.

                   Option "Twinview" "horizontal"|"vertical"|"leftof"|"aboveof"
                       |"xinerama"|"none"
                       sets the  orientation of  TwinView to map the tablet to one
                       screen  and to be able to  move the screen  cursor from one
                       screen  to the  other  when tool  reaches  the  edge of the
                       tablet.  The cursor can be constrained in a specific screen 
                       if  "ScreenNo"  option is  added.   If you  want to map the
                       tablet  to the  whole  desktop,   you  should  NOT add this
                       option. The default is "none". Note: due to historic reason,
                       "horizontal"   represents  the   "RightOf"  and  "vertical" 
                       represents the "BelowOf" in acutal TwinView setup.

                   Option "TVResolution" "res0,res1"
                       specifies  different  resolutions  for the  two  screens in
                       TwinView setup.  For example, if the resolution of screen 0
                       (res0) is 1024x768 and screen 1 (res1) is 1280x1024, the 
                       option will be set to:
                                Option "TVResolution" "1024x768,1280x1024"

                       This option is used  only when TwinView option is not none.
    		   It is  unnecessary to add this  option if  your screens are
                       displaying in the same resolutions.

                   Option "ScreenNo" "n"
                       In a multi-monitor environment, specifies the screen number
                       in  which  the  cursor can  move.  Here  n  starts from  0, 
                       which indicates the first screen.

                   Option "MMonitor" "on"|"off"
                       turns  on/off  across  monitor  movement on a  non-TwinView
                       multi-monitor desktop. A system mouse or utility program is
                       needed to change  screens when  MMonitor is set to off. The 
                       default is "on".

                   Option "Rotate" "CW"|"CCW"|"HALF"|"NONE"
                       rotates  the tablet  orientation  counterclockwise (CCW) or 
                       clockwise (CW) or 180 degrees (HALF).  If you have specific 
                       tablet mappings, i.e.  TopX/Y or  BottomX/Y  were set,  the  
                       mapping  will be  applied before rotation.  The  default is 
                       "NONE".

                   Option "PressCurve" "x1,y1,x2,y2"
                       sets pressure curve by control  points  x1, y1, x2, and y2.
                       Their values are in range from 0..100. The input for 

                             linear curve (default) is "0,0,100,100";
                             slightly depressed curve (firmer) might be "5,0,100,95";
                             slightly raised curve (softer) might be "0,5,95,100".

                   Option "KeepShape" "on"
                       When  this  option  is  enabled,  the  active  zone  begins
                       according to TopX and TopY.  The bottom corner is  adjusted 
                       to  keep the ratio width/height of the active zone the same 
                       as the screen while maximizing the area  described by TopX, 
                       TopY, BottomX, BottomY.

                   Option "DebugLevel" "number"
                       sets the level of debugging info  reported for the  defined
                       device.  There  are  12  levels  in use,  specified  by the
                       integers  between 1 and 12.  Once it is  defined,  all  the
                       debug  messages  with a  level  less  than or  equal to the
                       "number"  will  be  logged  into  /etc/X11/XFree86.0.log or
                       /etc/X11/Xorg.0.log.

                   Option "CommonDBG" "number"
                       sets the level of  debugging info for all  devices  defined
                       for the same tablet.  There are 12 levels in use, specified
                       by the integers between 1 and 12.  Once it is defined,  all 
                       the debug  messages with a  level less than or equal to the
                       "number"  will  be  logged  into  /etc/X11/XFree86.0.log or 
                       /etc/X11/Xorg.0.log.

                   Option "CursorProx" "number"
                       sets  the  max  distance  from  tablet  to  stop  reporting
                       movement  for  cursor in relative mode.  Default for Intuos  
                       series is 10, Graphire series (including Volitos) is 42.

                   Option "Serial" "number"
                       sets the serial number associated with the physical device.
                       This allows to have multiple devices of the same type (i.e.
                       multiple pens). This option is only available  on  wacom  V
                       devices (Intuos series and Cintiq 21UX). To see the serial 
                       number associated with a device, run xsetwacom.

                   Option "Threshold" "number"
                       sets  the  pressure  threshold  used to generate a button 1
                       events of stylus. The default is MaxPressure*3/50.

    SEE ALSO
           Xorg(1x), xorg.conf(5x), xorgconfig(1x), Xserver(1x), X(7).

    AUTHORS
           Frederic Lepied <lepied@xfree86.org>, Ping  Cheng <pingc@wacom.com>,
           John E. Joganic <jej@j�arkadia.com>, Magnus Vigerlöf <Magnus.Vigerlof@ipbo.se>,
           Peter Hutterer <peter.hutterer@redhat.com >

    X Version 11                      linuxwacom 0.8.4                     WACOM(4)

Mouse1 (for some 2.6 systems)

This section largely deals with interaction problems between the mouse1 device, PS/2 mouse, and USB tablets. Serial users can ignore this part.

Starting from linuxwacom-0.7.1, this is not a problem for most kernel 2.6 systems. If you use kernel 2.6 and a driver newer than 0.7.1, you may ignore this page. However, it has been reported that on some vendors 2.6 systems, the information detailed on this page still applies. So, if you tried all the other steps and the tablet still has issues, you may want to apply this page to eliminate the /dev/input/mice issue.

If you have a USB mouse or PS/2 mouse and are also using a USB tablet, there are two solutions here for you: you may either change your mouse1 or PS/2 InputDevice section to something other than /dev/input/mice or build mousedev.o from this project for your kernel, which will ignore Wacom tablets as USB mice. The wacom tablet appears as a mouse to the Linux kernel, and consequently, the "mice" device combines the input from all your mice, including the tablet. This will not give you the behavior you want. A better choice is to specify the precise USB device or PS/2 mouse from which you want to receive mouse events, namely /dev/input/mouse0 or /dev/input/mouse1 or /dev/psaux.

If you do not have a USB mouse, adding the Mouse1 device is probably not something you want to do. Despite this, Redhat's Anaconda program will do it for you if you boot the machine with the tablet plugged in. You'll need to be careful about this.

When you use the mouse1 input device, the data flows from the USB wacom kernel driver, through the event subsystem, down into the mousedev driver, out the /dev/input/mouse0 device, and finally into the XInput mouse driver. You effectively lose all your absolute positioning information because the mousedev driver converts it into relative data. Additionally, the XFree86 wacom driver does not get control of the cursor because mouse1 is providing those events.

Therefore, if you have a Mouse1 section, leave it. Redhat 8.0 at least, expects it to be there; however, if you do not have a USB mouse and you are using a USB tablet, you will not be using this section, so make certain that it is commented out of the ServerLayout section covered next.

There is one exception however. If you have no other mouse device in your ServerLayout section, do not remove Mouse1. XFree86 will not start without at least one core pointer, and the tablet does not count unless it is specifically identified as a "CorePointer" rather than merely "SendCoreEvents."

ServerLayout

The ServerLayout section describes what devices the X server will use. Modify the ServerLayout section to reflect the new devices. Make certain to comment out the Mouse1 device if determined necessary from the previous page.

    Section "ServerLayout"
      Identifier     "Default Layout"
      Screen 0 "Screen0"   0 0
      InputDevice    "Mouse0"    "CorePointer"
      InputDevice    "Keyboard0" "CoreKeyboard"
      InputDevice    "stylus"    "SendCoreEvents"
      InputDevice    "eraser"    "SendCoreEvents"
      InputDevice    "cursor"    "SendCoreEvents"    # For non-LCD tablets only
      InputDevice    "touch"     "SendCoreEvents"    # For TabletPCs and BambooPTs that support touch
      InputDevice    "pad"   # For Intuos3/Intuos4/CintiqV5/Graphire4/Bamboo/BambooPT tablets
    EndSection

This section determines which devices are actually used by the server. In the case above, the cursor, stylus, eraser, touch, and pad devices are selected. At present, this is the correct configuration for proper operation of the tablet whether you are using the beta package or the production package.

You can configure one of your Wacom devices as a Core Pointer if you don't have a regular mouse on your system. However, you lose the Wacom specific functions, such as pressure sensitivity and absolute mode when you use that device.

You have completed the XF86Config/xorg.conf file changes. But aware that if you reboot your computer with the Wacom plugged in and Redhat's Anaconda program notices, it may treat the tablet as a USB mouse and reconfigure this file incorrectly. You may need to go back and check the file to ensure that everything is still correct afterwards. Rebooting with the device detached is not recommended since X server doesn't properly support hotplugging yet. My recommendation is to tell Anaconda to ignore the tablet until the device detection works properly.

Restart X

Finally, restart X. You may wish to do this from runlevel 3 for testing purposes.

    [root@ayukawa root]# init 3
    ...processes starting and stopping...
    [root@ayukawa root]# startx

If the X server dies, you can always back-out the changes to the XF86Config or xorg.conf file and try again. But first, look at the X log file (XFree86.0.log for XFree86 and Xorg.0.log for Xorg) for clues. You might want to do this even if everything works correctly. When things are running right, the following lines appear in my log file.

    [root@ayukawa root]# grep -i wacom /var/log/XFree86.0.log
    (II) LoadModule: "wacom"
    (II) Loading /usr/X11R6/lib/modules/input/wacom_drv.o
    (II) Module wacom: vendor="The XFree86 Project"
    (II) Wacom driver level: 47-0.8.8-10 $
    (II) XINPUT: Adding extended input device "eraser" (type: Wacom Eraser)
    (II) XINPUT: Adding extended input device "stylus" (type: Wacom Stylus)
    (II) XINPUT: Adding extended input device "cursor" (type: Wacom Cursor)
    (==) Wacom Kernel Input device name: "Wacom Intuos2 12x12"
    (==) Wacom tablet maximum X=30480 maximum Y=30480 X resolution=0 Y resolution=0
    suppress=0
    (==) Wacom Cursor top X=0 top Y=0 bottom X=30480 bottom Y=30480
    (==) Wacom Stylus top X=0 top Y=0 bottom X=30480 bottom Y=30480
    (==) Wacom Eraser top X=0 top Y=0 bottom X=30480 bottom Y=30480

Notice the driver version 47-0.8.8-10 above. This is the new stable wacom_drv.o driver. The beta driver is currently 47-0.8.7-2.

First things first, you should lift the mouse off the tablet and place it back down. This seems to help reset things internally. When you replace the mouse, the cursor should jump to that portion of the screen. If everything is working correctly, the mouse should work in absolute mode with the four corners of the tablet corresponding with the four corners of the screen. If the cursor stops short of an edge, then the kernel driver limits are probably incorrect. Please let me know so that I can update the driver.

Next, remove the mouse and try using the eraser end of the stylus. Hovering over the surface of the tablet should move the cursor. Touching the eraser tip to the surface should generate a click. If you invert the pen and use the stylus tip, you should get a similar result. If the pen tip generates spurious touch events, you will need to increase the threshold value in the InputDevice section. Wacdump is useful for determining the appropriate value.

Lastly, if you would like more logging, the parameter "DebugLevel" (for individual tools) and "CommonDBG" (for all tools associated with the same tablet) can be set to values between 1 and 12, with 12 being way too much, and 1 being fairly useful.

If X server failed to start and you are running the prebuilt wacom_drv.(s)o, you may have to go back to Configuring the Package page to build the driver on your system.

Check the Pointer Status

You can check the XInput pointer status by using xsetpointer as below. The man page states that calling xsetpointer with the name of a particular device will set it as the primary pointing device.

    [root@ayukawa log]# xsetpointer -l
    "eraser"        [XExtensionDevice]
    "stylus"        [XExtensionDevice]
    "cursor"        [XExtensionDevice]
    "Mouse0"        [XPointer]
    "keyboard"      [XKeyboard]

Hotplugging the device

Wacom X server driver, wacom_drv.so, has enabled the hotplugging feature since version 0.8.5.

If you are seriously considering hotplugging a Wacom device on a Linux system, an Xorg server version 1.6 or later is highly recommended. With some luck, you may make it work on a server newer than 1.4.

This may lead you think that hotplugging is a pure Xorg feature. No, it is not. It requires HAL (Hardware Abstraction Layer) daemon (for Xorg servers 1.7 and older) or the udev-hotplug subsystem (for Xorg servers 1.8 and later) being installed.

To hotplug a Wacom device, you need to install an extra script, wacom.fdi, on your system. On most distros, the file should have been pre-installed for you:

On Xorg servers older than 1.7

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!-- this is probably a bit imprecise -->
    <deviceinfo version="0.2">
      <device>
        <match key="info.category" contains="input">
          <match key="info.product" contains_outof="Wacom">
    	<merge key="input.x11_driver" type="string">wacom</merge>
    	<merge key="input.x11_options.Type" type="string">stylus</merge>
    	<append key="info.callouts.add" type="strlist">hal-setup-wacom</append>
    	<append key="wacom.types" type="strlist">eraser</append>
    	<append key="wacom.types" type="strlist">cursor</append>
    	<append key="wacom.types" type="strlist">pad</append>
    	<append key="wacom.types" type="strlist">touch</append>
          </match>
        </match>
        <match key="info.capabilities" contains="serial">
          <match key="@info.parent:pnp.id" contains_outof="WACf;FUJ02e5;FUJ02e7;FUJ02e9">
    	<append key="info.capabilities" type="strlist">input</append>
    	<merge key="input.x11_driver" type="string">wacom</merge>
    	<merge key="input.x11_options.Type" type="string">stylus</merge>
    	<merge key="input.x11_options.ForceDevice" type="string">ISDV4</merge>
    	<merge key="input.device" type="copy_property">serial.device</merge>
    	<append key="info.callouts.add" type="strlist">hal-setup-wacom</append>
    	<append key="wacom.types" type="strlist">eraser</append>
            <match key="@info.parent:pnp.id" contains_outof="WACf008;WACf009;WACf00A;WACf00B;WACf00C;WACf00D;WACf00E;WACf010;FUJ02e7;FUJ02
    e9">
    	  <!-- Serial tablets with touch capabilities -->
    	  <append key="wacom.types" type="strlist">touch</append>
    	</match>
          </match>
        </match>
      </device>
      <!-- Match the Wacom Bluetooth A5 pen tablet -->
      <device>
        <match key="info.capabilities" contains="input.mouse">
          <match key="info.product" contains="WACOM">
            <match key="info.product" contains="Tablet">
              <merge key="input.x11_driver" type="string">wacom</merge>
              <merge key="input.x11_options.Type" type="string">stylus</merge>
    	  <append key="info.callouts.add" type="strlist">hal-setup-wacom</append>
    	  <append key="wacom.types" type="strlist">eraser</append>
    	  <append key="wacom.types" type="strlist">cursor</append>
    	  <append key="wacom.types" type="strlist">pad</append>
            </match>
          </match>
        </match>
      </device>
    </deviceinfo>

On Xorg servers 1.7

    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!-- this is probably a bit imprecise -->
    <deviceinfo version="0.2">
      <device>
        <match key="info.category" contains="input">
          <match key="info.product" contains_outof="Wacom;WACOM">
    	<merge key="input.x11_driver" type="string">wacom</merge>
          </match>
        </match>
        <match key="info.capabilities" contains="serial">
          <match key="@info.parent:pnp.id" contains_outof="WACf;FUJ02e5;FUJ02e7">
    	<append key="info.capabilities" type="strlist">input</append>
    	<merge key="input.x11_driver" type="string">wacom</merge>
    	<merge key="input.x11_options.ForceDevice" type="string">ISDV4</merge>
    	<merge key="input.device" type="copy_property">serial.device</merge>
          </match>
        </match>
      </device>
    </deviceinfo>

Note: If a Wacom device is defined in /etc/X11/xorg.conf, the same Wacom device that is also defined in the wacom.fdi will be ignored.

If you are running an Xorg server older than 1.4 or even an XFree86 server, you can try the following workaround to bring the device live without restarting your X server or the whole system:

Switch virtual terminal from your current disply to another one then back. The following method works on most distros:

pressing "Ctrl Alt F1", all three keys, the same time, then "Ctrl Alt F7".

Edgar Fehlinger and Lars Michelsen have provided a solution on RHEL 5.3. We are very grateful that they have gave us the permission to share it here:

    First we had to add the following lines to the Xorg.conf ServerLayout section:

     Option "AutoAddDevices" "on"
     Option "AutoEnableDevices" "on"
     Option "AllowEmptyInput" "on"

    After restarting the X server the following procedure brought the display back again:

     - Turn off display
     - Turn on display
     - Switch virtual terminal to 1 and back (CTRL+ALT+1 and then CTRL+ALT+2
     while the virtual terminal 2 has the X server running)

    After switching the terminals, the display can be used as usual.

    Having this working we added the virtual terminal switch to udev 
    /etc/udev/rules.d/60-wacom.rules to perform it automatically everytime the display 
    is switched on:

     --------------------------------------------------------------------------------
     # First set type
     BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="00", ENV{WACOM_TYPE}="stylus"
     BUS=="usb", KERNEL=="event*", SYSFS{bInterfaceNumber}=="01", ENV{WACOM_TYPE}="touch"
     # Then fire the vt switch
     BUS=="usb", KERNEL=="event*", SYSFS{idVendor}=="056a",
     ENV{WACOM_TYPE}!="touch", RUN+="/usr/bin/wacom-display-recalibrate"
     --------------------------------------------------------------------------------

    And this is the /usr/bin/wacom-display-recalibrate script which only runs the vt 
    toggle when the currently active vt is the number 2.

     --------------------------------------------------------------------------------
     #!/bin/bash
     # +------------------------------------------------------------------+
     # | wacom-display-recalibrate                                        |
     # |             Copyright (c) 2010 - Mathias Kettner GmbH            |
     # |                                                                  |
     # | Author: Lars Michelsen <lm@mathias-kettner.de>                   |
     # +------------------------------------------------------------------+
     #
     # Sylo is free software;  you can redistribute it  and/or modify
     # it under the terms of the GNU General Public License as published by
     # the Free Software Foundation in version 2. Sylo is distributed
     # in the hope that it will be useful,  but WITHOUT ANY WARRANTY; with-
     # out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A
     # PARTICULAR PURPOSE. See the  GNU General Public License for more de-
     # ails.  You should have  received  a copy of the  GNU  General Public
     # License along with GNU Make; see the file  COPYING.  If  not,  write
     # to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,
     # Boston, MA 02110-1301 USA.

     # Only switch the terminal when the currently active terminal is the
     target
     # terminal. This prevents display switches while booting.

     # The "2" might be replaced if X runs on another virtual terminal.
     VT=2

     if [ $(/usr/bin/fgconsole) -eq $VT ]; then
        /usr/bin/chvt 1
        /usr/bin/chvt $VT
        exit 0
     else
        exit 1
     fi
     --------------------------------------------------------------------------------
RHEL 4.6+ and 5.1+ have included a workaround, called wdaemon. However, it doesn't work out of the box. You need to configure the daemon and turn it on to make it work. Please follow the guideline provided by Aristeu Rozanski, the author of the daemon, at README.txt for details.

Viewing XInput Events (xidump)

The xidump program is similar to wacdump, but it parses and displays event data from the XFree86 XInput extension rather than from the tablet itself. This is useful for seeing what programs like gimp and gsumi are receiving from X.

Presently, xidump will display proximity and motion events for the stylus, cursor, eraser, and pad input devices. xidump supports different display modes with "curses" and "raw" modes already implemented and a GTK-based graphical mode in the works. The curses mode is probably the most useful in terms of verifying that the tablet is functioning correctly in the XFree environment; however, the raw mode has the additional benefit of being able to verify the order, timing, and history of events.

Since xidump uses the same XInput interface that gimp and gsumi use to get tablet data, the values displayed in xidump should be identical to what they are receiving. If you are having trouble with pressure in gimp, chances are that xidump will demonstrate the same problem. xidump does not require root access to use.

Running xidump

xidump takes one argument, the input device specified in your XF86Config/xorg.conf file. It is the Identifier entry in the InputDevice section. Normally they are either stylus, cursor, eraser, touch, or pad. You can get a complete list by running xidump with the list option '-l'. xidump has the additional feature of dumping all the device capabilities by specifying the verbose option '-v'. Both are demonstrated below.

Note: The device identifiers (input_device) are case sensitive.

    [jej@ayukawa src]$ ./xidump -l
    eraser                         extension
    stylus                         extension
    cursor                         extension
    Mouse0                         disabled
    keyboard                       keyboard

    [jej@ayukawa src]$ ./xidump -l -v eraser
    eraser                         extension
        key: min=8, max=39, num=32
        btn: num=1
        val: axes=6 mode=abs buf=0
        axis[0]: res=2540, min=0, max=30480
        axis[1]: res=2540, min=0, max=30480
        axis[2]: res=1, min=0, max=1023
        axis[3]: res=1, min=-64, max=63
        axis[4]: res=1, min=-64, max=63
        axis[5]: res=1, min=0, max=1023

In the first dump, we see the eraser, stylus, and cursor with the additional Mouse0 pointer and keyboard. Only the first three are "extension" devices. Using xidump on the keyboard or mouse pointer will generate an error since neither are XInput devices.

The second dump shows the capabilities of the eraser device including the number of keys (32), buttons (1), and axes (6). It also shows the mode to be absolute. In order, the axes are: x, y, pressure, tilt-x, tilt-y, and wheel. When the cursor is used, axis 3 becomes z-rotation instead of tilt-x.

You should be aware that xidump and gimp must take ownership of the device in order to get real-time data. This creates a conflict if you are running both of them simultaneously. gimp is the more clever of the two programs in that it only "grabs" the input device if you are hovering over the gimp drawing window. xidump is less friendly. In order to display the absolute position across the entire screen, it creates a small "listening window," grabs the device immediately, and does not release it until you quit the program. Neither program should fail, but you will not be able to draw in gimp and run xidump at the same time if they are both using the same input device.

We will run xidump in raw mode for the first time to see the stylus events directly. A small window will appear on the desktop while xidump runs; you can safely ignore it. Closing it will kill the application.

    [jej@ayukawa src]$ ./xidump -u raw stylus
    14.56291895: Proximity In
    14.56305595: Motion: x= +5978 y=+28728 p=   0 tx= +64 ty= +64 w=   +0 ID: 2323 Serial:         -60
    ...
    16.87158095: Motion: x= +4941 y=+27842 p= 225 tx= +41 ty= +67 w=   +0 ID: 2323 Serial:         -60
    16.87164395: Button: 1 DOWN
    16.87169595: Motion: x= +4964 y=+27844 p= 398 tx= +42 ty= +66 w=   +0 ID: 2323 Serial:         -60
    ...
    17.27328395: Motion: x= +5261 y=+27543 p=   3 tx= +48 ty= +64 w=   +0 ID: 2323 Serial:         -60
    17.27334395: Button: 1 UP
    17.27515995: Motion: x= +5348 y=+27451 p=   4 tx= +48 ty= +63 w=   +0 ID: 2323 Serial:         -60
    ...
    17.35933795: Motion: x= +7089 y=+27061 p=   4 tx= +48 ty= +63 w=   +0 ID: 2323 Serial:         -60
    17.37444395: Proximity Out
    <Ctrl-C>

The timestamp on the left is seconds elapsed; the next field is the event type. Mostly, you will encounter motion events although I've trimmed many of them out of this listing. As you can see from the above, the first line is a "proximity in" event which indicates the stylus came in range of the tablet. The last event was a "proximity out." At 16.87 seconds, I tapped the stylus to the tablet surface as recorded by the "Button: 1 DOWN" and subsequent "UP" message. Raw mode is useful for verifying the order and timing of messages, but is not particularly clean. The ncurses mode works much better.

    [jej@ayukawa src]$ ./xidump stylus
    InputDevice: stylus
    Valuators: Absolute   ID:      2323  Serial Number:          -60

                 x-axis    y-axis   pressure   x-tilt    y-tilt     wheel
         data:  +10826    +09919    +00084    +00058    +00065    +00000
          min:  +00000    +00000    +00000    -00064    -00064    +00000
          max:  +30480    +30480    +01023    +00063    +00063    +01023
          res:  +00000    +00000    +00039    +00001    +00001    +00001

    ********
    Proximity:  IN
        Focus:
      Buttons:  1-DOWN
         Keys:

All of the ranges are displayed above, include their resolutions which as far as I know are not normally used. Only the proximity, focus, valuator, and button events are currently implemented.

For completeness sake, here are the command line options:

    Usage: xidump [options] input_device
      -h, --help          - usage
      -v, --verbose       - verbose
      -V, --version       - version
      -l, --list          - list available input devices
      -u, --ui ui_type    - use specified ui, see below

    Use --list option for input_device choices
    UI types: curses, raw

There are not many options, but the --list option is helpful for identifying devices, and the --ui option allows you to switch between curses and raw modes. Adding the --verbose option increases the amount of output, and when used in conjunction with --list, displays the device capabilities.

Tablet PC

The Wacom digitizer that is embedded in the Tablet PCs can be a serial or USB tablet. The USB Tablet PCs follow the same configuration steps as the other Wacom USB tablets. This page is dedicated to serial Tablet PCs.

The embedded serial Wacom digitizers utilizes a special protocol IV, ISDV4. Similar to the conventional serial tablets, serial tablet PCs use a serial controller (UART). But, on older Linux kernels, they are not set to a logical serial port. They are effectively serial devices, but require special configuration (setserial) under Linux.

The good news is on newer Linux kernels, most serial Tablet PCs don't need the setserial step anymore since the kernel is taking care of them now. However, you still need to figure out which serial port your tablet has been mapped to before update the xorg.conf.

You can use xxd to see if your tablet has been mapped onto a serial port or not. To do so, follow the steps below:

    [jej@ayukawa ~]$su
    Password:
    [jej@ayukawa ~]# xxd /dev/ttyS0  

Move your pen on your tablet PC. If you see output from the terminal while you move the pen, your tablet has been mapped to port 1. Quit xxd by Ctrl+c. Then ignore the rest of this page and go to (see Configuring X11) page. Otherwise, apply xxd to port 1 to 4. If none of them show output, you need to manually map the tablet to a serial port or update your kernel serial driver.

If you have installed the kernel source that your system was based on, check the source under drivers/serial to see if you have 8250_pnp.c or not. If the file exists, please add:

    	/* Wacom tablets */
    	{	"WACFXXX",		0	},

to the end of pnp_dev_table (or replace all entries that start with WACF). Then compile and install your kernel from source. Once you launch the newly installed kernel, your serial tablet should be mapped to a ttyS port. Use xxd to decide which port is associated with your device.

If your kernel doesn't have 8250_pnp.c or you don't like to rebuild your kernel, here is a sample command to set your port manually. The IO port is most probably different from your Tablet PC, which you have to figure it out. This is the trade-off for not updating the kernel serial driver.

    [jej@ayukawa src]$ setserial /dev/ttyS2 port 0x93f8 autoconfig 

This command needs to be excuted with each reboot before X server starts.

You can add the command into one of your favorite start scripts. I normally add it into /etc/rc.d/rc.local. Here is how my rc.local looks like:

    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.

    touch /var/lock/subsys/local
    setserial /dev/ttyS2 port 0x93f8 autoconfig 

After installing wacom_drv.o and other programs, such as wacomcpl and wacdump, restart X server. Now you can view raw tablet data by:

   [jej@ayukawa util]$ ./wacdump -f tpc /dev/ttyS2       # Wacom digitizer on fake COM3

If your wacdump is from linuxwacom version 0.7.5 or older, issue

   [jej@ayukawa util]$ ./wacdump -f c100 /dev/ttyS2

If everything looks right from wacdump (see Using wacdump), you can update /etc/X11/XF86Config or /etc/X11/xorg.conf to load wacom X driver (see Configuring X11).

Please note that in Wacom InputDevice section, the following 2 options are required for serial Tablet PC:

      Option        "Device"        "/dev/ttyS2"          # SERIAL ONLY
      Option        "ForceDevice"   "ISDV4"               # Tablet PC ONLY

Refer to Adding the InputDevices for more information.

GUI-Based (tcl/tk) Wacom Control Panel(wacomcpl)

wacomcpl is a simple graphic Wacom driver configuration tool. It changes the pressure sensitivity, click threshold, button functions, cursor mode, speed, mapping, etc. without having to manually modify XF86Config/xorg.conf file. For Cintiq and Tablet PC users, it is also a tool to calibrate the tablet. wacomcpl should be launched when you login as yourself since .xinitrc (or .xsession), a file under your home directory, will be updated locally each time you run wacomcpl. The .xinitrc (or .xsession) stores the preferences you selected through wacomcpl for your next login. The goal is to give each user a chance to use his/her own preference on a shared system.

If you want all users on one system to share some settings, you can copy those lines started with xsetwacom in ~/.xinitrc (or ~/.xsession) to /etc/X11/xinit/xinitrc (/etc/X11/xinit/Xsession).

If your system doesn't execute .xinitrc (or .xsession) at login, each time after exiting from wacomcpl, you will need to copy those xsetwacom lines in .xinitrc (or .xsession) to a startup script (.bashrc, .cshrc, .profile, etc.) that your system launches. You can also modify wacomcpl-exec to automate this step.
However, it is reported that there are older systems on which can not run wacomcpl due to some XFree86 interface error. The workaround is to add the configuration options to your X config file, refer to Configuring X11 page for details.

Running wacomcpl

If wacom_drv.(s)o was running while installing wacomcpl, wacomcpl can be launched immediately after make install and exit.

If wacom_drv.(s)o is installed by the same make install as wacomcpl is, restarting X server is required to use the newly built wacom_drv.(s)o. We strongly recommand to build and install the wacom_drv.(s)o and wacomcpl from the same release package since the out of sync wacom_drv.(s)o and wacomcpl may crash your X server.

Command Line Configuration Interface (xsetwacom)

The xsetwacom is a command-line Wacom driver configuration tool. It changes the pressure sensitivity, click threshold, button functions, cursor mode and speed, and much more without having to manually modify XF86Config or xorg.conf file.

The basic usage and options can be viewed by issuing man xsetwacom.

Note: The device identifiers (dev_name) are case sensitive. You should use the dev_name exactly the same as xsetwacom list shows. The examples below assume that Stylus, cursor, and pad are used.

    [jej@ayukawa linuxwacom]$xsetwacom
    Usage: xsetwacom [options] [command [arguments...]]
    Options:
      -h, --help                 - usage
      -v, --verbose              - verbose output
      -V, --version              - version info
      -d, --display disp_name    - override default display
      -s, --shell                - generate shell commands for 'get'
      -x, --xconf                - generate X.conf lines for 'get'

    Commands:
      list [dev|param]       - display known devices, parameters
      list mod                   - display supported modifier and specific keys for keystokes
      set dev_name param [values...]   - set device parameter by name
      get dev_name param [param...] - get current device parameter(s) value by name
      getdefault dev_name param [param...] - get device parameter(s) default value by name

xsetwacom supports 3 forms of get/getdefault commands: xsetwacom get returns the parameter's raw value; xsetwacom -x get returns the value in Xorg.conf form; and xsetwacom -s get returns the value in shell command form.

The most used xsetwacom command is xsetwacom set dev_name param [values...], where param is an option which will be set to values in wacom_drv.o after executing xsetwacom. To better understand the use of this command, let's see some examples. Assume that you use Stylus as your Wacom tool's Identifier, which is considered as dev_name in xsetwacom command.

If you want to change Stylus's mode from absolute (default) to relative, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus mode relative

If you want to change button 2 to left-double-click, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus button2 "dblclick 1"

If you want to change button 2 to button 5, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus Button2 "button 5"
    or 
    [jej@ayukawa linuxwacom]$xsetwacom set Stylus Button2 5

If you want to change button 3 to ModeToggle, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus button3 modetoggle

If you want to know what the current (or default) pressure sensitivity setting is, then:

    [jej@ayukawa linuxwacom]$xsetwacom -s get Stylus PressCurve (output in xsetwacom format)
    xsetwacom set stylus PressCurve "0 15 85 100"
    or
    [jej@ayukawa linuxwacom]$xsetwacom -x get Stylus PressCurve (output in xorg.conf Option format)
            Option  "PressCurve"    "0,15,85,100"

    [jej@ayukawa linuxwacom]$xsetwacom -x getdefault Stylus PressCurve 
            Option  "PressCurve"    "0,0,100,100"

If you want to set the pressure sensitivity a bit softer, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus PressCurve 0 15 85 100

If you want the buttons behave the Tablet PC way, i.e., sending button event only when button1 (the tip) is pressed, then:

    [jej@ayukawa linuxwacom]$xsetwacom set Stylus TPCButton on

If you want to change pad's button 1 to ctrl alt F2, then:

    [jej@ayukawa linuxwacom]$xsetwacom set pad Button1 "core key ctrl alt F2"

If you want to change pad's button 2 to ctrl alt backspace, then:

    [jej@ayukawa linuxwacom]$xsetwacom set pad Button2 "core key ctrl alt backspace"

Note: keystrokes and modifiers are only supported for Xorg 6.8 or later.

xsetwacom supported parameters

Below is a list of the parameters and their values used by xsetwacom command (a similar output can be viewed by xsetwacom list param. All functions apply to the associated tool unless explicitly stated otherwise):

param [values...] results
Mode Absolute sets the mode of the device
TopX integer sets the X coordinate of the top corner of the active zone
TopY integer sets the Y coordinate of the top corner of the active zone
BottomX integer sets the X coordinate of the bottom corner of the active zone
BottomY integer sets the Y coordinate of the bottom corner of the active zone
STopXi integer returns screen i left coordinate in pixels
STopYi integer returns screen i top coordinate in pixels
SBottomXi integer returns screen i right coordinate in pixels
SBottomYi integer returns screen i bottom coordinate in pixels
ButtonM keystroke sets button M to button integer click or keystroke
ButtonM 0 ignores button M click
RelWUp keystroke sets relative wheel up to button click or keystroke
RelWDn keystroke sets relative wheel down to button click or keystroke
AbsWUp keystroke sets absolute wheel up to button click or keystroke
AbsWDn keystroke sets absolute wheel down to button click
StripLUp keystroke sets left strip up to button click or keystroke
StripLDn keystroke sets left strip down to button click or keystroke
StripRUp keystroke sets right strip up to button click or keystroke
StripRDn keystroke sets right strip down to button click or keystroke
PressCurve i1 i2 i3 i4 sets the pressure bezier curve, where i1+i4=100; i2+i3=100
DebugLevel integer (0 - 12) sets the level of debugging trace for the specified tool
CommonDBG integer (0 - 12) sets the level of debugging trace for all tools associated with the same tablet
Suppress integer (0 - 100) number of data trimmed for the tools associated with the same tablet
Screen_No integer (-1 - 5) sets screen number the tablet is mapped to
TwinView xinerama|vertical & sets the mapping to TwinView. Tablet mappings applied after this command will be based on the new tablet orientation.
leftof|aboveof
TVResolution0 width x height sets MetaModes option for TwinView Screen 0
TVResolution1 width x height sets MetaModes option for TwinView Screen 1
SpeedLevel integer (1 - 11) sets relative cursor movement speed
ClickForce integer (1 - 21) sets tip/eraser pressure threshold with clickforce scale
Threshold integer sets tip/eraser pressure threshold directly to the pressure default is (2048 / 75)
xyDefault resets the bounding coordinates to default in tablet units
mmonitor off turns on/off across monitor movement on (non-TwinView) multi-monitor desktop
TPCButton off turns on/off the buttons as Tablet PC buttons
Touch off turns on/off Touch events (default is enable/on for tablets with touch)
Gesture off turns on/off Touch Gesture (default is enable/on for tablets with two finger support).
ZoomDistance integer minimum distance required before starting a zoom gesture (default is 50)
ScrollDistance integer minimum finger motion distance required for starting a scroll gesture (default is 30 for Tablet PC and 20 for the others)
TapTime integer (1 - 500) maximum time between taps required for a right click gesture (default is 250 ms)
CursorProx integer (distance) sets cursor distance margin for proximity-out in distance from the tablet surface
Rotate cw|ccw|half sets the rotation of the tablet
ToolID returns the ID of the associated device
ToolSerial returns the serial number of the associated device
GetTabletID/TabletID returns the tablet ID of the associated device
NumScreen returns number of screens configured for the desktop
Event description format:
[CORE] [EVENT TYPE] [MODIFIERS] [CODE]
  CORE: Emit core events irrespective of the SendCoreEvents setting
  EVENT TYPE: the type of event to emit:
                  KEY: Emit a key event
                  BUTTON: Emit a button event
                  DBLCLICK: Emit a double-click button event
                  MODETOGGLE: Toggle absolute/relative tablet mode
	          DISPLAYTOGGLE: Toggle cursor movement among all displays which include individual screens plus the whole desktop for the selected tool if it is not a pad. When the tool is a pad, the function applies to all tools that are asssociated with the tablet
	          SCREENTOGGLE: Toggle cursor movement among all screens for the selected tool if it is not a pad. When the tool is a pad, the function applies to all tools that are asssociated with the tablet
  MODIFIERS: use "xsetwacom list mod" to see a list of modifiers and specific keys
  CODE: Button number if emit a button event or specific keys and any other keys not listed as mod

Associating parameters to physical devices

Following is a list of the parameters that are associated with the elements of devcies.

       param	              tools
    --------------------------------------------------------------------------
    Button#		          All Wacom styli/pucks buttons 
    		             Tablet ExpressKeys
    RelWUp/RelWDn	     Graphire4 tablet wheel 
    		             Wacom puck Fingerwheel
    AbsWUp/AbsWDn	     Intuos puck Thumbwheel
    		             Intuos Airbrush Fingerwheel
    		             Bamboo tabelt Touch Ring
    StripLUp/StripLUp   Left Touch Strip on Intuos3 and V5 Cintiq (Cintiq 21UX/12WX/20WSX) tablets
    StripRUp/StripRUp   Right Touch Strip on Intuos3 and V5 Cintiq (Cintiq 21UX/12WX/20WSX) tablets
    --------------------------------------------------------------------------

Automatically excuting predefined xsetwacom commands at logging in

The xsetwacom commands can be added to the .xinitrc under your home directory so next time when you login as yourself, the driver will be set to the options you choose.

Below is an example of my .xinitrc:

    [jej@ayukawa jej]$ more .xinitrc
    xsetwacom set Stylus TopX 10
    xsetwacom set Stylus TopY 67
    xsetwacom set Stylus BottomX 7170
    xsetwacom set Stylus BottomY 5778
    xsetwacom set Stylus TPCButton 1
    # run the primary system script
    . /etc/X11/xinit/xinitrc

To see what's under your home directory, use ls -al ~.

If your system doesn't execute .xinitrc at login, you can add those xsetwacom commands into the startup script (.bashrc, .cshrc, .profile, etc.) that your system launches, for example, you should use .Xsession instead of .xinitrc on Debian.
It has been reported that xsetwacom can not run on some older systems due to a XFree86 interface error. A generic solution to this issue is directly adding your configuration options to the /etc/X11/XF86Config file. Please refer to Configuring X11 for details.

More examples

If you are confused with the usages above, let's see some more confusing examples.

1. Usage of keystroke and modifiers

keystroke and modifiers can be used through buttons, ExpressKeys, wheels, Touch Strips, and Touch Ring. A list of supported modifiers and special keys can be viewed through xsetwacom list mod. Special keys are symbols that go together to represent one XInput key event.

In the following example, Up represents the up arrow key:

    [jej@ayukawa jej]$ xsetwacom set cursor button4 "key core Up"   

When you press button4 on your Wacom puck, Xinput will receive an up arrow event.

If you want to send the Up keystroke, the universal escape character \ has to be used:

    [jej@ayukawa jej]$ xsetwacom set cursor button4 "key core \Up"   

If you press button4 on your Wacom puck, Xinput will receive an U and a p events, i.e., Up would be displayed on your active console or application.

Sending down arrow event when button5 is pressed:

    [jej@ayukawa jej]$ xsetwacom set cursor button5 "key core Down"  

Sending PageUp event when tablet wheel scrolls up:

    [jej@ayukawa jej]$ xsetwacom set pad RelWUp "key core pgup"   

Sending PageDown event when tablet wheel scrolls down:

    [jej@ayukawa jej]$ xsetwacom set pad RelWDn "key core pgdn"   

The same functions work for parameters AbsWUp, AbsWDn, StripLUp, StripLDn, StripRUp, and StripRDn.

2. Changing debug level while driver is running

xsetwacom supports 2 ways of enabling/disabling debugging information, for individual device and/or for all tools associated with the same tablet, through parameters DebugLevel and CommonDBG. For example,

    [jej@ayukawa jej]$ xsetwacom set cursor DebugLevel 10

Turns debugger on to level 10 for device "cursor" only. Other devices will not report information to Xorg.0.log file.

    [jej@ayukawa jej]$ xsetwacom set cursor CommonDBG 3

Turns debugger on to level 3 for all devices associated with the same tablet as "cursor" does. But only common debug information will be reported.

3. Configuring TwinView setup while system running

TwinView parameter sets the mapping of TwinView to horizontal/vertical/none. The current TwinView setup can be retrieved by the corresponding get command. For example:

    [jej@ayukawa jej]$ xsetwacom -x get cursor TwinView
            Option  "TwinView"      "none"
    [jej@ayukawa jej]$ 

which means device cursor was not set to TwinView display.

Two other parameters, TVResolution0 and TVResolution1, made the change of MetaModes option in TwinView setup possible when system is running. TVResolution0 sets MetaModes option for TwinView Screen 0, while TVResolution1 sets MetaModes option for TwinView Screen 1. However, you need to make sure that the MetaModes you are going to set is the same as the TwinView setup in your xorg.conf for Nvidia Graphic card driver.

4. Changing Suppress and RawSample to filter the raw data

Use of Suppress will reduce the number of raw data we process in the driver. So, unless you know what you are doing, changing Suppress is not recommended. Valid values for Suppress is 0 to 100, where 0 means raw data is used as is. Suppress less than 101 means data will be used only when its change compared to the last processed event is larger than Suppress in points. Default is 2.

RawSample was originally introduced to smooth x/y coordinates to a certain degree. A four-points averaging was tested and convinced to be effective. In 0.7.8, we made RawSample changeable through xsetwacom. However, same as with Suppress, changing RawSample is not recommended. The maximum value can be as large as 20. But the default stays at 4.

Both Suppress and RawSample apply to the devices on the same tablet, that is, it is global to all devices associated with the same tablet.

Working With Gimp

Note: Gtk does not handle extended devices in relative mode. Please don't use Gimp in relative mode.

Bring up gimp and select "File -> Dialogs -> Input Devices" if using 1.x or "File -> Preferences -> Input Devices -> Configure Extended Input Devices" if using 2.x. You will see a drop-down list with all devices present. After enabling them, you can see their respective statuses by calling up "File -> Dialogs -> Device Status". It has been recommended that the devices be set to "Screen" mode rather than "Window".

I have successfully been able to use gimp with several different pens, including the tips and erasers. Tilt does not appear to be used by gimp at present, but pressure works fine. If the pressure is too coarse, or doesn't kick in until too late, you may need to lower your threshold value. The pressure curve setting can be changed through graphic tool, wacomcpl, and command line tool, xsetwacom.

Also, a useability note with Gimp: Each input device (stylus,cursor,eraser) has a completely different set of attributes in Gimp, and in theory, you can even assign a unique serial number to different pens to get even more granularity. You will experience this when you try to use your eraser for the first time. Rather than selecting the eraser tool, you get the rectangle selection tool instead. This is by design, believe it or not. Gimp does not care that its an eraser, just that it's not the pen you were just using. If you choose the eraser tool now, it will remember that for the next time you try to use it. On the plus side, you can set the eraser to be anything, including the Airbrush tool or Clone tool.

If you change the tool's mapping area while Gimp was running, you need to relaunch Gimp to use the new settings. Otherwise, the tool tip will be off from the drawing point.

One tablet user has pointed out that deleting his .gimp directory and rerunning gimp was necessary before his airbrush worked correctly. If you are having trouble, it's worth a shot.

Good luck!

Tablet-Screen Mapping

This page explains how multi-monitor settings are supported and how to use the InputDevices options to setup your desired tablet-to-screen mapping for some of the settings.

Linux Wacom X driver (wacom_drv.so) mainly supports four types of dual/multi-monitor setup in use with X server on Linux: TwinView, Xinerama, Xrandr, as well as non-TwinView and non-Xinerama case, where you normally can move the cursor from one screen to the other, but you can not move an application window, such as a terminal, from one screen to the other.

TwinView setup

By TwinView setup, we used to represent the two screens are configured in such a way that X "thinks" it only has one screen. Starting from release 0.8.3-6, we added the non-TwinVew setup for nvidia card as TwinView with option Xinerama. So, it is getting more confused even among us, the developers. Thanks for the new dual display support from Nvidia driver.

There are four kinds of tablet-to-screen mappings in this setup:

1. map the tablet to the whole desktop;

In this case, there is no extra option required in the InputDevices section for Wacom driver in your X11's configuration file. So this is the default state for TwinView setup.

2. map the tablet to one screen at a time when dual display is in TwinView setup, but can switch screens at wish;

Option "TwinView" is used in the InputDevices section of the X11's configuration file to configure Wacom driver.

This feature was initially supported by Dreamwork developers. Their idea was to maximize the accuracy of the tablet on one screen and be able to move the cursor between screens without issuing a command (such as xsetwacom) or press a button (such as display toggle). The tradeoff is that you lost about 60 tablet count of points on the side that enables the screen switch.

3. map the tablet to a specific screen when dual display is in TwinView setup.

Option "TwinView", "TVResolution0", "TVResolution1", and "ScreenNo" are used in the InputDevices section of the X11's configuration file to configure Wacom driver . Detailed use of these options can be found by "man wacom".

4. map the tablet to a specific screen when dual display is in non-TwinView setup with Nvidia card.

Option "TwinView" and "ScreenNo" are used in the InputDevices section of the X11's configuration file to configure Wacom driver. The screen resolution is retrieved from the X server the same way as we retrieve it for an Xinerama setup. The actual option in the InputDevice section would be:

Option "TwinView" "Xinerama"

Option "ScreenNo" "theScreenNumber"

I've seen displays with Xinerama in their xorg.conf files in fact fall into TwinView setup since the whole desktop is reported as one screen. Use xsetwacom get stylus NumScreen to see how many screen you have. You need to use this command without adding any screen mapping related options in your xorg.conf file for Wacom device. If the command only reports one screen but you actually have two screen on the system, you are running a TwinView setup. If it reports more than one screen, you are in Xinerama setup.

Xinerama setup

1. map the tablet to the whole desktop;

No extra option required in the InputDevices section for Wacom driver in your X11's configuration file to support this setup. It is the default state.

2. map the tablet to one screen at a time, but can switch screens with the regular mouse or a user defined button/app;

Option "MMonitor" "off" is used in the InputDevices section of the X11's configuration file to configure Wacom driver. The cursor will stay in the screen where you started to use the configured Wacom device. You can change screens by moving the cursor with another device/app, such as system mouse or another Wacom device which is not configured with "MMonitor" "off", then use the configured Wacom device in that screen.

3. map the tablet to a specific screen.

Only option "ScreenNo" is needed to configure Wacom driver in this setting.

non-TwinView and non-Xinerama setup

In this setup, we only support tablet to a specific screen mapping, that is, you have to map the tablet to a specific screen by option "ScreenNo". Otherwise, your tablet may be mapped half on the first screen and the other half on the second screen.

X11 InputDevices Options details all options for your Wacom device that we mentioned above.

Xorg RandR

This support is provided by Novell developers. A daemon called wacomxrrd is added to src/util to map Wacom LCD tablet to its own screen under extended RandR mode. The daemon can be launched by "wacomxrrd $dev" and managed through your prefered desktop interfaces.
On SLED 11, it is done by adding the following script, wacomxrrd-start, to /usr/bin
   #!/bin/sh grep -q -i wacf /sys/bus/pnp/devices/*/id && exec wacomxrrd -i touch exit 0 
and putting wacomxrrd.desktop to /usr/share/gnome/autostart.

Contacts

Ping Cheng can be contacted at the following email address: pinglinux@gmail.com.

Appendix

This section is for everything that is either not critical or simply too complex to describe in the document above without becoming overly distracting.

Building wacdump and xidump

Building wacdump

wacdump is enabled by default in the configure script, so let's do that now:

    [jej@ayukawa linuxwacom]$ ./configure
    ...
    ----------------------------------------
      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes
                  hid.o - no
             usbmouse.o - no
            wacom_drv.o - no
    ----------------------------------------

As shown above, the build options indicate that wacdump will be built. If not, then scroll back through the configuration to see if there aren't any errors or warnings that would explain this.

Next, run make. The output will be a file called wacdump in the linuxwacom package's src/util directory. Running make install, will install it under /usr/local/bin.

Building xidump

xidump builds by default so if you've configured and built the project in previous steps, you probably have it already. If not, we can build it now.

xidump requires the XLib and XInput header files to be present on the system. On Redhat 8.0, these files are located in the XFree86-devel RPM package. Other distributions may be organized differently, and people who build X from source probably get them by default. When configuring, check that XLib is detected in the build environment, and if not, refer to the warnings and "checking for" messages for additional clues.

The preferred display mode for xidump uses ncurses. To compile it, you will need the ncurses header files. On Redhat 8.0, these files are located in the ncurses-devel package. Without ncurses, xidump defaults to raw mode automatically.

    [jej@ayukawa linuxwacom]$ ./configure
    checking for XLib include directory... found
    checking for XLib header files... found
    checking for ncurses.h... yes
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
                    ...
                   XLib - yes
                ncurses - yes
                    ...

      BUILD OPTIONS:
                    ...
                 xidump - yes
                    ...
    ----------------------------------------

The configuration above indicates that the XLib and ncurses header files were found and xidump will be built. If ncurses.h is not found, xidump will still build, but it will also warn you that ncurses will not be available. If you encounter warnings, it is most likely that your development environment is missing some packages.

When you run make, the xidump program will be built along with any other programs that are specified in the build options. The output file is called 'xidump' and is located in the linuxwacom package's src/util directory. It is installed by running make install.

Building xsetwacom

Building xsetwacom

xsetwacom uses libwacomcfg.so to communicate with Wacom X (XFree86 or Xorg) driver, wacom_drv.(s)o. So, libwacomcfg.so should be built and installed.

libwacomcfg.so relies on Xlib. In the configure script, it will default the Xlib path to /usr/X11R6 or /usr/lib (/usr/X11R6/lib64 or /usr/lib64 if --enable-xserver64 option is set) by checking the existence of xf86Version.h. If your Xlib is not installed under /usr/X11R6 or /usr/lib, you'll need to specify the path (dir) by --with-xlib=dir. Let's see what we get from configure:

    [jej@ayukawa linuxwacom]$./configure
    ...
    ----------------------------------------
    BUILD ENVIRONMENT:
           architecture - i586-suse-linux
           linux kernel - yes 2.6.24
      module versioning - no 
          kernel source - yes /lib/modules/2.6.25.20-0.7-default/source
         XFree86 source - no 
               Xorg SDK - yes /usr/include/xorg
              XSERVER64 - no
               dlloader - yes
                   XLib - yes /usr/lib
             xf86config - no
                    TCL - yes /usr/include
                     TK - yes /usr/include
                ncurses - yes

      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes 
                 xidump - yes 
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
              wacomxrrd - yes
                  hid.o - no 
           wacom_drv.so - yes /usr/lib/xorg/modules/input 
            wacom_drv.o - no
      wacom*_drv quirks - hal libc-wrapper tablet-screen-scaling IsXExtensionPointer key-events dixScreenOrigins Uninit-called
    ----------------------------------------

As shown above, the build options indicate that libwacomcfg and xsetwacom will be built. If not, then scroll back through the configuration to see if there are any errors or warnings that would explain the issue.

Next, run make. The output will be stored in the linuxwacom package's src/util and src/util/.libs directory. They will be installed by running make install (you need to switch to superuser to run this command).

If wacom_drv.(s)o was running while installing xsetwacom, xsetwacom can be launched immediately after make install and exit.

If wacom_drv.o is installed by the same make install as xsetwacom is, restarting X server is required to use the newly built wacom_drv.(s)o. We strongly recommand to build and install wacom_drv.(s)o and xsetwacom from the same release package since the out of sync wacom_drv.(s)o and xsetwacom may crash your X server.

Building wacomcpl

wacomcpl is written in tcl/tk. It uses libwacomxi.so and xsetwacom to communicate with Wacom XFree86/Xorg driver, wacom_drv.(s)o. So, to run wacomcpl, tcl/tk should be installed, libwacomxi.so and xsetwacom should be built and installed.

libwacomxi.so and xsetwacom are enabled by default in the configure script. By default, the script will assume that tcl/tk is installed under /usr. That is, tcl.h and tk.h should be under /usr/include; libtcl.so.0 and libtk.so.0 should be under /usr/lib. Let's see what we get from configure:

    [jej@ayukawa linuxwacom]$./configure
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i686
           linux kernel - yes 2.6
      module versioning - yes
          kernel source - yes /usr/src/linux
                XFree86 - no
                   XLib - yes /usr/X11R6
                    TCL - yes /usr
                     TK - yes /usr
                ncurses - yes

      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
                  hid.o - no
             usbmouse.o - no
                evdev.o - no
             mousedev.o - no
                input.o - no
            tabletdev.o - no
            wacom_drv.o - no
    ----------------------------------------

As shown above, the build options indicate that libwacomxi and xsetwacom will be built. If not, then scroll back through the configuration to see if there are any errors or warnings that would explain this.

For example, on another system, I have installed tcl/tk under /usr/local/ActiveTcl. That is, tcl.h and tk.h are under /usr/local/ActiveTcl/include. If I run configure without options, I get:

    [jej@ayukawa linuxwacom]$./configure
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i686
           linux kernel - yes 2.6
      module versioning - yes
          kernel source - yes /usr/src/linux
                XFree86 - no
                   XLib - yes /usr/X11R6
                    TCL - no
                     TK - no
                ncurses - yes
                    GTK - 2.0.6

      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - no
              xsetwacom - yes
                  hid.o - no
             usbmouse.o - no
                evdev.o - no
             mousedev.o - no
                input.o - no
            tabletdev.o - no
            wacom_drv.o - no
    ----------------------------------------

The build options show that libwacomxi will not be built. When I scroll back through the configuration, I see:

    ...
    checking for tcl header files... not found; tried /usr/include/tcl.h
    ***
    *** WARNING:
    *** The tcl development environment does not appear to
    *** be installed. The header file tcl.h does not appear
    *** in the include path. Do you have the tcl rpm or
    *** equivalent package properly installed?  Some build
    *** features will be unavailable.
    ***
    checking for tk header files... not found; tried /usr/include/tk.h and /include/tk.h
    ***
    *** WARNING:
    *** The tk development environment does not appear to
    *** be installed. The header file tk.h does not appear
    *** in the include path. Do you have the tk rpm or
    *** equivalent package properly installed?  Some build
    *** features will be unavailable.
    ***
    checking ncurses.h usability... yes
    checking ncurses.h presence... yes
    checking for ncurses.h... yes
    ***
    *** WARNING:
    *** libwacomxi requires tcl environment; libwacomxi will not be built.
    ***
    ...

Then I run configure with option --with-tcl=/usr/local/ActiveTcl:

    [jej@ayukawa linuxwacom]$./configure --with-tcl=/usr/local/ActiveTcl
    ...
    ----------------------------------------
      BUILD ENVIRONMENT:
           architecture - i686
           linux kernel - yes 2.6
      module versioning - yes
          kernel source - yes /usr/src/linux
                XFree86 - no
                   XLib - yes /usr/X11R6
                    TCL - yes /usr/local/ActiveTcl
                     TK - yes /usr/local/ActiveTcl
                ncurses - yes

      BUILD OPTIONS:
                wacom.o - no
                wacdump - yes
                 xidump - yes
            libwacomcfg - yes
             libwacomxi - yes
              xsetwacom - yes
                  hid.o - no
             usbmouse.o - no
                evdev.o - no
             mousedev.o - no
                input.o - no
            tabletdev.o - no
            wacom_drv.o - no
    ----------------------------------------

Note: You may need to issue the following commands before running wacomcpl:

    [jej@ayukawa linuxwacom]$export LD_LIBRARY_PATH=/usr/local/ActiveTcl/lib:$LD_LIBRARY_PATH
    [jej@ayukawa linuxwacom]$su
    [jej@ayukawa linuxwacom]#cd /usr/local/ActiveTcl/lib
    [jej@ayukawa lib]#ln -s libtcl.8.4.so libtcl.so.0
    [jej@ayukawa lib]#ln -s libtk.8.4.so libtk.so.0

If your tcl and tk are installed on different paths, you'll need to specify them separately. Suppose that your tcl is under /usr/local/tcl8.4 and your tk is under /usr/local/tk8.4, the proper configuration and setup commands will be:

    [jej@ayukawa linuxwacom]$./configure --with-tcl=/usr/local/tcl8.4 --with-tk=/usr/local/tk8.4
    [jej@ayukawa linuxwacom]$export LD_LIBRARY_PATH=/usr/local/tcl8.4/lib:/usr/local/tk8.4/lib:$LD_LIBRARY_PATH
    [jej@ayukawa linuxwacom]$su
    [jej@ayukawa linuxwacom]#cd /usr/local/tcl8.4/lib
    [jej@ayukawa lib]#ln -s libtcl.8.4.so libtcl.so.0
    [jej@ayukawa lib]#cd /usr/local/tk8.4/lib
    [jej@ayukawa lib]#ln -s libtk.8.4.so libtk.so.0

Next, run make. The output will be stored in the linuxwacom package's src/wacomxi and src/wacomxi/.libs directories. They will be installed by running make install (you need to switch to superuser to run this command).

Building wacom_drv.o from Scratch

Introduction

I should tell you out-right that this is a time consuming process.

Why would you want to do this? Two reasons. One, you are a developer and need to make changes to the source code directly. Two, your distribution uses c libraries or configuration options that are not compatible with the wacom_drv.o file that I provide. People running libc5 for instance, would need to build their own driver.

Timothy Klein has submitted a brief howto for compiling on Debian Stable which is still running XFree86 4.1 as of this writing. It covers steps one through four of this document, and a savvy developer should be able to figure out step five on his own. If someone solves step five and generates a patch to Makefile.am, I'll see what I can do about getting it into the configuration script. That document is on the Installing wacom driver On Debian page.

You will need the X source code to rebuild the wacom_drv.o driver. The build configuration for X generates a number of header files that are necessary but not installed by default on most distributions. Consequently, you will need to not only get the source, but build it, practically in its entirety. Then, after all that, the configure script can be instructed to hook into the X build tree and rebuild wacom_drv.o at any time without having to rebuild X again.

Since I am running Redhat 8.0 and cannot really pull down the original XFree86 4.2.0 source code, compile it, and expect it to work on my system, I need to instead use the source RPM provided by Redhat. If you choose to go this route, I provide pretty detailed instructions for making this work. If your distribution works differently, or you are using Gentoo where most everything is source code by default, you'll need to handle this as best as possible according to your particular situation.

Step One: Get The Source

On Redhat 8.0, I discovered the version number for my currently installed XFree86 packages by running rpm -q XFree86. This reported version 4.2.0-72, therefore the source package is XFree86-4.2.0-72.src.rpm. I downloaded the package from Redhat directly and installed it to the system as follows:

    [root@sen src]# rpm -ivh XFree86-4.2.0-72.src.rpm
       1:XFree86                ########################################### [100%]

This installs a number of files to the /usr/src/redhat directory, particularly in the SOURCES and SPECS subdirectories. Other distributions undoubtedly install elsewhere. Look for the XFree86.spec file which should be located in the SPECS directory. This file contains all the information necessary to patch the orginal XFree86-4.2.0 source code to the level that Redhat is distributing in their regular binary package. The source code and patch files are located in SOURCES.

Step Two: Build the Source

This step describes how to build the source from the RPM itself. If you are building from some other mechanism, I honestly cannot offer much assistance since I generally don't build my X system from scratch. If you'd like to write up a short section on building the server for your particular distribution, I would be happy to include it here.

Next, you don't actually have to build the entire thing. The point at which the xf86Wacom.c driver can be built however, is not until somewhere in the middle of the build process. The driver depends on a number of header files that are created dynamically so until they are generated, wacom_drv.o cannot be compiled. My solution was to open a separate terminal in the wacom driver directory and periodically attempt to build it. When it successfully built, I stopped the X build process. Here's how to build the source for an RPM that's been exploded out into the SPECS and SOURCES directories.

    [root@sen root]# cd /usr/src/redhat
    [root@sen redhat]# rpmbuild -bc SPECS/XFree86.spec

Not every distribution has rpmbuild; try using just rpm instead. At some point, Redhat split the build functionality into separate programs. If after looking through the rpm man page, you still cannot get this to work, send me some email, and I'll look into it.

The important item is the "-bc" option of rpmbuild which unpacks, patches, and builds the source without actually installing. While it is also possible to simply unpack and patch using the "-bp" option, there does not seem to be a way to just build. The "-bc" option simply deletes all the files provided by "-bp" and recreates them again. The downside of this is that if you wanted to simply unpack, patch, and then copy the new xf86Wacom.c file over the old one, you'll find that the build step deletes it and starts over again. I have gotten this to work by creating a new patch file, but this requires a bit more effort, so I don't recommend it right off.

Step Three: Build the Original Driver

The xf86Wacom.c file is buried pretty deep in the X build tree. If it is in a different location than the one I have provided below, try using find . -name xf86Wacom.c from the BUILD directory.

    [root@sen redhat]# cd BUILD/XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/input/wacom
    [root@sen wacom]# ls
    Imakefile  wacom.man    xf86Wacom.c.Wacom-USB-driver-a25-update
    Makefile   xf86Wacom.c

The "a25-update" file is the original xf86Wacom.c file before Redhat's patch. If you open xf86Wacom.c, you'll find that it is version 25, at least as of this writing and this distribution. The presence of the Makefile means that the configuration has at least been run for this directory. If you have built a sufficient portion of the X source files, then all the header files that you need have been generated, and you can build xf86Wacom.c. Try it, and if it does not build, wait a bit. The absence of xf86Version.h for instance, is a good indication that the build process is not ready.

    [root@sen wacom]# make
    rm -f xf86Wacom.o
    gcc -O2 -march=i386 ... -c xf86Wacom.c
    ld -r xf86Wacom.o -o wacom_drv.o

Step Four: Automating the Build Process

By configuring the package with the --with-xf86 option set to the XFree86 build tree, you can build the driver outside of the X build tree.

    [jej@ayukawa wacom]$ ./configure \
    	--with-xf86=/usr/src/redhat/BUILD/XFree86-4.2.0 
    ...
    BUILD ENVIRONMENT:
                XFree86 - yes
      BUILD OPTIONS:
            wacom_drv.o - yes
    [jej@ayukawa wacom]$ make

The makefile rule which builds the driver is contained within src/Makefile.am and is modified according to the configuration to generate a rule similar to this in src/Makefile:

    xf86Wacom.o: xf86Wacom.c
            gcc -O2 -march=i386 -mcpu=$(ARCHITECTURE) -pipe -ansi \
                    -pedantic -Wall -Wpointer-arith -fno-merge-constants \
                    -I. -I$(XF86_DIR)/programs/Xserver/hw/xfree86/common \
                    -I$(XF86_DIR)/programs/Xserver/hw/xfree86/loader \
                    -I$(XF86_DIR)/programs/Xserver/hw/xfree86/os-support \
                    -I$(XF86_DIR)/programs/Xserver/include \
                    -I$(XF86_DIR)/programs/Xserver/mi \
                    -I$(XF86_DIR)/exports/include/X11 \
                    -I$(XF86_DIR)/include/extensions \
                    -I$(XF86_DIR) \
                    -I$(XF86_DIR)/exports/include \
                    -Dlinux -D__i386__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE \
                    -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE  -D_GNU_SOURCE \
                    -DSHAPE -DXINPUT -DXKB -DLBX -DXAPPGROUP -DXCSECURITY \
                    -DTOGCUP -DXF86BIGFONT -DDPMSExtension -DPIXPRIV -DPANORAMIX \
                    -DRENDER -DGCCUSESGAS -DAVOID_GLYPHBLT -DPIXPRIV \
                    -DSINGLEDEPTH -DXFreeXDGA -DXvExtension -DXFree86LOADER \
                    -DXFree86Server -DXF86VIDMODE -DXvMCExtension \
                    -DSMART_SCHEDULE -DBUILDDEBUG -DXResExtension \
                    -DX_BYTE_ORDER=X_LITTLE_ENDIAN -DNDEBUG -DFUNCPROTO=15 \
                    -DNARROWPROTO -DIN_MODULE -DXFree86Module -DLINUX_INPUT \
                    -o xf86Wacom.o -c xf86Wacom.c

Similar rules apply to wcmSerial.c, wcmUSB.c, wcmISDV4.c, wcmCommon.c, wcmCompat.c, wcmConfig.c, and, wcmFilter.c.

The options and directories specified come directly from the output of the make command in the previous step. All the root and parent directories have been replaced with the macro XF86_DIR which in this case is set by the configuration script to /usr/src/redhat/BUILD/XFree86-4.2.0/xc. If the options that you see in your build are identical to those above, then the default rule will work for you now. If not, you'll need to make some alterations. You can update the Makefile.am file and rerun automake, update the Makefile.in and rerun configure, or just update the Makefile directly.

So long as the X build tree exists, the include directories will point to the correct locations, and the driver will build. If space is an issue, you can probably remove all the non-essential directories, but be careful; the dependency tree in X is huge.

Laptop Suspend/Resume Tips

Thomas Netter (tnetter at iniDOTunizhDOTc) kindly provided a solution to the following problem:

    When laptop recovers from suspend/resume, XFree86/X.org no longer
    registers the tablet.  The laptop, however, receives all the tablet data 
    (I can "cat /dev/input/event2" and see the data).

    The only way I know for X to recover the tablet is to restart X.

The problem lies in the step that when unplugging tablet cable while the laptop is entering Suspend Mode. The proper steps to plug/unplug, suspend/resume a Wacom tablet on a laptop are:

    - Fold the laptop's screen
    - Wait 4 or 5 seconds for the tablet's orange LED to extinguish
    - Unplug the tablet's USB cable

    THEN you can recover the tablet functionalities after resuming the
    laptop and repluging the tablet.

    However, If you:
    - Fold the laptop's screen
    - Immediately unplug the tablet's USB cable before the LED extinguishes

    THEN you cannot recover the tablet functionalities after resuming the
    laptop and replugging the tablet, even if you replug the tablet before 
    resuming the laptop.

    Therefore, old airline operations apply: Extinguish LEDs before take-off!

    -Thomas

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

Copyright (C) 2002-2011 - LinuxWacom

This website and its contents are licensed under the GNU GENERAL PUBLIC LICENSE.

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox