Wacom Linux

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: [mailto:linuxwacom-discuss@lists.sf.net?subject=LinuxWacom linuxwacom-discuss@lists.sf.net].

Success Stories
This page documents different distributions tested by myself or reported from the users in the discussion mailing list. If you have success stories for a distribution or version not mentioned, let me know so I can update the page.


 * Redhat
 * Fedora Core 4 - tested on kernel 2.6.14 &amp; 2.6.12, X.org 6.8
 * Fedora Core 3 - tested on kernel 2.6.11-1.14_FC3 &amp; 2.6.9, X.org 6.8 (see [#debwacomnosrc Building wacom driver On Fedora Core 3])
 * Fedora Core 2 final - tested on kernel 2.6.5-1.358
 * Fedora Core 2 test1 - tested on kernel 2.6.1-1
 * Fedora Core 1 - tested on kernel ???
 * Redhat 9.0 - tested on kernel 2.4.20-6, 2.4.22, 2.4.24, 2.6.0, &amp; 2.6.2
 * Redhat 8.0 - tested on kernel 2.4.18-17.8.0, 2.4.18-18.8.0, 2.4.18-19.8.0, &amp; 2.4.18-24.8.0
 * Redhat 7.3 - tested on kernel 2.4.18-17.7.x
 * Redhat 7.2 - tested on kernel 2.4.18-17.7.x
 * Redhat Enterprise Linux 3 - tested on kernel 2.4.21-4
 * Redhat Enterprise Linux 4 - tested on kernel 2.6.9
 * Mandrake
 * Mandriva 2006 32bit december club - tested on 2.6.12-12mdksmp X.org 6.9.0
 * Mandriva 2006 (Powerpack) - tested on 2.6.12-12mdksmp X.org 6.8.99.900 (6.9.0 RC 0)
 * Mandrake 10.0 - tested on 2.6.3 and X?
 * Mandrake 9.1
 * Mandrake 9.0 - tested on ???
 * Mandrake 8.2 - tested on kernel 2.4.18-6mdk
 * Gentoo
 * Gentoo 2005.0, Xorg-X11 6.8.2-r4 &amp; 6.8.2-r1, linux-2.6.13-gentoo-r3 &amp; linux-2.6.11-gentoo-r6
 * Gentoo 2004.2, Xorg-X11 6.7.0, linux-2.6.8-rc3-mm2
 * Gentoo 2004.1, Xorg-X11 6.7.0, kernel 2.4.25 &amp; 2.6.5
 * Gentoo 1.4rc, XFree86 4.2.0, kernel 2.4.19
 * Gentoo 1.4, XFree86 4.3.0-r5, kernel 2.6.3 (can not run wacomcpl and xsetwacom)
 * Debian
 * Debian (sid) - XFree86 4.3 on 2.6.6 (see [#debwcmdrv Installing wacom driver On Debian])
 * Debian (sid) - XFree86 4.3(?) on 2.6.0 (can not run wacomcpl and xsetwacom)
 * Mepis 200310 (Debian unstable) - XFree86 4.3 on 2.4.22
 * Debian Woody - XFree86 4.2 on 2.4.20
 * Debian Stable 3.0 - XFree86 4.3 on 2.4.18 (can not run wacomcpl and xsetwacom)
 * Debian Stable - XFree86 4.1
 * Slackware
 * Slackware 10.2, kernel 2.4.31
 * Slackware 10.1, kernel 2.6.11-rc4 &amp; 2.4.29, X.org 6.8.2
 * Slackware 10.0, kernel 2.4.26, X.org 6.7.0
 * Slackware 9.1, with 2.4.22
 * Slackware 9.0
 * Slackware 8.1, (standard release)
 * SuSE
 * Suse Linux 9.3, kernel 2.6.11.4-21.8
 * Suse Linux 9.2 Pro, kernel 2.6.8, X.org 6.8.1 (see [#susewacom Building wacom driver On Suse 9.2])
 * Suse Linux 9.1, kernel 2.6.4 &amp; 2.6.5, XFree 4.3.99 (4.4.0 RC 2)
 * Suse Linux 8.0, kernel 2.4.18, XFree 4.2
 * Ubuntu
 * Ubuntu 5.04 (Hoary), kernel 2.6.10-5, X.Org 6.8.2-10
 * Ubuntu Breezy, kernel 2.6.12, X.Org 6.8
 * FreeBSD
 * version 4.10, serial only
 * Source Mage
 * gcc 3.2.2, Linux 2.4.21-pre4-ac3, XFree86 4.2.1 and 4.3.0
 * PowerMac
 * Yellow Dog Linux 3.0.1 [Redhat variant for PPC] (see [#ppcwcmdrv Building wacom driver On PowerMac])

How To Use This Document
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 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. The linuxwacom package has an HTML version of this document in the docs directory. And of course, there's always lynx for the gurus out there, which is why this document is written out in plain vanilla 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 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 [#tabletpc 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. In some cases, your distribution may have automatically loaded certain modules which you will now need to unload. 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 configuration file.

Incidentally, some distributions detect new hardware on boot. If you allow Redhat's "anaconda" for instance to automatically configure (or remove) your USB tablet, it may undo some of the settings you will make here. Until Redhat's installation program recognizes Wacom tablets as non-HID devices by default, you are best off in my opinion to not allow it to configure the device. Just a warning.

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.

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

Downloading the Code
The file linuxwacom-0.7.2.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.7.3.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.7.2.tar.bz2 [jej@ayukawa jej]$ tar -xf linuxwacom-0.7.2.tar [jej@ayukawa jej]$ cd linuxwacom-0.7.2

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.

The Configure Script
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 kernel drivers for hid, mousedev, evdev, and usbmouse as well as building the XFree86 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.

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-2.4, /usr/src/linux, /usr/src/linux-2.6, /usr/src/linux-`uname -r`, or /lib/modules/`uname -r`/build. If your kernel sources are elsewhere, you will need to specify the directory with the --with-kernel option described below.

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

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 d etermine 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 [#builddrv 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. On Redhat 8.0, they can be found in the ncurses-devel RPM.

Similarly, if you wish to test your tablet using xidump to view XFree86 input events, you will need the XFree86 development headers. On Redhat, they are contained in the XFree86-devel 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 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 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, but more obscure systems may need all of them. Each section of the document identifies which options are necessary and when.

Configuration Samples
Here is a sample output of the script on a Redhat 8.0 system:

[jej@ayukawa linuxwacom]$ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ... checking for processor type... i686 checking for kernel module versioning... yes checking for kernel sources... /usr/src/linux checking for XLib include directory... found checking for XLib header files... found ... checking for ncurses.h... yes

BUILD ENVIRONMENT: architecture - i686 linux kernel - yes 2.4 module versioning - yes kernel source - yes /usr/src/linux XFree86 - no               XLib - yes TCL - yes /usr TK - yes /usr ncurses - yes GTK - 2.0.6

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

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:

*** WARNING: *** Unable to compile wacom_drv.o without XF86 build environment *** wacom_drv.o will not be built ***

In this particular case, the XFree86 driver was enabled, but the --with-xf86 option was not specified. 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-hid --enable-usbmouse \ --enable-evdev --enable-moudedev --enable-input --enable-wacom \ --with-xf86=/usr/src/redhat/BUILD/XFree86-4.2.0 \ --with-kernel=/home/jej/src/linux --with-tcl=/usr/local/ActiveTcl \ --disable-modver --disable-wacdump checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ... checking for processor type... i686 checking for kernel module versioning... yes checking for kernel sources... /usr/src/linux-2.4 checking for valid XFree86 build environment... ok ...  BUILD ENVIRONMENT: architecture - i686 linux kernel - yes 2.4 module versioning - no kernel source - yes /home/jej/src/linux XFree86 - yes /usr/src/redhat/BUILD/XFree86-4.2.0 XLib - yes /usr/X11R6/lib TCL - yes /usr/local/ActiveTcl TK - yes /usr/local/ActiveTcl ncurses - yes GTK - 2.0.6

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

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.

Here is another sample from Red Hat Enterprise Linux ES v.4:

[jej@ayukawa linuxwacom-x86-64]$ ./configure --enable-wacom --enable-hid \ --with-xf86=/home/jej/Desktop/X11R6.8 \ --with-tcl=/usr/local/ActiveTcl \ --enable-xserver64 --with-xlib=/usr/X11R6/lib64  checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ... checking build system type... x86_64-redhat-linux-gnu checking host system type... x86_64-redhat-linux-gnu checking for ld used by g++... /usr/bin/ld -m elf_x86_64 ...

BUILD ENVIRONMENT: architecture - x86-64 linux kernel - yes 2.6.9 module versioning - yes -DCONFIG_MODVERSIONS -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h      kernel source - yes /usr/src/linux XFree86 - yes /home/jej/Desktop/X11R6.8 XSERVER64 - yes XLib - yes /usr/X11R6/lib64 TCL - yes /usr/local/ActiveTcl TK - yes /usr/local/ActiveTcl ncurses - yes

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

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.

The USB Kernel Driver
Serial tablet users rejoice: you can skip this entire section. Please go to the [#wacdump Using 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, efforts are being made to get these changes merged back into the Linux kernel.

Note: If your system is running a 2.4 kernel and you don't have any application required to run on kernel 2.4, upgrading your kernel to version 2.6 (preferablely 2.6.8 or later) may save you the steps to update wacom kernel related modules.

Testing Tablet Detection
In this section we will determine which driver, if any, claims control over the tablet. There are at least three drivers that are interested: 1) (usb)hid.o which may think it is an HID device, 2) usbmouse.o which may think it is an HID mouse (for kernel 2.4), and 3) 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(&gt;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=event0 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 kernel 2.4 or older 2.6 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. BLOCKQUOTE&gt;

This is Redhat 8.0 (2.4.18-17.8.0):

[jej@ayukawa usb]# tail /var/log/messages Apr 03 21:26:11 ayukawa kernel: hub.c: USB new device connect on bus2/2, assigned device number 2 Apr 03 21:26:11 ayukawa kernel: input0: Wacom Intuos2 12x12 on usb2:2.0 Apr 03 21:26:11 ayukawakernel: wacom.c: Setting tablet report for tablet data Apr 03 21:26:11 ayukawa kernel: wacom.c: input1: Wacom Intuos3 6x11 on usb1:6.0 Apr 03 21:26:14 ayukawa /etc/hotplug/usb.agent: Setup wacom hid for USB product 56a/44/115 Apr 03 21:26:14 ayukawa /etc/hotplug/usb.agent: Setup mousedev for USB product 56a/44/115

And here it is again on Redhat 7.2 (2.4.18-17.7.x):

[jej@sasami root]# tail /var/log/messages Apr 03 21:28:38 sasami kernel: hub.c: USB new device connect on bus1/1, assigned device number 2 Apr 03 21:28:38 sasami kernel: input0: Wacom Intuos2 12x12 on usb1:2.0 Apr 03 21:28:39 sasami kernel: usb.c: registered new driver hiddev Apr 03 21:28:39 sasami kernel: usb.c: registered new driver hid Apr 03 21:28:39 sasami kernel: hid-core.c: v1.8.1 Andreas Gal, Vojtech Pavlik &lt;vojtech@suse.cz&gt; Apr 03 21:28:39 sasami kernel: hid-core.c: USB HID support drivers Apr 03 21:28:39 sasami kernel: mice: PS/2 mouse device common for all mice

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/event0. You are ready to configure the X driver [#download Downloading the Code].

If instead you got any of the following lines in your log, the wacom driver did not get control. Either hid or usbmouse did.

input0,hiddev0: USB HID v1.00 Mouse [Tablet XD-0608-U] on usb1:5.0 input0: Tablet XD-1212-U on usb2:2.0

Updated wacom.c
The wacom.c driver that is available in linuxwacom-0.7.2.tar.bz2 has a number of updates which cannot be found in many distributions yet.

This driver supports the new tablets: Intuos3 6x11, Graphire4, PL710, DTF720, and Volito2. It also reports tool ID and serial number.

The driver contains additional debugging code which may be useful in diagnosing data flow problems.

On newer kernel versions, 2.6.8 or later, you can link Wacom USB tablet to "/dev/input/wacom#", where # is a number when you have more than one Wacom tablet on the system. It can be done by adding the following rules in /etc/udev/rules.d/10-wacom.rules:

KERNEL="event*", SYSFS{idVendor}="056a", NAME="input/%k", SYMLINK="input/wacom%e"

Fedore Core and RHEL use SYSFS{manufacturer}="WACOM" instead of SYSFS{idVendor}="056a" in the file, which is wrong. You need to modify it. If you only have one Wacom tablet, SYMLINK="input/wacom" instead of SYMLINK="input/wacom%e" to avoid port changes after hot-plugging the device. If you have more than one Wacom tablets plugged on the system, specify the link with product id is recommanded:

KERNEL="event*", SYSFS{idVendor}="056a", SYSFS{idProduct}="00B5", NAME="input/%k", SYMLINK="input/intuos3" KERNEL="event*", SYSFS{idVendor}="056a", SYSFS{idProduct}="0015", NAME="input/%k", SYMLINK="input/graphire4"

Building wacom.c (for kernel 2.4)
To build the wacom.o kernel module, you need configure the package with --enable-wacom option. The kernel sources are required as described on the [#config configuration] page. 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.4 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         usbmouse.o - no             evdev.o - no          mousedev.o - no             input.o - no         tabletdev.o - no         wacom_drv.o - no

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

To build the driver, just run make.

The output will be a file called wacom.o. It is located in the linuxwacom package's src/2.4 directory for versions older than 2.4.22. For versions 2.4.22 or newer, it is in src/2.4.22 directory. This is your replacement driver.

Building wacom.c (for kernel 2.6)
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 [#config 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         usbmouse.o - no             evdev.o - no          mousedev.o - no             input.o - no         tabletdev.o - no         wacom_drv.o - no

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

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

Testing If wacom.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 [#root 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.4.22 system.

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

Kernels 2.6.0 and 2.6.1 are handled in src/2.6. Kernel 2.6.11 and 2.6.12 are in src/2.6.11."

[root@ayukawa linuxwacom]# cd src/2.4.22 [root@ayukawa 2.4.22]# rmmod wacom [root@ayukawa 2.4.22]# insmod ./wacom.o     # for those about to rock, we salute you.

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 "insmod wacom.o" and happen to be in the wrong directory, the old driver reloads, sometimes without warning. I therefore changed this to read "insmod ./wacom.o" 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 Apr 03 20:34:41 ayukawa kernel: usb.c: registered new driver wacom Apr 03 20:34:41 ayukawa kernel: Reporting max 30480, 31680 Apr 03 20:34:41 ayukawa kernel: wacom.c: Setting tablet report for tablet data Apr 03 20:34:41 ayukawa kernel: input0: Wacom Intuos2 12x12 on usb2:3.0 Apr 03 20:34:41 ayukawa kernel: wacom.c: $1.43-0.7.2 Vojtech Pavlik &lt;vojtech@suse.cz&gt; Apr 03 20:34:41 ayukawa kernel: wacom.c: USB Wacom Graphire and Wacom Intuos tablet driver (MODIFIED-DEBUG)

The important detail is the version number. A version number like "1.30" is an original kernel version and not from the linuxwacom package. The correct version should also have the -0.7.2 portion as well. Also, future versions of the driver will say "LINUXWACOM-DEBUG" or similar rather than "MODIFIED-DEBUG" as shown above. 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.o
For Kernel 2.6.x, replace wacom.o with wacom.ko where it is used.

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.o". 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.o" 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 using a beta driver, 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. The linuxwacom tarballs will be marked as beta if I am not absolutely convinced that they are stable. On the other hand, the new features will be in beta tarballs before they are marked stable, so there you have it. For the first time through this document, I would recommend installing the files found in the stable tarball. If you really know what you're doing, just load the drivers manually like in the previous section.

On some distributions, Mandrake or Mandriva included, the wacom.o (or wacom.ko) driver that appears in the kernel modules directory appears to be compressed. If you cannot find wacom.o (or wacom.ko) using the method below, try locating wacom.o.gz (or 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.o /lib/modules/2.4.18-14/kernel/drivers/usb/wacom.o /lib/modules/2.4.18-18.8.0/kernel/drivers/usb/wacom.o

[jej@ayukawa wacom]$ uname -r 2.4.18-18.8.0

On this computer, there are two kernels installed. uname identifies the currently active kernel as 2.4.18-18.8.0. The correct driver to replace is therefore at /lib/modules/2.4.18-18.8.0/kernel/drivers/usb/wacom.o. 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.4.18-18.8.0/kernel/drivers/usb [jej@ayukawa usb]# cp wacom.o /home/jej/src/wacom/wacom_old.o [jej@ayukawa usb]# cp /home/jej/src/wacom/wacom.o wacom.o

Here, I've saved the original to wacom_old.o 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.

Here is an example from a 2.6.12 system on Mandriva.

jej@ayukawa wacom]$ locate wacom.ko.gz /lib/modules/2.6.12-12mdksmp/kernel/drivers/usb/input/wacom.o /lib/modules/2.6.12-12mdksmp/kernel/drivers/usb/input/wacom.o

[jej@ayukawa wacom]$ uname -r 2.6.12-12mdksmp

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 Apr 03 21:23:35 ayukawa kernel: usb.c: registered new driver wacom Apr 03 21:23:35 ayukawa kernel: wacom.c: v1.43-0.7.2 Vojtech Pavlik &lt;vojtech@suse.cz&gt; Apr 03 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.7.2 so the correct driver was loaded.

Building usbmouse.o, evdev.o, mousedev.o, and hid.o (for kernel 2.4)
In the linuxwacom-0.7.2.tar.bz2 file, you will find mousedev.c, usbmouse.c, hid-core.c, evdev.c, and input.c files which have special exceptions for wacom. These files are not built by default, so you will need to reconfigure the package and run make again.

If your kernel is older than 2.4.22, the modules will be built using the sources at src/2.4. If your kernel is 2.4.22 or newer, the modules will be built using the sources at src/2.4.22. input.o is only needed for kernels older than 2.4.22.

[jej@ayukawa wacom]$./configure --enable-hid --enable-usbmouse --enable-mousedev --enable-evdev --enable-input --with-kernel=your-kernel-src-dir ...  BUILD OPTIONS: hid.o - yes usbmouse.o - yes evdev.o - yes mousedev.o - yes input.o - yes ... [jej@ayukawa wacom]$ make

First off, if the code does not build, and you cannot chase the problem down yourself, send me a line. If your kernel is much older than 2.4.18, then you may have to resign yourself to the fact that the 2.4.19 drivers are not going to work for you. I would recommend upgrading your kernel.

Before installing the drivers, please backup the originals. Then, use the following steps to install the drivers into the proper directories. Use locate as you did for the wacom.o file if necessary.

For systems with kernel 2.4 and older than kernel 2.4.22:

[jej@ayukawa wacom]$su [jej@ayukawa wacom]#cd src/2.4 [jej@ayukawa 2.4]#cp hid.o /lib/modules/your-kernel-ver/kernel/drivers/usb [jej@ayukawa 2.4]#cp usbmouse.o /lib/modules/your-kernel-ver/kernel/drivers/usb [jej@ayukawa 2.4]#cp evdev.o /lib/modules/your-kernel-ver/kernel/drivers/input [jej@ayukawa 2.4]#cp mousedev.o /lib/modules/your-kernel-ver/kernel/drivers/input [jej@ayukawa 2.4]#cp input.o /lib/modules/your-kernel-ver/kernel/drivers/input [jej@ayukawa 2.4]#reboot

For systems with kernel 2.4.22 or newer:

[jej@ayukawa wacom]$su [jej@ayukawa wacom]#cd src/2.4.22 [jej@ayukawa 2.4.22]#cp hid.o /lib/modules/your-kernel-ver/kernel/drivers/usb [jej@ayukawa 2.4.22]#cp usbmouse.o /lib/modules/your-kernel-ver/kernel/drivers/usb [jej@ayukawa 2.4.22]#cp evdev.o /lib/modules/your-kernel-ver/kernel/drivers/input [jej@ayukawa 2.4.22]#cp mousedev.o /lib/modules/your-kernel-ver/kernel/drivers/input [jej@ayukawa 2.4.22]#reboot

As before with some other distributions, if the files in the kernel module directory are compressed, you'll need to run gzip on the .o files to get .o.gz files.

Building (usb)hid.ko (for kernel 2.6)
In the linuxwacom-0.7.2.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.

As for wacom.c, you need to configure usbhid as a module under your kernel source tree before configuring linuxwacom.

On some distributions, Mandrake or Mandriva included, the usbhid.ko driver that appears in the kernel modules directory appears to be compressed. You need to run gzip on the module and copy usbhid.ko.gz instead.

[jej@ayukawa wacom]$./configure --enable-hid --with-kernel=your-kernel-src-dir ...  BUILD OPTIONS: hid.o - yes ...

Kernels 2.6.0 and 2.6.1 are handled in src/2.6. Kernel 2.6.11 and 2.6.12 are in src/2.6.11. 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 me 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 to see the steps with light blue background.

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

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 doing the following:

[root@ayukawa root]# grep -i 56a /var/log/messages | tail -10 Apr 03 21:03:09 ayukawa /etc/hotplug/usb.agent: Setup mousedev for USB product 56a/44/115 Apr 03 21:27:48 ayukawa kernel: usb.c: USB device 2 (vend/prod 0x56a/0x44) is not claimed by any active driver.

In this case, the tablet identifier is 56a/44 (also written 0x56a/0x44). The model is determined by the second number; the Intuos2 12x12 is 0x44 for instance.

In the wacom.c file, 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 in hid-core.c. It has a table called "hid_blacklist" which identifies devices to ignore. The code is a little strange, but PENPARTNER is 0x00, GRAPHIRE is 0x10, INTUOS is 0x20, PL is 0x30, and INTUOS2 is 0x40. A table entry like INTUOS2 + 4 would therefore be 0x44.

If you've gotten this far, and still cannot get it to work, send me email 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
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. It is reported on Fedora Core 2 the event0 used for kernel 2.4 is represented as event2 when switching to kernel 2.6.1-1.65. If no output occurs on those ports, reload the drive:

[jej@sasami root]# rmmod wacom [jej@sasami root]# modprobe wacom      (or insmod mydir/src/wacom.o) [jej@sasami root]# tail /var/log/messages Apr 03 17:31:31 sasami kernel: usb.c: deregistering driver wacom Apr 03 17:31:34 sasami kernel: usb.c: registered new driver wacom Apr 03 17:31:35 sasami kernel: input0: Wacom Intuos2 12x12 on usb1:2.0 Apr 03 17:31:35 sasami kernel: wacom.c: v1.43-0.7.2 Vojtech Pavlik &lt;vojtech@suse.cz&gt;

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.

Using 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 XFree86. Generally, you must be root to run it unless you've set the permissions on the appropriate device such that you can read them.

Building wacdump

Serial users who have been following along will not have built wacdump by this point while USB users should already have it. 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 directory. Running make install, will install it under /usr/local/bin.

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 (and/or XF86Config-4) 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 XFree86 has it open. Access denied errors probably indicate that [#root 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. This will likely change in the future.

Configuring XFree86/X11R6
Two steps must be completed to get X to recognize your tablet. First, you need to add some lines to XF86Config 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 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 driver are available in the stable and beta releases on the [#download 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 you pen if it is clickable), cursor, and pad (on your tablet if your tablet has) as XInput devices. Applications that want to know the absolute position of your tools (stylus, eraser, and cursor) can request that information directly, and this generally bypasses whatever the mouse happens to be doing at the time. This design is not without problems though. For one, changing your setup or adding a new tool normally requires making c hanges to the /etc/X11/XF86Config or /etc/X11/xorg.conf configuration file and restarting X. This should be fixed in the future.

For now, however, add the InputDevice sections to your XF86Config/xorg.conf file. This assumes you are running XFree86 4.x or Xorg 6.x. 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 and USB devices are given. For Tablet PCs, options "Device" and "ForceDevice" should be included. You should also change the device (e.g. ttyS0) to the correct one for your tablet. Tablet PC and Cintiq/PL 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/event0"   # USB ONLY Option       "Type"          "stylus" Option       "USB"           "on"                  # USB ONLY Option       "ForceDevice"   "ISDV4"               # Tablet PC ONLY EndSection

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

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

# This section is for Intuos3, Cintiq 21UX, or Graphire4 only Section "InputDevice" Driver       "wacom" Identifier   "pad" Option       "Device"        "/dev/ttyS0"          # SERIAL ONLY Option       "Device"        "/dev/input/event0"   # USB ONLY Option       "Type"          "pad" Option       "USB"           "on"                  # USB ONLY EndSection

The above four sections identify the stylus, eraser, cursor, and pad devices to XInput. Notice that all four reference the same device /dev/ttyS0 or /dev/input/event0 depending on whether its a serial or USB tablet.

The configuration options listed by your system's man page is way out of date. Below is an updated wacom man page. We will commit this page to XFree86/Xorg CVS repository as soon as we get enough positive feedbacks from users like you.

WACOM(4)                                                             WACOM(4)

NAME wacom - Wacom input driver

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

DESCRIPTION wacom is an Xorg 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"|"pad" sets the type of tool the device represents. This option is                   mandatory. "pad" is for Intuos 3 or Cintiq 21UX Tablet Menu Strip(s) only. It is required for Intuos 3 and Cintiq 21UX if your application supports Tablet Menu Strip features. "pad" is reported as a second tool in the driver. Since it  		   will not move the system's cursor,  IT  SHOULD NOT have any of those core options, such as  "SendCoreEvents"  or "AlwaysCore.

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  Tablet PC                    way. Tablet PC is a serial tablet using a special Wacom IV                   protocol, called ISDV4 protocol. This option is mandatory for Tablet PC.

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 6, 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 wheel value and the previous one is equal to or greater than suppress;

button value has changed;

proximity has changed.

Option "Mode" "Relative"|"Absolute" sets the mode of the device.

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

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

Option "BottomX" "number" X coordinate of the bottom corner of the active zone.

Option "BottomY" "number" Y coordinate of the bottom corner of the active zone.

Option "ButtonsOnly" "on" disables the device's motion events.

Option "ButtonM" "N" reports a button N click when button M is pressed, where M                    is one of the wacom supported  button numbers,  it can be 1 to 16 and N can be an integer between 1 and 19. The default value for button M is M. When N is less than 17,  button M                    is  assigned to  the  function of  button N.  When N is 17, button M is a left-double-click. When N is 18, button M is                    ignored,  i.e.,  no  button  event  will be  reported  when clicking on button M. When N is 19, button M is assigned to                    Mode Toggle,  switching between relative and absolute mode, which is especially useful to switch  windows in a  multi- monitor environment.

Option "TPCButton" "on" 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 PC;  "off"  for all  the other models

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

Option "TVResolution" "res1,res2" specifies different  resolutions  for the  two  screens in                    TwinView setup. For example, if the resolution of screen 1 (res1) is 1024x768 and screen 2 (res2) 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.

Option "Rotate" "CW"|"CCW"|"NONE" rotates the tablet orientation clockwise (CCW) or anti- clockwise (CW). 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. There are 12 levels, 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.

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 which serial number belongs to a device, you have to set the DebugLevel to 6 and watch the output of the X log.

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 &lt;lepied@xfree86.org&gt;, Ping Cheng &lt;pingc@wacom.com&gt;, John E. Joganic &lt;jej@j&acirc;&euro;&#144;arkadia.com&gt;

X.Org                              Version 6.8.1                     WACOM(4)

Mouse1 (for all kernel 2.4 systems and 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 elminate 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" InputDevice   "pad" EndSection
 * 1) For non-LCD tablets only
 * 1) For Intuos3/Cintiq 21UX/Graphire4 tablets. It should NOT send core event'''

This section determines which devices are actually used by the server. In the case above, the cursor, stylus, and eraser devices are selected while the mouse1 and tablet devices are commented out. At present, this is the correct configuration for proper operation of the tablet whether you are using the beta package or the production package. Pad should not send core events. So, it should not include "SendCoreEvents" or "AlwaysCore".

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 file changes. By aware that if you reboot your computer with the Wacom plugged in and Redhat's Anaconda program notices, it will 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 seems to reverse the process, but again, you should check the file to be certain. My recommendation is to tell Anaconda to ignore the tablet until the device detection works properly.

Updating wacom_drv.o
The [#download Downloading the Code] page currently offers source and binary for 47-0.7.2 in the stable package and 47-0.7.3 in the beta version. I recommend using the X driver and the Wacom Control Panel in the package that you get the kernel drivers ( if you use a USB tablet ) since they are in sync on supporting new functionality and new tablet models.

Note: the binary wacom_drv.o file is located in the prebuilt directory of the stable and beta packages. Instructions for rebuilding from source are available in the Appendix under [#builddrv Building wacom_drv.o from Scratch] if you are a developer yourself or the binary is not compatible with your system.

With that said, locate and replace wacom_drv.o. Using locate, we find the driver in the X11R6 tree. This directory is pretty standard, so it is unlikely that your file will be located elsewhere. Note the assumption is that you are using XFree86 4.x or X11R6.x.

[root@ayukawa root]# locate wacom_drv.o /usr/X11R6/lib/modules/input/wacom_drv.o [root@ayukawa root]# cd /usr/X11R6/lib/modules/input [root@ayukawa input]# cp wacom_drv.o  /home/jej/src/wacom/wacom_drv_old.o [root@ayukawa input]# cp /home/jej/linuxwacom-47-0.7.2/prebuilt/wacom_drv.o_ x  wacom_drv.o where x stands for XFree86 version or xorg.

The old file is copied away, and replaced with the newer version. If it does not load on your system, please let me know.

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 file and try again. Worse case, copy the wacom_drv_old.o file back to its original place. But first, look at the XFree86 log file 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.7.2 $ (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.7.2 above. This is the new stable wacom_drv.o driver. The beta driver is currently 47-0.7.3.

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" can be set to values between 1 and 11, with 11 being way too much, and 1 being fairly useful.

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]

Using 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, and eraser 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.

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 directory. It is installed by running make install.

Running xidump
xidump takes one argument, the input device specified in your XF86Config file. Ordinarily, this would be either stylus, cursor, or eraser, but 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.

[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=0, max=0, max=30480 axis[1]: res=0, max=0, max=30480 axis[2]: res=39, max=0, max=1023 axis[3]: res=1, max=-64, max=63 axis[4]: res=1, max=-64, max=63 axis[5]: res=1, max=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 ... 16.87158095: Motion: x= +4941 y=+27842 p= 225 tx= +41 ty= +67 w=  +0 16.87164395: Button: 1 DOWN 16.87169595: Motion: x= +4964 y=+27844 p= 398 tx= +42 ty= +66 w=  +0 ... 17.27328395: Motion: x= +5261 y=+27543 p=  3 tx= +48 ty= +64 w=   +0 17.27334395: Button: 1 UP 17.27515995: Motion: x= +5348 y=+27451 p=  4 tx= +48 ty= +63 w=   +0 ... 17.35933795: Motion: x= +7089 y=+27061 p=  4 tx= +48 ty= +63 w=   +0 17.37444395: Proximity Out &lt;Ctrl-C&gt;

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  Axes: 6  Buffer: 0

x-axis   y-axis   pressure   x-tilt    y-tilt     wheel data: +10826    +09919    +00004    +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 display 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. The future GTK mode will be available in the same manner. Adding the --verbose option increases the amount of output, and when used in conjunction with --list, displays the device capabilities.

Out of Range Values

At present, we are discovering a number of problems with out-of-range values. Rest assured, we are looking into it, so if you encounter them yourself, you might consider check the mailing list for similar problems, and if your problem is unique, let us know. When the driver is behaving better, I'll increase the priority of this class of problem. Until then, you'll probably just get a message back saying "sorry, and yes, we know." The most serious problem seems to be with runaway pressure settings, so those will get investigated first.

Tablet PC
The Wacom digitizers embedded in Tablet PCs utilitizes a special protocol IV, ISDV4. Similar to the conventional serial tablets, tablet PCs use a serial controller (UART). But, normally, they are not set to any serial ports. They are effectively serial devices, but require special configuration (setserial) under Linux.

Here is a sample command line for Tablet PC. The IO port may be different for your Tablet PC.

[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 script. I normally add it into /etc/rc.d/rc.local. Here is my rc.local:

#
 * 1) !/bin/sh
 * 1) This script will be executed *after* all the other init scripts.
 * 2) You can put your own initialization stuff in here if you don't
 * 3) 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 src]$ ./wacdump -f c100 /dev/ttyS2      # Wacom digitizer on fake COM3

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 XFree86/X11R6).

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

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

Refer to Adding the InputDevices for details.

HP Tablet PCs require you explicitly run the following program before setserial. This is due to the fact that Wacom Digitizer on HP Tablet PCs are not mapped to any serial port by default.

Please compile tc1100ts.c as mentioned below and copy the executable (tc1100ts) to /usr/sbin. Then add the following two lines to the end of your /etc/rc.d/rc.local: /usr/sbin/tc1100ts setserial /dev/ttyS2 port 0x03e8 autoconfig

Mapping Wacom Digitizer to /dev/ttyS2 for HP Tablet PC

/* * HP TC1100 Touchscreen Enable * Copyright (c) 2004 Hewlett-Packard Co. * * Compile with `cc -O2 -o tc1100ts tc1100ts.c', * and run as root with `./tc1100ts'. * * This standalone program enables the Serial Port 1 * (SP1) of the NS LPC Super I/O, where the Wacom * Digitizer is connected to on the HP TC1100 Tablet PC. * * The serial device is mapped to 0x3e8 IRQ0-4 to match * the default /dev/ttyS2 port and IRQ mapping on Linux. * * To proof that the Wacom Digitizer is enabled by this * standalone, do the following: * - Change to superuser mode, i.e. root * - setserial /dev/ttyS2 *  it should return: *  /dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4 * - ./tc1100ts * - setserial /dev/ttyS2 autoconfig * - setserial /dev/ttyS2 *  now returns: *  /dev/ttyS2, UART: 16550A, Port: 0x03e8, IRQ: 4 * */


 * 1) include
 * 2) include
 * 3) include
 * 4) include

const int cfgindex = 0x4e; const int cfgdata = 0x4f;


 * 1) define wsio(i,d) {outb(i,cfgindex); outb(d,cfgdata);}

int main {  /* Get access to the ports */ if (iopl(3)) {perror("iopl"); exit(1);}

// See the SuperIO Specificatio for details of each register wsio(0x07,0x03); // Select Logical Device - Serial Port 1 wsio(0x30,0x00); // De-activate Logical Device wsio(0x60,0x03); // I/O Port Base [15-08] wsio(0x61,0xe8); // I/O Port Base [07-00] wsio(0x70,0x14); // Enables Wake-up on IRQ4 wsio(0x71,0x03); // Level IRQ Req, Hi priority wsio(0x74,0x04); // DMA Channel Select 0 - no DMA wsio(0x75,0x04); // DMA Channel Select 1 - no DMA wsio(0x30,0x01); // Activate Logical Device

/* We don't need the ports anymore */ if (iopl(0)) {perror("iopl"); exit(1);}

exit(0); }

/* end of tc1100ts.c */

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

However, it is reported that there are systems on which you can not run xsetwacom due to some XFree86 interface error. We did not figure out the root cause of this problem yet. Please check [#success Success Stories] page to see if your system is in question. If it is, you'll have to add the configuration options to your /etc/X11/XF86Config file. Please refer [#x11 Configuring XFree86] for details.

Building xsetwacom
xsetwacom uses libwacomcfg.so to communicate with Wacom XFree86 driver, wacom_drv.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. If your Xlib is not installed under /usr/X11R6, 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 - i686 linux kernel - yes 2.4 module versioning - yes -DONFIG_MODVERSIONS -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h      kernel source - 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 - 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 libwacomcfg and xsetwacom 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 stored in the linuxwacom package's src and src/.libs directory. They will be installed by running make install (you need to switch to superuser to run this command).

If wacom_drv.o was running while installing xsetwacom, xsetwacom can be launched immediately after make install and exit (switch back to your own account).

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.o. We strongly recommand to build and install the wacom_drv.o and xsetwacom from the same release package since the out of sync wacom_drv.o and xsetwacom may crash your X server.

Running xsetwacom

[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

Commands: list [dev|param]          - display known devices, parameters set dev_name param [values...]  - set device parameter by name

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 excuting 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 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 17

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

Below is a list of the parameters and their values used by xsetwacom set command:

param      [values...]             results --   Mode        Relative|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 ButtonM    integer (1 - 16)     sets button M to button integer click ButtonM    17                   sets button M to left-double-click ButtonM    18                   ignores button M click ButtonM    19                   sets button M to Mode Toggle PressCurve i1,i2,i3,i4          sets the pressure bezier curve, where i1+i4=100; i2+i4=100 DebugLevel integer (1 - 12)     sets the level of debugging trace SpeedLevel integer (1 - 11)     sets relative cursor movement speed ClickForce integer (1 - 21)     sets tip/eraser pressure threshold xyDefault                       resets the bounding coordinates to default in tablet units gimp       on|off               turns on/off Gimp support in (non-TwinView) Xinerama-enabled environment to deal with a Gimp issue mmonitor   on|off               turns on/off across monitor movement on (non-TwinView) multi-monitor desktop TPCButton  on|off               turns on/off the buttons as Tablet PC buttons --

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 Stylus0 TopX 10 xsetwacom set Stylus0 TopY 67 xsetwacom set Stylus0 BottomX 7170 xsetwacom set Stylus0 BottomY 5778 xsetwacom set Stylus0 TPCButton 1 . /etc/X11/xinit/xinitrc
 * 1) run the primary system script

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. To see what's under your home directory, use ls -al ~.

Using wacomcpl
The wacomcpl is a graphic Wacom driver configuration tool. It changes the pressure sensitivity, click threshold, button functions, cursor mode and speed without having to manually modify XF86Config 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, a file under your home directory, will be updated each time you run wacomcpl. The .xinitrc 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 your system doesn't execute .xinitrc at login, after exiting from wacomcpl, you will need to copy those xsetwacom commands in .xinitrc into the startup script (.bashrc, .cshrc, .profile, etc.) that your system launches.

However, it is reported that there are systems on which can not run wacomcpl due to some XFree86 interface error. We did not figure out the root cause of this problem yet. Please check [#success Success Stories] page to see if your system is in question. If it is, you'll have to add the configuration options to your /etc/X11/XF86Config file. Please refer [#x11 Configuring XFree86] for details.

Building wacomcpl
wacomcpl is written in tcl/tk. It uses libwacomxi.so and xsetwacom to communicate with Wacom XFree86 driver, wacom_drv.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.4 module versioning - yes kernel source - 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 - 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 aren't 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.4 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.4 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 GTK - 2.0.6

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, src/.libs, 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).

Running wacomcpl
If wacom_drv.o was running while installing wacomcpl, wacomcpl can be launched immediately after make install and exit (switch back to your own account).

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

Working With Gimp
It has been suggested that gimp should be recompiled from source (v1.2.3) on Mandrake 9.0. This does not seem to be true for Redhat 8.0. It is also reported that Slackware didn't configure gtk with xinput support. So, when you rebuild gtk, please make sure to configure the package with xinput=xfree option, i.e., use ./configure --with-xinput=xfree. As of March 23, 2004, newer Slackware shipping with gtk2 has configured with xinput.

Bring up gimp and select "File -&gt; Dialogs -&gt; Input Devices" if using 1.x or "File -&gt; Preferences -&gt; Input Devices -&gt; Configure Extended Input Devices" if using 2.x. You will see a drop-down list with all three devices present. After enabling them, you can see their respective statuses by calling up "File -&gt; Dialogs -&gt; 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.

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!

Contacts
Ping Cheng can be contacted at the following email address: [mailto:%20pingc@wacom.com?SUBJECT=WACOM pingc@wacom.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.

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 [#debwcmdrv 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 applie 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.

Installing wacom driver On Debian
The following documentation for building wacom driver on Debian was written by Olivier Lecarme. You can also refer to Olivier's page here for updates.

Copyright (C) June 14, 2005 Olivier Lecarme.

I'm using the Sid version of Debian, but I was told that the Sarge distribution, recently become the stable one, already contains what is necessary. Version 2.6.11 of the kernel is the highly preferred one by people maintaining the Linux Wacom software.

Download the 2.6.11 kernel

I was completely unsuccessful when trying to configure and compile my own kernel: certainly I omitted some capital module, but I could  not decide what it was. Thus, I chose the last pre-compiled kernel.


 * apt-get kernel-image-2.6.11-1-686
 * apt-get kernel-headers-2.6.11-1-686

If you use Lilo, configure your /etc/lilo.conf file, taking into account that this kernel needs an initrd= line.

Optionally
If your case is irrelevant, please skip this section and the following one.


 * I Have a Broadcom NetXtreme BCM5751 Ethernet card, which needs the tigon3 driver, unavailable in Debian kernel 2.6.11. The solution is here.

Thus I got the package:


 * cd /usr/src
 * wget http://www.acm.rpi.edu/~dilinger/kernel-source-nonfree-2.6.11/kernel-nonfree-modules-2.6.11-1-686-2.6.11-1_i386.deb


 * .     I have an ATI X 300 video card, whose driver is not available in Debian kernel 2.6.11. The solution is here.

Thus I got the packages:


 * for the driver: wget http://www.stanchina.net/~flavio/debian-fglrx-xfree86/fglrx-driver_8.12.10-1_i386.deb
 * and for the kernel module: wget http://www.stanchina.net/~flavio/debian-fglrx-modules/fglrx-kernel-2.6.11-1-686-smp_8.12.10-1+2.6.11-2_i386.deb

Install the optional packages

 * cd /usr/src


 * dpkg -i kernel-nonfree-modules-2.6.11-1-686_2.6.11-1_i386.deb


 * dpkg -i fglrx-driver_8.12.10-1_i386.deb


 * dpkg -i fglrx-kernel-2.6.11-1-686_8.12.10-1+2.6.11-2_i386.deb

Install the wacom tools package

 * apt-get install wacom-tools


 * dpkg-reconfigure wacom-kernel-source

Since your debconf configuration probably did not ask for the lowest priority questions, this step is needed. You might also use it later if you update your kernel, for instance.

When asked whether you want to build the modules, answer yes, and tell where the headers are located (normally /usr/src/kernel-headers-2.6.11-1-686).

Prepare for the /dev/input/wacom link
In /etc/udev/rules.d/10-wacom.rules, add the following line:

KERNEL="event*", SYSFS{idVendor}="056a", NAME="input/%k", SYMLINK="input/wacom%e"

Thus the drivers will find the Wacom tablet, whatever its /dev/input/eventX address is.

Change your XF86Config-4 file
The important sections are:


 * The ServerLayout section:

Section "ServerLayout" [ ... ] 	InputDevice   "stylus"	   "SendCoreEvents" InputDevice   "eraser"	   "SendCoreEvents" InputDevice   "cursor"	   "SendCoreEvents" InputDevice   "pad" EndSection


 * The InputDevice sections:

Section "InputDevice" Identifier  "stylus" Driver	    "wacom" Option	    "Type" "stylus" Option	    "USB" "on" Option	    "Threshold" "10" Option	    "Device" "/dev/input/wacom" EndSection

Section "InputDevice" Identifier  "eraser" Driver	    "wacom" Option	    "Type" "eraser" Option	    "USB" "on" Option	    "Threshold" "10" Option	    "Device" "/dev/input/wacom" EndSection

Section "InputDevice" Identifier  "cursor" Driver	    "wacom" Option	    "Type" "cursor" Option	    "USB" "on" Option	    "Threshold" "10" Option	    "Device" "/dev/input/wacom" EndSection

Section "InputDevice" Identifier "pad" Driver "wacom" Option "Device" "/dev/input/wacom" Option "Type" "pad" Option "USB" "on" EndSection


 * The section dealing with your normal mouse must be considered too. See.

I didn't use /dev/psaux nor /dev/input/mice. /dev/input/mouse0 works for a PS/2 mouse. For a USB mouse, there is a problem mentioned in the Remaining problems.


 * If you use the ATI X300 card, you need to change also the Device section:

Section "Device" Identifier     "ATI" Driver         "fglrx" Option "VideoOverlay" "on" Option "OpenGLOverlay" "off" Option "UseInternalAGPGART" "no" EndSection

Final steps

 * Reboot. This will also restart the X server, of course.
 * Enjoy!

If you want to use the expresskeys of your Intuos tablet
If you do nothing more, the pad is not usable at all. However, you will find here a specific tool for having the pad available in various programs, for example XTerm, Gimp, or Blender. This tool is very easy to compile, install, and use. If you want to use the pad in Gimp, do not enable it in "Preferences -&gt; Input Devices -&gt; Configure the extended input devices", contrarily to the three other tools (stylus, eraser, and cursor). You can easily configure what the expresskeys send, according to your tastes, and use only them for the tasks that need a good control of the stylus or eraser.

Remaining problems
If your tablet is always plugged, everything works perfectly. If you want to plug it out, for example in order to move it onto another computer, and then to plug it back later, problems begin.

For the present, you must take care of the following things:


 * If you plug in the tablet again, the corresponding driver is not informed of this, thus you must restart the X server.


 * If the tablet is plugged when you reboot, and you have an USB mouse, maybe the /dev/input address of this mouse is not the same as the previous time. Thus you will have to change this in your XF86Config-4 file.


 * If you use GDM or KDM or XDM, you should plug in the tablet after rebooting, but before the X server starts, which is somewhat difficult! Thus you will be forced  to restart the X server, i.e. kill it (Ctrl+Alt+Backspace) and not simply logging out.

Final remarks
I would like to thank all persons who helped me, on the LinuxWacom or the Gimp-user discussion lists, especially Carol Spears, Karine Delvare, Ping Cheng, and Ron.

Building wacom driver On PowerMac
The following documentation for building wacom driver on PowerMac [silver] was written by Joseph E. Sacco. If you have any problems or questions, go ahead and post them to the list, or send email to me directly. I'll forward your email on to Joseph.  Copyright (C) 2004 Joseph E. Sacco 

System:

&lt;&lt; Hardware &gt;&gt; * PowerMac [silver] with dual 533 MHz G4 [7410] CPU's, 1GB RAM, (3) 73 GB SCSI drives * Contour UniMouse [USB, optical, three button] * Wacom Intuos Tablet [USB]: GD-1218-U * 4-d mouse * pen * air brush

&lt;&lt; Software &gt;&gt; * Yellow Dog Linux 3.0.1 [Redhat variant for PPC] * kernel: 2.4.25-ben1 * linuxwacom-0.6.1

* XFree86-4.3.0-2.1e * atk-1.6.0-1 * freetype-2.1.3-4 * gcc-3.3 * gtk+-2.4.0 * glib2-2.4.0 * ncurses-5.2-28 * pango-1.4.0

============================================================

I have a Wacom Intuos tablet "working" [after a fashion] on a PPC running Yellow Dog Linux 3.0.1.

&lt;&lt; What works &gt;&gt; * input devices: * cursor movement * button clicks * wheel rotation [as seen from wacdump] * pressure [as seen from wacdump &amp; gimp] * tilt [as seen from wacdump]

* applications: * wacdump * xidump * xev * xinput-1.2 * gimp-1.25 &amp; gimp-2.0 * dia-0.9.2

&lt; What does *not* work &gt;&gt; * input devices: * Mode "Relative" for pen &amp; air brush [should it???]

* applications: * xsetwacom * wacomcpl [because of xsetwacom]

There are some issues I would like to report.


 * Makefiles The makefiles are set up for Intel architecture. Some options are not applicable for PPC's.

[ from ./src/2.4.22/Makefile.in ] KCFLAGS = -Wall $(DEBUG_FLAGS) -D__KERNEL__ \ -DMODULE -DEXPORT_SYMTAB $(MODS) \ -Wstrict-prototypes -Wno-trigraphs -O2 \ -fno-strict-aliasing \ -fno-common -fomit-frame-pointer -pipe \ ===&gt;   -mpreferred-stack-boundary=2 \ ===&gt;    -march=$(ARCHITECTURE)

The last two options are not applicable to a PPC.

A more appropriate set of flags, taken from building the 2.4.25 kernel modules, might be:

KCFLAGS = -Wall $(DEBUG_FLAGS) -D__KERNEL__ \ -Wstrict-prototypes -Wno-trigraphs -O2 \ -fno-strict-aliasing -fno-common -fomit-frame-pointer \ -fsigned-char -msoft-float -pipe -ffixed-r2 \ -Wno-uninitialized -mmultiple -mstring \ -DMODULE -DMODVERSIONS -iwithprefix

[ from ./src/Makefile.in ] $(XF86OBJS): xf86Wacom.c Makefile ==&gt; gcc -O2 $(DEPFLAGS) -march=i386 -mcpu=$(ARCHITECTURE) -pipe -ansi \ -pedantic -Wall -Wpointer-arith $(NO_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 \ ==&gt;          -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 $(LINUX_INPUT) \ -o $@ -c $(subst .o,.c,$@)

A more appropriate set of flags, taken from building XFree86-4.3.0, might be:

$(XF86OBJS): xf86Wacom.c Makefile gcc -O2 $(DEPFLAGS) -mcpu=$(ARCHITECTURE) -pipe -ansi \ -pedantic -Wall -Wpointer-arith $(NO_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__powerpc__ -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_BIG_ENDIAN -DNDEBUG -DFUNCPROTO=15 \ -DNARROWPROTO -DIN_MODULE -DXFree86Module $(LINUX_INPUT) \ -o $@ -c $(subst .o,.c,$@)

where $(ARCHITECTURE) = powerppc [ppc will not work]


 * Kernel modules

I experimented with different ways of building [and loading] the kernel modules: * evdev.o    * hid.o     * mousedev.o     * wacom.o

I settled on building the modules within the existing framework for building the Linux kernel rather than using the makefiles provided by linuxwacom-0.6.1. I did so to insure that I got all the PPC dependency stuff right.


 * Hotplug kernel module issues

I had some issues using 'modprobe' to load the wacom kernel module that forced me to reconfigure and rebuild the 2.4.25-ben1 kernel.

A typical YDL kernel build for a PowerMac statically links most of the input core support into the kernel:

[from .config file provided by YDL] # Input core support #    CONFIG_INPUT=y CONFIG_INPUT_KEYBDEV=y CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_EVDEV=y

I had initially built only wacom.o as a loadable module. The other modules were statically linked into the kernel.

When wacom.o was loaded using:

$ /sbin/insmod wacom.o

all went well:

[output from /var/log/messages]

Mar 24 10:26:33 plantain kernel: usb.c: registered new driver wacom Mar 24 10:26:33 plantain kernel: Reporting max 45720, 31680 Mar 24 10:26:33 plantain kernel: wacom.c: Setting tablet report for tabletdata Mar 24 10:26:33 plantain kernel: input4: Wacom Intuos 12x18 on usb2:3.0 Mar 24 10:26:33 plantain kernel: wacom.c: v1.30-j0.6.1 Vojtech Pavlik Mar 24 10:26:33 plantain kernel: wacom.c: USB Wacom Graphire and Wacom Intuos tablet driver (LINUXWACOM-DEBUG) Mar 24 10:26:33 plantain kernel: wacom_events

When wacom.o was loaded using:

$ /sbin/modprobe wacom

the module failed to load:

$ /sbin/rmmod wacom $ /sbin/modprobe wacom modprobe: Can't locate module evdev which is needed for wacom

I was perplexed about this failure because "evdev" was statically linked into the kernel. I puzzled over this for a while and concluded that it had something to do with how USB hotplug was configured.

I arrived at this conclusion by unplugging the tablet, waiting, and then plugging it back in. I found that the tablet "worked" but there are complaints in /var/log/messages:

Mar 24 10:34:51 plantain kernel: usb.c: USB disconnect on device 10:19.0-1 address 3

Mar 24 10:35:53 plantain kernel: hub.c: new USB device 10:19.0-1, assigned address 4 Mar 24 10:35:53 plantain kernel: Reporting max 45720, 31680 Mar 24 10:35:53 plantain kernel: wacom.c: Setting tablet report for tablet data Mar 24 10:35:53 plantain kernel: input4: Wacom Intuos 12x18 on usb2:4.0 Mar 24 10:35:53 plantain kernel: wacom_intuos_irq: tool change 0x094 Mar 24 10:35:56 plantain /etc/hotplug/usb.agent: Setup wacom for USB product 56a/24/101 Mar 24 10:35:56 plantain /etc/hotplug/usb.agent: Setup evdev mousedev for USB product 56a/24/101 Mar 24 10:35:56 plantain modprobe: modprobe: Can't locate module evdev Mar 24 10:35:56 plantain modprobe: modprobe: Can't locate module mousedev

I really don't understand how the USB hotplug mechanisms are supposed to be configured. Yes... I did look at the scripts in /etc/hotplug. Yes.. I did attempt a few unsucessful modifications to usb.handmap and usb.distmap. I pondered over this for a while and then decided on a work-around:

I reconfigured and rebuilt the kernel to dynamically load * evdev.o   * hid.o    * mousedev.o    * wacom.o

which "eliminated" the problem.

If someone out there knows what should have been done to allow modprobe to successfully load wacom when evdev and friends are already statically linked into the kernel, please send me email.

* XFree86 module: wacom_drv.o I rebuilt wacom_drv.o using the linuxwacom-0.6.1 makefile and the flags listed above. The build was uneventful.

* Mouse1 I do not have a Mouse1 entry in XF86Config. I mention this because there is an obscure reference in the documentation to potential mouse conflict problems when running a USB Wacom mouse on a system with a USB mouse. The USB mouse connected to the system and the Wacom input devices all seem to work.

On my system:

/dev/mouse is a link to /dev/input/mice

Mouse0 is configured in XF86Config as:

Section "InputDevice" Identifier "Mouse0" Driver     "mouse" Option     "ZAxisMapping" "4 5" Option     "Protocol" "IMPS/2" Option     "Device" "/dev/input/mice" EndSection

Maybe something nasty is going on that I don't know about. Thoughts???

* xsetwacom There are problems...

The 'list' command prints stuff:

$ xsetwacom list eraser          eraser stylus          stylus cursor          cursor

The set command fails:

$ xsetwacom -v set stylus FileModel Set: sending 100 0 (0x0) Error (5): WacomConfigSetRawParam: Unknown X error Set: Failed to set stylus value for 'FileModel'

Looking at the code, I see that it is failing in a call to XChangeDeviceControl made from WacomConfigSetRawParam. I also poked around in this one with GDB. The X-Display gets opened properly. Things look OK until the request is dispatched, which then returns an unknown X error.

I also tried to use xsetwacom to toggle the cursor mode between relative and absolute. Again the command fails with an unkown X error. Note that the XFree86 command 'xsetmode' works fine.

-Joseph

Building wacom driver On Fedora Core 3
The following documentation for building wacom kernel modules and x.org driver on Fedora Core 3 was written by Paul Duffy. If you have any problems or questions, go ahead and post them to the list, or send email to me directly. If I cannot provide a satisfactory answer, I'll forward your email on to Paul.

Copyright (C) 2005 Paul Duffy

Procedure for building linuxwacom package on Fedora Core 3 with 2.6 series kernel. These instructions are current as of May 23, 2005. There are several reasons why FC3 is different. The two main reasons being:

- evdev, hid-core and mousedev are compiled into the kernel core so you can't just recompile them as modules.

- the Fedora Core kernel is heavily patched, which I don't mind as it means my Creative Live! Drive II works, but it does mean that compiling the kernel from www.kernel.org may lose you some hardware support.

Additionally, Red Hat no longer supply a simple linux-source rpm so if you want the official kernel source for Fedora Core 3 you're going to have to use the source RPM.

At this stage, I am assuming that you have a fully updated system and are using kernel 2.6.11-1.14_FC3

What you will need:

At this stage you're going to need all of the development packages required to compile the kernel (gcc, automake, etc) and the xorg-x11-sdk package installed (under Development &gt;&gt; X Software Development). If you're unsure where this all is, you can select the hat menu in KDE or Gnome and you want to select System Settings &gt;&gt; Add/Remove Applications.

If you're unsure as to exactly what you need to install, install everything (except gcc-java, it causes problems with Sun or IBM java installs) assuming you have the hard drive space.

Also the vast majority of this will require you to be in SuperUser mode so you might as well 'su' from the start; not normally advice I'd be giving anyone but it's kinda necessary in this case.

You have two choices for the first step; you can either download the kernel SRPM from one of the mirrors at http://fedora.redhat.com/download/mirrors.html where you can find the correct package as updates/3/SRPMS/kernel-2.6.11-1.14_FC3.src.rpm and install it with

rpm -ivh kernel-2.6.11-1.14_FC3.src.rpm

or you can use

up2date --get-source kernel

Either method should leave you with a lot of files in /usr/src/redhat/SOURCES and the file /usr/src/redhat/SPECS/kernel-2.6.spec At this stage, don't worry about all the files starting linux-2.6.9... the main file you are looking for is linux-2.6.11.tar.bz2. As long as that's there you should be fine.

Now, to actually get all the kernel sources setup in a compilable form you need to run the command

rpmbuild -bp --target= /usr/src/redhat/SPECS/kernel-2.6.spec

If you don't know what is, run the command

uname -m

and it should tell you. Of course, it should be noted at this point that if my architecture is i686 and I select that, what will actually be installed is the source configuration for i386 and above so if you're still not sure but you know you can run Windows then --target=i386 is a safe default.

After everything has been setup the rpmbuild will have applied all the standard patches and setup a default configuration so the only reason to run 'make config', or 'make xconfig', is to change something from the default.

Having said this, I like to run 'make xconfig' to alter the selected chip the kernel is going to compile for as it defaults to compiling for i386 whereas anyone with a reasonably recent chip (Athlon, Pentium III even) is going to want something a bit more advanced.

So, the first thing you want to do, if you want most add-on modules to find the kernel source without adding a really long command-line parameter, is to add a symbolic link to the source directory.

cd /usr/src ln -s redhat/BUILD/kernel-2.6.11/linux-2.6.11 linux

So now everything can find the current kernel source in /usr/src/linux

cd linux make xconfig

select 'Processor type and features' and change 'Processor family' from 386 to whatever it is you're running. If you make a mistake and you don't know what you've done you can always close the program and select 'Discard changes' and start again. Otherwise, click on the floppy disk icon to save and exit safe in the knowledge that you're not compiling for a CPU that doesn't even have a floating point unit.

OK, so by now you should have the basic kernel source setup and available in /usr/src/linux and, due to the setup of the default kernel, we can't just recompile a few modules, we have to recompile the whole kernel.

So at this stage, we're just about where we'd like to be if we wanted to compile the kernel as it is, with no support for the Intuos3 or any of the Cintix range but if you've got an AthlonXP or a Pentium 4 you might get a little bit more performance out of it.

We now want to be getting the latest linuxwacom-0.6.8.tar.bz2 You may want to setup your own arrangement for wherever you want it but your home directory should be fine and...

tar jxvf linuxwacom-0.6.8.tar.bz2 cd linuxwacom-0.6.8

...and you're in the source directory for the code that enables proper Wacom support.

Now we need to copy just four files, usbmouse.c has been deprecated in favour of hid-core.c and can be safely ignored, also we don't need to do anything to input.c. Now we copy all the necessary source files.

cd src/2.6.11 cp evdev.c mousedev.c /usr/src/linux/drivers/input/ cp hid-core.c wacom.c /usr/src/linux/drivers/usb/input/

Now, with the manual patching done everything should work and, unless I've somehow missed a stage, everything should compile just fine.

cd /usr/src/linux make all

Now, this is going to take a while, especially if your system's a bit aold like mine so now would be a good time to get some tea, coffee, go down the corner shop or have lunch.

Assuming there have been no errors, everything should now be compiled.

make modules_install make install

You need to install the modules first or 'make install' will quit, complaining about there being no '/lib/modules/2.6.11-prep' and sulk in the corner.

After all this, there's still one last thing you need to do and that's make this new kernel the default on boot. You will need to edit /boot/grub/menu.lst and change the 'default' value from 1 to 0.

Those of you with nVidia and other such graphics cards who like their 3D acceleration will need to reinstall the drivers before X Windows will work.

As it is, on reboot you will need to change the boot parameters. When Grub comes up, press a to alter the boot parameters. It is advisable at this stage to remove 'rhgb' as, one of the effects of running the Red Hat Graphical Boot is that if you want a change in the xorg.conf file to take effect you have to reboot the entire system and this just gets to be a PITA when you're trying to configure something. Then add '3' (without quotes) to the end of the line to make FC3 boot to the command line.

Right, so by now we should have the kernel set up to recognise whatever tablet you have properly. We can check this.

cat /proc/bus/usb/devices

should give you a readout of every device on your usb system and we're looking for the line which includes Vendor=056a

With my Intuos 3 I have ProdID 00b1, manufacturer is listed as 'Tablet' and Product is listed as PTZ-630 although this may differ depending on which tablet you have and what size it is.

The most important line is the one beginning with I: which should end with 'Driver=wacom'.

If this is that case, congratulations, your kernel is now fully set up to recgonise your tablet :o)

Now, to get it running with X Windows we need to update the wacom_drv driver and this, in itself is going to be different as the configuration script will not know where to find your x11 SDK and so will efuse to compile the driver.

The xorg SDK in the case of FC3 is located in /usr/X11R6/lib/Server and we can tell the configuration script this

./configure --with-xorg-sdk=/usr/X11R6/lib/Server

should do the trick and

make install

should compile and install the module in the appropriate place.

After all this is done, now all you need to do is setup the configuration in /etc/X11 xorg.conf

The ServerLayout section is at the start of the configuration file and, as an example, mine looks like this:

Section "ServerLayout" Identifier     "Default Layout" Screen 0 "Screen0" 0 0 InputDevice    "Mouse0"        "CorePointer" InputDevice    "Keyboard0"     "CoreKeyboard" InputDevice    "eraser"        "SendCoreEvents" InputDevice    "stylus"        "SendCoreEvents" EndSection

Where Mouse3 and Mouse5 are the identifiers for the pen and eraser.

My InputDevice sections look like this:

Section "InputDevice" Identifier "eraser" Driver     "wacom" Option     "Device" "/dev/input/event3" Option     "Type" "eraser" Option     "USB" "On" EndSection
 * 1)       Option      "TopX" "0"
 * 2)       Option      "TopY" "0"
 * 3)       Option      "BottomX" "1600"
 * 4)       Option      "BottomY" "1200"

Section "InputDevice" Identifier "stylus" Driver     "wacom" Option     "Device" "/dev/input/event3" Option     "Type" "stylus" Option     "USB" "On" EndSection
 * 1)        Option      "TopX" "0"
 * 2)        Option      "TopY" "0"
 * 3)        Option      "BottomX" "1600"
 * 4)        Option      "BottomY" "1200"

It's important to note, at this point, that the TopX/Y and BottomX/Y options are not actually necessary unless you have problem with the detection of the tablet as all the lpi information is included in the source code for the wacom module so it's perfectly safe to leave these out if you don't know what the values should be.

Also note, that at this stage I still don't have /dev/input/wacom and the tablet appears on /dev/input/event3

If you're unsure as to which device your tablet is using, then wacdump should be able to find it. It is, to be honest, a bit trial and error but you'll know when you've found it as the readout will look like this:

wacdump v0.5.2

MODEL=Wacom Intuos3 6x8                ROM=1.0-2 CLS=USB VNDR=Wacom  DEV=Intuos3  SUB=PTZ-630

TOOLTYPE=NONE                                  IN_PROX=+00000 (+00000 .. +00000) BUTTON=+00000 (+00000 .. +00000)         POS_X=+00000 (+00000 .. +40640) POS_Y=+00000 (+00000 .. +30480)          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=

Once you've setup all the configuration with the correct input device execute

init 5; exit

and you should find yourself in X with a fully working graphics tablet. Instructions for configuring GIMP 2.2 are the same as in the official HowTo.

Good luck.

regards, Paul

Building wacom driver On Suse 9.2
Nico Kadel-Garcia has provided a changed SPEC file for SuSE 9.2. You can download the spec here.

"There are only a few needed changes: use the new software, throw out an old patch, teach it to use the right options for x86_64 compilation, and stop it from generating symlinks into /usr/include/X11 at compilation time, and it's done. ". Nico said on Mar 21 2005.

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