This patch adds support for Solaris 10 and is based on code produced
in 2010 by Sun Microsystems. The original code was targeted at OpenSolaris
snv_115 - snv_129 and was based on linuxwacom 0.8.4. The original patches
don't appear to be available online [1] anymore, except in our out-of-date
'solaris' branch.

[1]: 
http://hub.opensolaris.org/bin/view/Community+Group+device_drivers/wacomtablet

Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
 README.solaris.md            | 179 ++++++++++++++++++++
 THIRDPARTYLICENSEREADME.txt  |   8 +
 configure.in                 |  26 ++-
 solaris-build.sh             | 387 +++++++++++++++++++++++++++++++++++++++++++
 src/include/usbwcm_build.h   | 110 ++++++++++++
 src/util/10-linuxwacom.fdi   |  25 +++
 src/util/Makefile.am         |   6 +
 src/util/hal-setup-wacom.c   | 127 +++++++++++++-
 src/util/wactablet.c         |  28 ++++
 src/util/wacusb.c            |  28 +++-
 src/xdrv/Makefile.am         |   2 +-
 src/xdrv/wcmUSB.c            |  29 ++++
 src/xdrv/wcmValidateDevice.c |  10 +-
 src/xdrv/xf86Wacom.h         |   5 +
 src/xdrv/xf86WacomDefs.h     |   8 +
 15 files changed, 968 insertions(+), 10 deletions(-)
 create mode 100644 README.solaris.md
 create mode 100644 THIRDPARTYLICENSEREADME.txt
 create mode 100755 solaris-build.sh
 create mode 100644 src/include/usbwcm_build.h

diff --git a/README.solaris.md b/README.solaris.md
new file mode 100644
index 0000000..47238e2
--- /dev/null
+++ b/README.solaris.md
@@ -0,0 +1,179 @@
+**Solaris Notes For linuxwacom**
+
+
+# Overview  ###########################################################
+
+[usbwcm STREAMS module]:
+    https://github.com/linuxwacom/usbwcm/
+
+Version 0.12.0 of the linuxwacom driver introduced support for the Solaris
+operating system. This code is minimally tested and regressions may occur
+without warning. At the time of writing, only Solaris 10 U9 and U11
+("5/10" and "1/13") have been explicitly tested for compatibility. Please
+contact the linuxwacom project maintainers through SourceForge or Github
+if you have specific concerns or issues using this driver on Solaris.
+
+Note that these sources do not contain any Solaris kernel code. License
+incompatibilities prevent us from distributing both as a combined work.
+Please be sure to install the [usbwcm STREAMS module][] in addition to
+this driver.
+
+
+# Usage  ##############################################################
+
+[configuring X11]:
+    http://linuxwacom.sourceforge.net/index_old.php/howto/x11
+
+The Xorg server must be manually configured to make use of connected
+tablets in Solaris 10. Please see the [configuring X11][] section of
+the linuxwacom manual for details on the modifications that must be
+made to the `/etc/X11/xorg.conf` file. The appropriate device node
+(e.g. `/dev/usb/hid0`) will need to be determined based on the output
+of `dmesg`. See the Troubleshooting section below if you encounter
+problems. The mouse pointer should move in response to pen input once
+the X server is properly configured.
+
+Some applications require additional configuration to make full use
+of tablet data. For example, GIMP must have the "stylus" and "eraser"
+tools set to "Screen" mode in its Extended Input Devices preferences.
+It is impossible to provide instructions for each application. Please
+see your application documentation for details if the tablet does not
+appear to be automatically detected.
+
+The linuxwacom driver provides a pair of configuration utilities
+that can be used to modify or tune the behavior of connected tablets.
+The `xsetwacom` utility provides a scriptable command-line interface,
+while `wacomcpl` is a graphical Tcl/Tk application. Debug utilities
+such as `wacdump` and `xidump` are also included should issues arise.
+
+
+# Build, Install, and Uninstall #######################################
+
+## Solaris 10 ##
+
+Although the linuxwacom driver can be built for Solaris 10, the process
+is non-obvious largely due to a lack of Xorg SDK development headers. An
+interactive script which takes care of the entire build process (from
+obtaining prerequisites to setting up environment variables) should have
+been distributed alongside this file. Please note that the final command
+may warn you that the `wacom_drv.so` file is already present on the system
+and ask what you would like to do. This is normal: the SUNWxorg-server
+package installs an out-of-date version of this file and you should tell the
+system to replace it.
+
+    # ./solaris-build.sh
+    # cp workdir/WAClinuxwacom_<version>_<arch>.pkg.tar.gz /tmp
+    # cd /tmp
+    # gzcat WAClinuxwacom_<version>_<arch>.pkg.tar.gz | tar xf -
+    # pkgadd -d .
+
+Once the linuxwacom (and usbwcm) driver has been installed, you will need
+to edit your `/etc/X11/xorg.conf` file as outlined above in the **Usage**
+section. If no `xorg.conf` file exists, it may be necessary to first
+generate one by running `/usr/X11/bin/xorgcfg` as root.
+
+Reboot, and the screen cursor should follow the pen motion if everything has
+been properly installed and configured.
+
+Uninstalling the package can be achieved with the following commands:
+
+    # pkgrm WAClinuxwacom
+
+## Other Solaris Versions ##
+
+Building the linuxwacom driver on other Solaris versions has not been
+tested. Build instructions that work on vanilla OS installations would
+be appreciated.
+
+
+# Troubleshooting  ####################################################
+
+
+## Is the tablet recognized by the kernel?
+
+Examine the output of the `dmesg` command to ensure that the kernel detects
+the tablet. After connecting the tablet, run the following commands:
+
+    # dmesg | egrep -i "usba|hid|usbwcm|wacom"
+    # ls -l /dev/usb/hid*
+
+The tablet should have "Wacom" in its name or have a USB identifier
+beginning with "usb56a". For example, the following example `dmesg`
+output lists a "usb56a,59" device which is probed as "mouse@2, hid1".
+The "hid1" device is later clarified to be "/pci@0,0/pci106b,3f@6/mouse@2"
+which we see is the same as `/dev/usb/hid1`:
+
+    $ dmesg | egrep -i "usba|hid|usbwcm|wacom"
+    [...]
+    usba: [ID 912658 kern.info] USB 2.0 device (usb56a,59) operating at full 
speed (USB 1.x) on USB 1.10 root hub: mouse@2, hid1 at bus address 3
+    usba: [ID 349649 kern.info]     Tablet DTH-2241 Tablet
+    genunix: [ID 936769 kern.info] hid1 is /pci@0,0/pci106b,3f@6/mouse@2
+    genunix: [ID 408114 kern.info] /pci@0,0/pci106b,3f@6/mouse@2 (hid1) online
+    [...]
+    
+    $ ls -l /dev/usb/hid*
+    lrwxrwxrwx   1 root     root          48 Apr 17 15:31 /dev/usb/hid1 -> 
../../devices/pci@0,0/pci106b,3f@6/mouse@2:mouse
+
+
+## Is the STREAMS module installed?
+
+The linuxwacom driver requires the `usbwcm` STREAMS module to be installed
+and functional. Please see the instructions above for information about
+where the module may be found. Follow the troubleshooting steps that it
+suggests if the module has already been installed.
+
+
+## Is the device node configured correctly?
+
+Devices which appear under the `/dev/usb` directory may change their
+name depending on the order the kernel discovers them. Moving the tablet
+to a different USB port may result in it getting renamed. Follow the
+instructions in the **"Is the tablet recognized by the kernel?"**
+troubleshooting section above to determine which device is associated with
+the tablet. Ensure that the `/etc/X11/xorg.conf` file is configured to use
+this device.
+
+
+## Are there any errors logged by Xorg?
+
+The Xorg server generates log files under the `/var/log` directory which
+can provide insight into possible configuration errors. The 
`/var/log/Xorg.0.log`
+file and `/etc/Xorg.0.log.old` files contain information about the current
+and last X server runs, respectively.
+
+
+## Is the server not starting?
+
+Some configuration errors can prevent the X server from starting at all.
+If you are stuck at a console (or an SSH connection), the display server
+can be restarted with the following command. If the problem is resolved
+the login screen should appear once again.
+
+    # svcadm restart cde-login
+
+
+## Does your application not recognize the tablet?
+
+Some applications (e.g. GIMP) require additional setup beyond the
+`/etc/X11/xorg.conf` file in order to recognize the tablet. This
+situation will typically present itself as the tablet working
+properly on the desktop, but not providing pressure or other data
+to the desired application. Unfortunately, it is not possible to
+provide a guide to all the different ways an application may need
+to be configured before it starts working with the tablet. Please
+see the documenation provided by the software for more information.
+
+
+## Driver debug logs
+
+When debugging issues with the driver, it may be useful to have it
+log additional debug information to the `/var/log/Xorg.0.log` file.
+This can be achived by adding the two following options to any or
+all of the Wacom devices in `/etc/X11/xorg.conf`.
+
+    Option "DebugLevel" "<number>"
+    Option "CommonDBG" "<number>"
+
+The number specified indicates the log verbosity. A value of 0
+(default) disables debug logging. Higher values -- up to 12 -- 
+provide additional information about the driver's inner workings.
diff --git a/THIRDPARTYLICENSEREADME.txt b/THIRDPARTYLICENSEREADME.txt
new file mode 100644
index 0000000..1daeb44
--- /dev/null
+++ b/THIRDPARTYLICENSEREADME.txt
@@ -0,0 +1,8 @@
+GPLv2 Disclaimer
+For the avoidance of doubt, except that if any license choice other 
+than GPL or LGPL is available it will apply instead, Sun elects to 
+use only the General Public License version 2 (GPLv2) at this time 
+for any software where a choice of GPL license versions is made 
+available with the language indicating that GPLv2 or any later 
+version may be used, or where a choice of which version of the GPL 
+is applied is otherwise unspecified.
diff --git a/configure.in b/configure.in
index a18f8de..91de29a 100644
--- a/configure.in
+++ b/configure.in
@@ -75,12 +75,23 @@ if echo $WCM_KERNEL | grep -i linux >/dev/null; then
 fi
 AC_MSG_RESULT($WCM_ISLINUX)
 
+dnl =======================================================
+dnl Check if we should be compiling for Solaris
+AC_MSG_CHECKING(for Solaris kernel)
+WCM_ISSOLARIS=no
+if echo $WCM_KERNEL | grep -i SunOS >/dev/null; then
+       WCM_ISSOLARIS=yes
+       CFLAGS="$CFLAGS -Dsun"
+fi
+AC_MSG_RESULT($WCM_ISSOLARIS)
+AM_CONDITIONAL(WCM_ENV_SOLARIS, [test "$WCM_ISSOLARIS" = yes])
+
 dnl Check for 64bit XServer
 WCM_OPTION_XSERVER64=no
 AC_ARG_ENABLE(xserver64,
        AC_HELP_STRING([--enable-xserver64], [Use 64bit XServer 
[[default=usually]]]),
        [ WCM_OPTION_XSERVER64=$enableval ],
-       [ echo $WCM_ARCHITECTURE | grep "64" >/dev/null && 
WCM_OPTION_XSERVER64=yes ])
+       [ echo $WCM_ARCHITECTURE | egrep "64|sparc" >/dev/null && 
WCM_OPTION_XSERVER64=yes ])
 
 dnl Check for linux kernel override
 AC_ARG_WITH(linux,
@@ -96,14 +107,16 @@ WCM_ENV_KERNEL=no
 WCM_KERNEL_DIR=
 WCM_KERNEL_VER=
 WCM_KSTACK=
-if test "$WCM_ISLINUX" != yes; then
+if test "$WCM_ISLINUX" != yes -a "$WCM_ISSOLARIS" != yes; then
        WCM_PATCH_WACDUMP="(no USB)"
        WCM_PATCH_WACOMDRV="(no USB)"
 else
        AC_DEFINE(WCM_ENABLE_LINUXINPUT,,[Enable the Linux Input subsystem])
        WCM_PATCH_WACDUMP=
        WCM_PATCH_WACOMDRV=
+fi
 
+if test "$WCM_ISLINUX" = yes; then
        dnl Check for kernel build environment
        AC_ARG_WITH(kernel,
                AS_HELP_STRING([--with-kernel=dir], [Specify kernel source 
directory]),
@@ -282,8 +295,10 @@ else
 fi
 if test "$WCM_ENV_XLIB" = yes; then
        if test "$WCM_OPTION_XSERVER64" = "yes"; then
-               CFLAGS="$CFLAGS -D__amd64__"
-               WCM_XSERVER64="-D_XSERVER64"
+               WCM_XSERVER64="-D_XSERVER64 -m64"
+               if test "$WCM_ARCH" != sparc; then
+                       WCM_XSERVER64="$WCM_XSERVER64 -D__amd64__"
+               fi
        fi
 fi
 
@@ -911,6 +926,9 @@ if test -z "$WCM_MODDIR"; then
         elif test -d $WCM_XLIB_DIR/modules/input; then
                WCM_MODDIR=$WCM_XLIB_DIR/modules/input
         fi
+       if test "$WCM_ISSOLARIS" = yes -a "$WCM_ARCH" != sparc -a 
"$WCM_OPTION_XSERVER64" = yes; then
+               WCM_MODDIR=$WCM_MODDIR/amd64
+       fi
 fi
 AC_MSG_RESULT($WCM_MODDIR)
 
diff --git a/solaris-build.sh b/solaris-build.sh
new file mode 100755
index 0000000..d873b7f
--- /dev/null
+++ b/solaris-build.sh
@@ -0,0 +1,387 @@
+#!/bin/bash
+
+set -e
+
+
+#
+# Produce a version number from the output of `git describe` which
+# is then massaged into the format used by semantic versioning.
+#
+function generate_linuxwacom_version() {
+    local SRCDIR="$1"
+    local SUFFIX="$2"
+    if [[ -n "$SUFFIX" ]]; then
+        SUFFIX="-$SUFFIX"
+    fi
+    git -C "$SRCDIR" describe | \
+    sed -e "s/^release-\(.*\)/\1/" \
+        -e "s/^\(.*\)-\([0-9]*\)-\(g[0-9a-f]\{7,7\}\)\$/\1${SUFFIX}+r\2.\3/"
+}
+
+
+#
+# Return the value associated with a given key in a line-separated
+# list of key="value" or key=value pairs.
+#
+function key_to_value() {
+    local KEY="$1"
+    local LIST="$2"
+    sed -n -e 's%^'"$KEY"'="\(.*\)"%\1%p' -e 's%^'"$KEY"'=\(.*\)%\1%p' 
<<<"$LIST" | head -n1
+}
+
+
+#
+# Create a Solaris ".pkg.tar.gz" package from the contents of a
+# working directory which contains finalized Prototype and pkginfo
+# files.
+#
+function create_package() {
+    local PKGDIR="$1"
+    local PKGINFO=$(cat "$PKGDIR/pkginfo")
+    local PKG=$(key_to_value "PKG" "$PKGINFO")
+    local ARCH=$(key_to_value "ARCH" "$PKGINFO")
+    local VERSION=$(key_to_value "VERSION" "$PKGINFO")
+
+    pkgmk -o -d "$PKGDIR" -f "$PKGDIR/Prototype"
+    tar -cf - -C "$PKGDIR" $PKG | gzip -9 -c > 
"$PKGDIR/${PKG}_${VERSION}_${ARCH}.pkg.tar.gz"
+}
+
+
+#
+# Create "prototype" information about the files that are to be
+# package. This function performs basic transformation of the
+# raw output provided by the `pkgproto` command but will likely
+# need further modification on a case-by-case basis to ensure
+# permissions are set properly.
+#
+# See `man -s4 prototype`, [1], and [2] for more information.
+#
+# [1]: 
http://www.ibiblio.org/pub/packages/solaris/i86pc/html/creating.solaris.packages.html
+# [2]: http://www.garex.net/sun/packaging/pkginfo.html
+#
+function generate_prototype() {
+    local DESTDIR="$1"
+    local PROTO
+    PROTO=$(pkgproto "$DESTDIR=/")
+    PROTO=$(echo 'i pkginfo'; echo '!default 0755 root bin'; echo "$PROTO")
+    PROTO=$(sed '/^d none \/ /d' <<<"$PROTO")
+    PROTO=$(sed 's/^\(d .*\) [0-7]\{4\} .* .*$/\1 ? ? ?/' <<<"$PROTO")
+    PROTO=$(sed 's/^\(f .*\) [0-7]\{4\} .* .*$/\1/' <<<"$PROTO")
+    echo "$PROTO"
+}
+
+
+#
+# Creates a linuxwacom driver package from files installed to an
+# alternate (non-root) directory.
+#
+# NOTE! When installing this package, Solaris will likely complain
+# that wacom_drv.so is already installed on the system as part of
+# the SUNWxorg-server package. This is normal and the file should
+# be overwritten.
+#
+function package_linuxwacom() {
+    local DESTDIR="$1"
+    local PKGDIR="$2"
+    local VERSION="$3"
+    local PROTO=$(generate_prototype "$DESTDIR")
+
+    # Remove "?" permissions on "wacomcfg" and "TkXinput" directories
+    PROTO=$(sed 's/^\(d .*wacomcfg.*\) ? ? ?$/\1/' <<<"$PROTO")
+    PROTO=$(sed 's/^\(d .*TkXinput.*\) ? ? ?$/\1/' <<<"$PROTO")
+
+    PKGINFO=$(cat <<EOF
+PKG=WAClinuxwacom
+NAME="Xorg driver for Wacom tablets"
+VERSION="$VERSION"
+ARCH="$(isainfo -n)"
+CLASSES="system none"
+CATEGORY="system"
+VENDOR="linuxwacom Project"
+EMAIL="linuxwacom-disc...@lists.sourceforge.net"
+EOF
+)
+    echo "$PKGINFO" > "$PKGDIR/pkginfo"
+    echo "$PROTO" > "$PKGDIR/Prototype"
+
+    create_package "$PKGDIR"
+}
+
+
+#
+# Installs the linuxwacom driver to a specified destination
+# directory.
+#
+function install_linuxwacom() {
+    local SRCDIR="$1"
+    local DESTDIR="$2"
+
+    pushd "$SRCDIR"
+    gmake install DESTDIR="$DESTDIR"
+    popd
+}
+
+
+#
+# Compiles the linuxwacom driver, setting up the environment along the
+# way to comply with the unique needs of Solaris 10. The function requires
+# that your provide it with a path to the "/usr/src/uts/common" directory
+# of the usbwcm source tree. Additional configuration options (e.g.
+# "--with-tcl=/opt/csw --with-tk=/opt/csw" can also be provided in order
+# to change how the driver is built.
+#
+function compile_linuxwacom() {
+    local SRCDIR="$1"
+    local HEADERS_KERNEL="$2"
+    local CONFIGOPTS="$3"
+    local XORG_ALTERNATE="$4"
+
+    pushd "$SRCDIR"
+
+    export CFLAGS="$CFLAGS -I${HEADERS_KERNEL} -fPIC"
+
+    if [[ -n "$XORG_ALTERNATE" ]]; then
+        # Solaris 10 does not have the necessary Xorg SDK headers available
+        # for installation, so this script has to download them into an
+        # alternate root directory. If an alternate root was provided to
+        # this function, then update CFLAGS and PKG_CONFIG_PATH so that
+        # everything can be found...
+        export CFLAGS="$CFLAGS -I${XORG_ALTERNATE}/usr/X11/include"
+        export 
PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$XORG_ALTERNATE/usr/lib/pkgconfig"
+    fi
+
+    # Note that PATH should have already been set up at this point to
+    # contain the following important paths:
+    #   * /usr/ccs/bin contains development tools (ar, ranlib)
+    #   * /usr/sfw/bin contains third-party software (gcc, gmake, gar, granlib)
+    #   * /opt/csw/bin contains OpenCSW software (libtool, autoconf, etc.)
+    ./bootstrap
+    ./configure --prefix="/usr" --with-linux \
+                --with-xmoduledir=/usr/X11/lib/modules/input \
+                --with-xorg-sdk="$XORG_ALTERNATE/usr/X11/include/xorg" 
$CONFIGOPTS
+    gmake
+
+    popd
+}
+
+
+#
+# Download the latest code from an appropriate location.
+# At the moment, grab it from my Github repository.
+#
+function get_source() {
+    local SRCDIR="$1"
+    local REPO="$2"
+    local COMMIT="$3"
+
+    if [[ "$REPO" == "linuxwacom" ]]; then
+        # Legacy linuxwacom repo is named "code" on SourceForge...
+        REPO="code"
+    fi
+
+    local URL="http://git.code.sf.net/p/linuxwacom/${REPO}.git";
+
+    if [[ ! -d "$SRCDIR" ]]; then
+        git clone -b "$COMMIT" "$URL" "$SRCDIR"
+    fi
+}
+
+
+#
+# The Xorg SDK and other required headers must be installed for linuxwacom
+# to build. In theory, installing SUNWxorg-headers and its dependencies
+# should be sufficient. In reality, the version of SUNWxorg-headers
+# contained on the Solaris 10 DVD does *not* contain the full SDK. We
+# need to manually get everything from the OpenIndiana legacy archive.
+# This requires a bit of futzing because OpenIndiana assumes the presence
+# of an IPS package manager which isn't present on my Solaris 10 installs.
+# See [1] ("How to manually download individual files from the OpenIndiana
+# (or Solaris) pkg repo?") for an overview of what we're doing to emulate
+# one.
+#
+# [1]: https://serverfault.com/questions/348139/
+#
+function get_xorg_sdk() {
+    local WORKDIR="$1"
+    local SVR="http://pkg.openindiana.org/legacy";
+    local X11_PKG="SUNWxwinc@0.5.11,5.11-0.101:20081119T231501Z"
+    local XORG_PKG="SUNWxorg-headers@0.5.11,5.11-0.101:20081119T231341Z"
+
+    # Download package manifests
+    wget -cP "$WORKDIR" "$SVR/manifest/0/$X11_PKG" "$SVR/manifest/0/$XORG_PKG"
+
+    # Download gzipped package contents
+    cat "$WORKDIR/$X11_PKG" "$WORKDIR/$XORG_PKG" | \
+      sed -n "s%^file \([^ ]*\).*%$SVR/file/0/\1%p" | xargs wget -cP "$WORKDIR"
+
+    # Create destination directories
+    cat "$WORKDIR/$X11_PKG" "$WORKDIR/$XORG_PKG" | \
+      sed -n "s%^dir.*path=\([^ ]*\).*%mkdir -p \"$WORKDIR/\1\"%p" | sh -s
+
+    # Extract gzipped files to destinations
+    cat "$WORKDIR/$X11_PKG" "$WORKDIR/$XORG_PKG" | \
+      sed -n "s%^file \([^ ]*\).* path=\([^ ]*\).*%\1|\2%p" | \
+      sed "s%\([^|]*\)|\(.*\)%gzcat \"$WORKDIR/\1\" > \"$WORKDIR/\2\"%" | sh -s
+
+    # Set up symlinks
+    cat "$WORKDIR/$X11_PKG" "$WORKDIR/$XORG_PKG" | \
+      sed -n "s%^link.*path=\([^ ]*\).*target=\([^ ]*\).*%\1|\2%p" | \
+      sed "s%\([^|]*\)|\(.*\)%ln -s \"\2\" \"$WORKDIR/\1\"%" | sh -s
+
+    # Remove temporary files
+    rm -f "$WORKDIR"/* 2> /dev/null || true
+}
+
+
+#
+# The linuxwacom driver has a few build dependencies that must be
+# satisfied before the code can compile. In theory, we might be
+# able to find official Oracle/Sun packages that fit the bill; in
+# reality its just easier to get them from the OpenCSW Software
+# Archive. Ask before actually installing anything to be courteous.
+#
+function install_build_deps() {
+    local PACKAGES="$@"
+    local INSTALL=0
+
+    if [[ ! -d /opt/csw || ! -e /opt/csw/bin/pkgutil ]]; then
+        echo "OpenCSW not found. It must be installed to obtain build 
dependencies."
+        echo "Do you wish to proceed and install the OpenCSW package manager?"
+        select yn in "Yes" "No"; do
+            case $yn in
+                Yes ) INSTALL=1; break;;
+                No ) exit;;
+                * ) echo "Please answer 'Yes' or 'No'.";;
+            esac
+        done
+    elif [[ ! -x /opt/csw/bin/pkgutil ]]; then
+        echo "OpenCSW pkgutil found, but not executable. Exiting."
+        exit 1
+    fi
+
+    if [[ $INSTALL -ne 0 ]]; then
+        yes | pkgadd -a <(echo setuid=nocheck) -d http://get.opencsw.org/now 
CSWpkgutil
+    fi
+    /opt/csw/bin/pkgutil -U
+    yes | /opt/csw/bin/pkgutil -i $PACKAGES
+}
+
+
+#
+# Ensure that the system has everything that it needs to perform a
+# build. If prerequisites are not satisfied, ask the user if they
+# would like to install them.
+#
+function check_prerequisites() {
+    while true ; do
+        local SYS=""
+        local CSW=""
+        local PATHMOD=""
+
+        command -v "gcc"        >/dev/null 2>&1 || SYS="$SYS gcc"
+        command -v "gmake"      >/dev/null 2>&1 || SYS="$SYS gmake"
+        command -v "wget"       >/dev/null 2>&1 || SYS="$SYS wget"
+
+        command -v "libtoolize" >/dev/null 2>&1 || CSW="$CSW libtool"
+        command -v "autoconf"   >/dev/null 2>&1 || CSW="$CSW autoconf"
+        command -v "automake"   >/dev/null 2>&1 || CSW="$CSW automake"
+        command -v "gsed"       >/dev/null 2>&1 || CSW="$CSW gsed"
+        command -v "git"        >/dev/null 2>&1 || CSW="$CSW git"
+        command -v "/opt/csw/bin/pkg-config" >/dev/null 2>&1 || CSW="$CSW 
pkgconfig"
+
+        if [[ -z "$SYS" && -z "$CSW" ]]; then
+            break
+        fi
+
+        echo "Unable to find the following dependencies in the current PATH."
+        echo "  ==> $SYS $CSW"
+        echo
+
+        if [[ "$PATH" != *"/usr/ccs/bin"* ]]; then
+            PATHMOD="$PATHMOD:/usr/ccs/bin"
+        fi
+        if [[ "$PATH" != *"/usr/sfw/bin"* ]]; then
+            PATHMOD="$PATHMOD:/usr/sfw/bin"
+        fi
+        if [[ "$PATH" != *"/opt/csw/bin"* ]]; then
+            PATHMOD="$PATHMOD:/opt/csw/bin"
+        fi
+
+        if [[ -n "$PATHMOD" ]]; then
+            echo "Would you like me to update PATH to \"\$PATH$PATHMOD\"?"
+            select yn in "Yes" "No"; do
+                case $yn in
+                    Yes ) export PATH="$PATH$PATHMOD"; break;;
+                    No ) exit 1;;
+                    * ) echo "Please answer 'Yes' or 'No'.";;
+                esac
+            done
+            continue
+        elif [[ -n "$CSW" ]]; then
+            echo "Would you like me to install packages from OpenCSW?"
+            select yn in "Yes" "No"; do
+                case $yn in
+                    Yes ) install_build_deps $CSW; break;;
+                    No ) exit 1;;
+                    * ) echo "Please answer 'Yes' or 'No'.";;
+                esac
+            done
+            continue
+        else
+            echo "Still unable to find necessary packages. Aborting."
+            exit 1
+        fi
+    done
+
+    if [[ ! -f "$XORGDIR/usr/X11/include/xorg/xorgVersion.h" ]]; then
+        echo "You seem to be missing the Xorg SDK. Download?"
+        select yn in "Yes" "No"; do
+            case $yn in
+                Yes ) get_xorg_sdk "$XORGDIR"; break;;
+                No ) exit 1;;
+                * ) echo "Please answer 'Yes' or 'No'.";;
+            esac
+        done
+    fi
+
+    return 0
+}
+
+
+WORKDIR="$(pwd)/workdir"
+XORGDIR="$WORKDIR/xorg-sdk"
+USBWCMDIR="$WORKDIR/usbwcm_src"
+
+LINUXWACOM_SRCDIR="$WORKDIR/linuxwacom_src"
+LINUXWACOM_DSTDIR="$WORKDIR/linuxwacom_dst"
+LINUXWACOM_PKGDIR="$WORKDIR"
+
+
+if [[ $EUID -ne 0 ]]; then
+    echo "This script must be run as root."
+    exit 1
+fi
+
+mkdir -p $WORKDIR || true
+
+check_prerequisites
+
+get_source "$USBWCMDIR" usbwcm master
+
+if [[ -f "README.solaris.md" ]]; then  
+       LINUXWACOM_SRCDIR="$(pwd)"
+else
+       get_source "$LINUXWACOM_SRCDIR" linuxwacom master
+fi
+
+compile_linuxwacom "$LINUXWACOM_SRCDIR" "$USBWCMDIR/usr/src/uts/common/" "" 
"$XORGDIR"
+install_linuxwacom "$LINUXWACOM_SRCDIR" "$LINUXWACOM_DSTDIR"
+
+LINUXWACOM_VERSION=$(generate_linuxwacom_version "$LINUXWACOM_SRCDIR" "")
+while [[ -z "$LINUXWACOM_VERSION" ]]; do
+       echo "Unable to determine linuxwacom version for packaging."
+       echo -n "Please provide version (e.g. 0.12.0): "
+       read LINUXWACOM_VERSION
+done
+
+package_linuxwacom "$LINUXWACOM_DSTDIR" "$LINUXWACOM_PKGDIR" 
"$LINUXWACOM_VERSION"
diff --git a/src/include/usbwcm_build.h b/src/include/usbwcm_build.h
new file mode 100644
index 0000000..e18c694
--- /dev/null
+++ b/src/include/usbwcm_build.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
+ * Use is subject to license terms.
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software 
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef        _USBWCM_BUILD_H
+#define        _USBWCM_BUILD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define        EVIOCGVERSION   EVTIOCGVERSION
+#define        EVIOCGID        EVTIOCGDEVID
+#define        EVIOCGBIT       EVTIOCGBM
+#define        EVIOCGABS       EVTIOCGABS
+
+#define        input_event     event_input
+
+/* The structures 'event_abs_axis' and 'event_dev_id'
+ * from usbwcm.h correspond to 'input_absinfo' and
+ * 'input_id', but cannot be simply redfined like we
+ * do above for 'event_input' since the member names
+ * differ as  well (e.g. "min" instead of "minimum").
+ * To allow the code to compile, we copy the structure
+ * definitions from usbwcm.h, changing only the names.
+ * Unless those upstream definitions change, we should
+ * be fine...
+ */
+struct input_absinfo {
+       int32_t value;
+       int32_t minimum;
+       int32_t maximum;
+       int32_t fuzz;
+       int32_t flat;
+};
+struct input_id {
+       uint16_t bustype;
+       uint16_t vendor;
+       uint16_t product;
+       uint16_t version;
+};
+
+#define        EV_KEY          EVT_BTN
+#define        EV_REL          EVT_REL
+#define        EV_ABS          EVT_ABS
+#define        EV_SYN          EVT_SYN
+#define        EV_MSC          EVT_MSC
+#define        EV_MAX          EVT_MAX
+
+#define        KEY_MAX         BTN_MAX
+
+#define        BTN_0           BTN_MISC_0
+#define        BTN_1           BTN_MISC_1
+#define        BTN_2           BTN_MISC_2
+#define        BTN_3           BTN_MISC_3
+#define        BTN_4           BTN_MISC_4
+#define        BTN_5           BTN_MISC_5
+#define        BTN_6           BTN_MISC_6
+#define        BTN_7           BTN_MISC_7
+#define        BTN_8           BTN_MISC_8
+#define        BTN_9           BTN_MISC_9
+
+#define        BTN_STYLUS      BTN_STYLUS_1
+#define        BTN_STYLUS2     BTN_STYLUS_2
+
+#define        BTN_TOOL_RUBBER BTN_TOOL_ERASER
+#define        BTN_TOOL_LENS   BTN_TOOL_MOUSE
+
+#define        BTN_TOOL_PENCIL         BTN_TOOL_PEN
+#define        BTN_TOOL_BRUSH          BTN_TOOL_PEN
+#define        BTN_TOOL_AIRBRUSH       BTN_TOOL_PEN
+#define        BTN_TOOL_FINGER         BTN_TOOL_PAD
+#define        BTN_TOUCH               BTN_TIP
+#define        BTN_TOOL_TRIPLETAP      BTN_TIP
+
+#define        BTN_BASE3       BTN_MISC_UND
+#define        BTN_BASE4       BTN_MISC_UND
+#define        BTN_BASE5       BTN_MISC_UND
+#define        BTN_BASE6       BTN_MISC_UND
+
+#define        BTN_TL          BTN_MISC_UND
+#define        BTN_TR          BTN_MISC_UND
+#define        BTN_TL2         BTN_MISC_UND
+#define        BTN_TR2         BTN_MISC_UND
+#define        BTN_SELECT      BTN_MISC_UND
+
+#define        KEY_PROG1       BTN_MISC_UND
+#define        KEY_PROG2       BTN_MISC_UND
+#define        KEY_PROG3       BTN_MISC_UND
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _USBWCM_BUILD_H */
diff --git a/src/util/10-linuxwacom.fdi b/src/util/10-linuxwacom.fdi
index 4f63f2c..de67aa6 100644
--- a/src/util/10-linuxwacom.fdi
+++ b/src/util/10-linuxwacom.fdi
@@ -2,6 +2,7 @@
 <!-- this is probably a bit imprecise -->
 <deviceinfo version="0.2">
   <device>
+  <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" 
string="Linux">
     <match key="info.category" contains="input">
       <match key="info.product" contains_outof="Wacom">
        <merge key="input.x11_driver" type="string">wacom</merge>
@@ -28,9 +29,11 @@
        </match>
       </match>
     </match>
+  </match>
   </device>
   <!-- Match the Wacom Bluetooth A5 pen tablet -->
   <device>
+  <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" 
string="Linux">
     <match key="info.capabilities" contains="input.mouse">
       <match key="info.product" contains="WACOM">
         <match key="info.product" contains="Tablet">
@@ -43,6 +46,28 @@
         </match>
       </match>
     </match>
+  </match>
+  </device>
+
+  <device>
+  <match key="/org/freedesktop/Hal/devices/computer:system.kernel.name" 
string="SunOS">
+    <match key="info.capabilities" contains="input.mouse">
+    <match key="@info.parent:usb.vendor_id" int="0x56a">
+      <merge key="info.product" type="string">Wacom_Tablet</merge>
+      <append key="info.callouts.add" type="strlist">hal-setup-wacom</append>
+
+      <merge key="input.x11_driver" type="string">wacom</merge>
+      <merge key="input.x11_options.Type" type="string">eraser</merge>
+      <merge key="input.x11_options.USB" type="bool">true</merge>
+
+      <remove key="input.x11_options.StreamsModule" type="string"></remove>
+      <remove key="input.x11_options.Protocol" type="string"></remove>
+
+      <append key="wacom.types" type="strlist">stylus</append>
+      <append key="wacom.types" type="strlist">pad</append>
+    </match>
+    </match>
+  </match>
   </device>
 </deviceinfo>
 
diff --git a/src/util/Makefile.am b/src/util/Makefile.am
index 0aaedc2..8577f0b 100755
--- a/src/util/Makefile.am
+++ b/src/util/Makefile.am
@@ -25,7 +25,13 @@ endif
 
 if WCM_HAVE_HAL
 libexec_PROGRAMS = hal-setup-wacom
+
+if WCM_ENV_SOLARIS
+fdidir = /etc/hal/fdi/policy/20thirdparty
+else
 fdidir = $(prefix)/share/hal/fdi/policy/20thirdparty
+endif
+
 fdi_SCRIPTS = 10-linuxwacom.fdi
 endif
 
diff --git a/src/util/hal-setup-wacom.c b/src/util/hal-setup-wacom.c
index dd6183c..1724bc4 100644
--- a/src/util/hal-setup-wacom.c
+++ b/src/util/hal-setup-wacom.c
@@ -2,6 +2,8 @@
  * Licensed under the GNU General Public License Version 2
  *
  * Copyright (C) 2009 Red Hat <m...@redhat.com>
+ * Copyright (C) 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright (C) 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -33,6 +35,98 @@
 static LibHalContext *ctx = NULL;
 static char* udi;
 
+#ifdef sun
+static char wacom_x11_options[] = "wacom.%s.x11_options.";
+static char x11_options[] = "input.x11_options.%s";
+
+static int
+copy_x11_options (LibHalContext *hal_ctx, const char *parent, char *child,
+            const char *namespace, DBusError *error)
+{
+       LibHalPropertySet *properties;
+       LibHalPropertySetIterator it;
+
+       if(hal_ctx == 0) {
+               fprintf (stderr,"%s %d : LibHalContext *ctx is 
NULL\n",__FILE__, __LINE__);
+               return 1;
+       }
+
+       dbus_error_init (error);
+
+       /* first collect from root computer device */
+       properties = libhal_device_get_all_properties (hal_ctx, parent, error);
+       if (properties == NULL ) {
+               LIBHAL_FREE_DBUS_ERROR(error);
+               return 1;
+       }
+
+       for (libhal_psi_init (&it, properties); libhal_psi_has_more (&it); 
libhal_psi_next (&it)) {
+               LibHalPropertyType type = libhal_psi_get_type (&it);
+               char *key = libhal_psi_get_key (&it);
+               char *newkey;
+               char *str_prop;
+               dbus_bool_t bool_prop;
+               dbus_int32_t int32_prop;
+               dbus_uint64_t uint64_prop;
+               double double_prop;
+               int len = strlen(namespace);
+
+               dbus_error_init (error);
+
+               if (strncmp(namespace, key, len) != 0)
+                       continue;
+
+               asprintf(&newkey, x11_options, key + len);
+
+
+               switch (type) {
+               case LIBHAL_PROPERTY_TYPE_INT32:
+                       int32_prop = libhal_device_get_property_int(ctx, parent,
+                                                                   key, error);
+                       libhal_device_set_property_int(ctx, child, newkey,
+                                                      int32_prop, error);
+                       break;
+               case LIBHAL_PROPERTY_TYPE_UINT64:
+                       uint64_prop = libhal_device_get_property_uint64(ctx, 
parent,
+                                                                       key, 
error);
+                       libhal_device_set_property_uint64(ctx, child, newkey,
+                                                         uint64_prop, error);
+                       break;
+               case LIBHAL_PROPERTY_TYPE_DOUBLE:
+                       double_prop = libhal_device_get_property_double(ctx, 
parent, key,
+                                                                       error);
+                       libhal_device_set_property_double(ctx, child, newkey,
+                                                         double_prop, error);
+                       break;
+               case LIBHAL_PROPERTY_TYPE_BOOLEAN:
+                       bool_prop = libhal_device_get_property_bool (ctx, 
parent, key,
+                                                        error);
+                       libhal_device_set_property_bool(ctx, child, newkey,
+                                                       bool_prop, error);
+
+                       break;
+               case LIBHAL_PROPERTY_TYPE_STRING:
+                       str_prop = libhal_device_get_property_string (ctx, 
parent, key,
+                                                                 error);
+                       if (str_prop == NULL)
+                               continue;
+
+                       libhal_device_set_property_string (ctx, child, newkey,
+                                                          str_prop, error);
+                       break;
+               case LIBHAL_PROPERTY_TYPE_STRLIST:
+               default:
+                       break;
+               }
+       }
+
+       libhal_free_property_set (properties);
+       LIBHAL_FREE_DBUS_ERROR(error);
+
+       return 0;
+}
+#endif /* sun */
+
 int
 main (int argc, char **argv)
 {
@@ -44,6 +138,11 @@ main (int argc, char **argv)
        char **types;
        int i;
        DBusError error;
+#ifdef sun
+       char *rename = NULL;
+       char *type;
+       char *options;
+#endif
 
        udi = getenv ("UDI");
        if (udi == NULL) {
@@ -84,6 +183,22 @@ main (int argc, char **argv)
        dbus_error_init (&error);
        name = libhal_device_get_property_string (ctx, udi, "info.product",
                                                  &error);
+#ifdef sun
+       dbus_error_init (&error);
+       type = libhal_device_get_property_string (ctx, udi,
+                                                "input.x11_options.Type",
+                                                 &error);
+       if (name && type) {
+               asprintf(&rename, "%s", name);
+               asprintf (&subname, "%s_%s", rename, type);
+
+               dbus_error_init (&error);
+               libhal_device_set_property_string (ctx, udi,
+                                                  "info.product",
+                                                  subname, &error);
+               free (subname);
+       }
+#endif /* sun */
 
        dbus_error_init (&error);
        types = libhal_device_get_property_strlist (ctx, udi, "wacom.types",
@@ -134,12 +249,23 @@ main (int argc, char **argv)
                }
                if (name) {
                        dbus_error_init (&error);
+#ifdef sun
+                       asprintf (&subname, "%s_%s", rename, types[i]);
+#else /* !sun */
                        asprintf (&subname, "%s %s", name, types[i]);
+#endif
                        libhal_device_set_property_string (ctx, tmpdev,
                                                           "info.product",
                                                           subname, &error);
                        free (subname);
                }
+
+#ifdef sun
+               asprintf(&options, wacom_x11_options, types[i]);
+               copy_x11_options (ctx, udi, tmpdev, options, &error);
+               free(options);
+#endif
+
                dbus_error_init (&error);
                libhal_device_commit_to_gdl (ctx, tmpdev, newudi, &error);
 
@@ -153,4 +279,3 @@ main (int argc, char **argv)
 
        return 0;
 }
-
diff --git a/src/util/wactablet.c b/src/util/wactablet.c
index 2df8e37..891260d 100755
--- a/src/util/wactablet.c
+++ b/src/util/wactablet.c
@@ -3,6 +3,8 @@
 **
 ** Copyright (C) 2002 - 2003 - John E. Joganic
 ** Copyright (C) 2004 - 2005 - Ping Cheng
+** Copyright (C) 2010 Sun Microsystems, Inc.  All rights reserved.
+** Copyright (C) 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
 **
 ** This program is free software; you can redistribute it and/or
 ** modify it under the terms of the GNU General Public License
@@ -35,8 +37,20 @@
 #include <assert.h>
 #include <stdarg.h>
 
+#ifdef sun
+#include <strings.h>
+#endif
+
 #ifdef WCM_ENABLE_LINUXINPUT
+
+#ifdef sun
+#include <sys/stropts.h>
+#include <sys/usb/clients/usbinput/usbwcm/usbwcm.h>
+#include "../include/usbwcm_build.h"
+#else /* !sun */
 #include <linux/input.h>
+#endif /* sun */
+
 #endif
 
 typedef void (*FREEFUNC)(void* pv);
@@ -274,7 +288,21 @@ static int WacomIsUSB(int fd)
 {
 #ifdef WCM_ENABLE_LINUXINPUT
        short sID[4];
+#ifdef sun
+       int retval;
+
+       retval = ioctl(fd, I_FIND, "usbwcm");
+       if (retval == 0)
+               retval = ioctl(fd, I_PUSH, "usbwcm");
+       if (retval < 0)
+       {
+               perror("WacomIsUSB");
+               return 0;
+       }
+#endif /* sun */
+
        if (ioctl(fd,EVIOCGID,sID) < 0) return 0;
+
        return 1;
 #else
        return 0;
diff --git a/src/util/wacusb.c b/src/util/wacusb.c
index 06217d7..f0ba02f 100755
--- a/src/util/wacusb.c
+++ b/src/util/wacusb.c
@@ -3,6 +3,8 @@
 **
 ** Copyright (C) 2002 - 2004 - John E. Joganic
 ** Copyright (C) 2003 - 2014 - Ping Cheng
+** Copyright (C) 2010 Sun Microsystems, Inc.  All rights reserved.
+** Copyright (C) 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
 **
 ** This program is free software; you can redistribute it and/or
 ** modify it under the terms of the GNU General Public License
@@ -38,6 +40,12 @@
 *****************************************************************************/
 
 #ifdef WCM_ENABLE_LINUXINPUT
+
+#ifdef sun
+#include <sys/usb/clients/usbinput/usbwcm/usbwcm.h>
+#include "../include/usbwcm_build.h"
+
+#else /* !sun */
 #include <linux/input.h>
 
 #ifndef EV_MSC
@@ -52,6 +60,8 @@
 #define BTN_TOOL_DOUBLETAP 0x14d
 #endif
 
+#endif /* sun */
+
 /*****************************************************************************
 ** Defines
 *****************************************************************************/
@@ -621,8 +631,12 @@ static int USBIdentifyModel(USBTABLET* pUSB)
                        
USBGetRange(pUSB,absbits,ABS_PRESSURE,WACOMFIELD_PRESSURE) ||
                        USBGetRange(pUSB,absbits,ABS_TILT_X,WACOMFIELD_TILT_X) 
||
                        USBGetRange(pUSB,absbits,ABS_TILT_Y,WACOMFIELD_TILT_Y) 
||
+#ifdef sun
+                       USBGetRange(pUSB,absbits,ABS_WHEEL,WACOMFIELD_ABSWHEEL))
+#else
                        USBGetRange(pUSB,absbits,ABS_WHEEL,WACOMFIELD_ABSWHEEL) 
||
                        
USBGetRange(pUSB,absbits,ABS_THROTTLE,WACOMFIELD_THROTTLE))
+#endif
                        return 1;
 
        }
@@ -676,8 +690,12 @@ static int USBIdentifyModel(USBTABLET* pUSB)
                                ISBITSET(keybits,BTN_TOOL_AIRBRUSH) ||
                                ISBITSET(keybits,BTN_TOOL_FINGER) ||
                                ISBITSET(keybits,BTN_TOOL_MOUSE) ||
+#ifdef sun
+                               ISBITSET(keybits,BTN_TOOL_LENS))
+#else /* !sun */
                                ISBITSET(keybits,BTN_TOOL_LENS) ||
                                ISBITSET(keybits,BTN_TOOL_DOUBLETAP))
+#endif
                        pUSB->state[0].uValid |= BIT(WACOMFIELD_PROXIMITY) |
                                        BIT(WACOMFIELD_TOOLTYPE);
 
@@ -820,14 +838,16 @@ static int USBParseKEY(USBTABLET* pUSB, struct 
input_event* pEv)
                case BTN_STYLUS: button = WACOMBUTTON_STYLUS; break;
                case BTN_STYLUS2: button = WACOMBUTTON_STYLUS2; break;
                case BTN_TOOL_PEN: tool = WACOMTOOLTYPE_PEN; break;
-               case BTN_TOOL_PENCIL: tool = WACOMTOOLTYPE_PENCIL; break;
-               case BTN_TOOL_BRUSH: tool = WACOMTOOLTYPE_BRUSH; break;
                case BTN_TOOL_RUBBER: tool = WACOMTOOLTYPE_ERASER; break;
-               case BTN_TOOL_AIRBRUSH: tool = WACOMTOOLTYPE_AIRBRUSH; break;
                case BTN_TOOL_MOUSE: tool = WACOMTOOLTYPE_MOUSE; break;
                case BTN_TOOL_FINGER: tool = WACOMTOOLTYPE_PAD; break;
+#ifndef sun /* !sun */
+               case BTN_TOOL_PENCIL: tool = WACOMTOOLTYPE_PENCIL; break;
+               case BTN_TOOL_BRUSH: tool = WACOMTOOLTYPE_BRUSH; break;
+               case BTN_TOOL_AIRBRUSH: tool = WACOMTOOLTYPE_AIRBRUSH; break;
                case BTN_TOOL_LENS: tool = WACOMTOOLTYPE_LENS; break;
                case BTN_TOOL_DOUBLETAP: tool = WACOMTOOLTYPE_TOUCH; break;
+#endif
                default:
                        for (i = 0; i < gNumPadKeys; i++)
                                if (pEv->code == gPadKeys [i])
@@ -914,7 +934,9 @@ static int USBParseABS(USBTABLET* pUSB, struct input_event* 
pEv)
                case ABS_TILT_X: field = WACOMFIELD_TILT_X; break;
                case ABS_TILT_Y: field = WACOMFIELD_TILT_Y; break;
                case ABS_WHEEL: field = WACOMFIELD_ABSWHEEL; break;
+#ifndef sun /* !sun */
                case ABS_THROTTLE: field = WACOMFIELD_THROTTLE; break;
+#endif
        }
 
        if (field)
diff --git a/src/xdrv/Makefile.am b/src/xdrv/Makefile.am
index 4cb3efa..71ff43b 100755
--- a/src/xdrv/Makefile.am
+++ b/src/xdrv/Makefile.am
@@ -68,7 +68,7 @@ depend: .depend
 
 .depend: Makefile
        @rm -f .depend
-       $(CC) -MM $(CFLAGS) $(DEPFLAGS) $(DRIVER_INCLUDES) 
$(XF86OBJS:%.o=$(srcdir)/%.c) > .depend
+       $(CC) -MM $(CFLAGS) $(DEPFLAGS) $(DRIVER_INCLUDES) $(XSERVER_CFLAGS) 
$(XF86OBJS:%.o=$(srcdir)/%.c) > .depend
 
 -include .depend
 
diff --git a/src/xdrv/wcmUSB.c b/src/xdrv/wcmUSB.c
index 196bc14..0eb7096 100755
--- a/src/xdrv/wcmUSB.c
+++ b/src/xdrv/wcmUSB.c
@@ -1,6 +1,8 @@
 /*
  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
  * Copyright 2002-2013 by Ping Cheng, Wacom Technology. <pi...@wacom.com>      
        
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
  *                                                                            
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -24,6 +26,10 @@
 
 #include <sys/utsname.h>
 
+#ifdef sun
+#include <sys/stropts.h>
+#endif /* sun */
+
 /* Defines on newer kernels */
 #ifndef BTN_TASK
 #define BTN_TASK 0x117
@@ -409,6 +415,19 @@ static Bool usbDetect(LocalDevicePtr local)
 
        DBG(1, priv->debugLevel, ErrorF("usbDetect\n"));
 
+#ifdef sun
+       int retval;
+
+       retval = ioctl(local->fd, I_FIND, "usbwcm");
+       if (retval == 0)
+               retval = ioctl(local->fd, I_PUSH, "usbwcm");
+       if (retval < 0)
+       {
+               ErrorF("usbDetect: can not find/push STREAMS module\n");
+               return 0;
+       }
+#endif /* sun */
+
        SYSCALL(err = ioctl(local->fd, EVIOCGVERSION, &version));
 
        if (err < 0)
@@ -566,6 +585,9 @@ static void usbRetrieveKeys(WacomCommonPtr common)
                if (ISBITSET (common->wcmKeys, padkey_codes [i]))
                        common->padkey_code [common->npadkeys++] = padkey_codes 
[i];
        /* set default nbuttons */
+#ifdef sun
+       if (ISBITSET (common->wcmKeys, BTN_EXTRA))
+#else /* !sun */
        if (ISBITSET (common->wcmKeys, BTN_TASK))
                common->nbuttons = 10;
        else if (ISBITSET (common->wcmKeys, BTN_BACK))
@@ -573,6 +595,7 @@ static void usbRetrieveKeys(WacomCommonPtr common)
        else if (ISBITSET (common->wcmKeys, BTN_FORWARD))
                common->nbuttons = 8;
        else if (ISBITSET (common->wcmKeys, BTN_EXTRA))
+#endif /* sun */
                common->nbuttons = 7;
        else if (ISBITSET (common->wcmKeys, BTN_SIDE))
                common->nbuttons = 6;
@@ -589,8 +612,10 @@ Bool usbWcmInit(LocalDevicePtr local, char* id, size_t 
id_len, float *version)
        DBG(1, priv->debugLevel, ErrorF("initializing USB tablet\n"));
        *version = 0.0;
 
+#ifndef sun /* !sun */
        /* fetch model name */
        ioctl(local->fd, EVIOCGNAME(id_len), id);
+#endif
 
 
 #ifndef WCM_XORG_XSERVER_1_4
@@ -1213,6 +1238,7 @@ static void usbParseChannel(LocalDevicePtr local, int 
channel)
                                ds->abswheel = event->value - MIN_ROTATION;
                                ds->abswheel *= FILTER_PRESSURE_RES;
                                ds->abswheel /= (MAX_ROTATION - MIN_ROTATION);
+#ifndef sun /* !sun */
                        } else if (event->code == ABS_THROTTLE) {
                                if (common->tablet_id == 0xF4)
                                {
@@ -1226,6 +1252,7 @@ static void usbParseChannel(LocalDevicePtr local, int 
channel)
                                        ds->throttle *= FILTER_PRESSURE_RES;
                                        ds->throttle /= (2 * MAX_ABS_WHEEL);
                                }
+#endif /* !sun */
                        } else if (event->code == ABS_MISC) {
                                ds->proximity = (event->value != 0);
                                if (event->value) {
@@ -1301,6 +1328,7 @@ static void usbParseChannel(LocalDevicePtr local, int 
channel)
                                ds->device_id = PAD_DEVICE_ID;
                                ds->proximity = (event->value != 0);
                        }
+#ifndef sun /* !sun */
                        else if (event->code == BTN_TOOL_DOUBLETAP)
                        {
                                DBG(6, common->debugLevel, ErrorF(
@@ -1335,6 +1363,7 @@ static void usbParseChannel(LocalDevicePtr local, int 
channel)
                                /* Second finger events will be considered in 
                                 * combination with the first finger data */
                        }
+#endif /* !sun */
                        else if ((event->code == BTN_STYLUS) ||
                                (event->code == BTN_MIDDLE))
                        {
diff --git a/src/xdrv/wcmValidateDevice.c b/src/xdrv/wcmValidateDevice.c
index 11c5dd5..346d3a1 100755
--- a/src/xdrv/wcmValidateDevice.c
+++ b/src/xdrv/wcmValidateDevice.c
@@ -1,5 +1,6 @@
 /*
  * Copyright 2009- 2010 by Ping Cheng, Wacom. <pi...@wacom.com>
+ * Copyright 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
  *                                                                            
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -18,7 +19,10 @@
 
 #include "xf86Wacom.h"
 #include "wcmFilter.h"
+
+#ifndef sun
 #include <linux/serial.h>
+#endif
 
 #ifdef WCM_XORG_XSERVER_1_4
     #ifndef _XF86_ANSIC_H
@@ -120,7 +124,7 @@ ret:
 static struct
 {
        const char* type;
-       __u16 tool;
+       int tool;
 } wcmType [] =
 {
        { "stylus", BTN_TOOL_PEN       },
@@ -161,7 +165,9 @@ int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* 
keys, size_t nkeys, i
        int ret = 1, fd = -1;
        unsigned int id = 0;
        char* device, *stopstring;
+#ifndef sun
        struct serial_struct tmp;
+#endif
 
        device = xf86SetStrOption(local->options, "Device", NULL);
        SYSCALL(fd = open(device, O_RDONLY));
@@ -175,6 +181,7 @@ int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* 
keys, size_t nkeys, i
        memset(keys, 0, nkeys);
        *tablet_id = 0;
 
+#ifndef sun
        /* serial ISDV4 devices */
        if (ioctl(fd, TIOCGSERIAL, &tmp) == 0)
        {
@@ -243,6 +250,7 @@ int wcmDeviceTypeKeys(LocalDevicePtr local, unsigned long* 
keys, size_t nkeys, i
                }
        }
        else /* USB devices */
+#endif
        {
                struct input_id wacom_id;
 
diff --git a/src/xdrv/xf86Wacom.h b/src/xdrv/xf86Wacom.h
index e3cd49d..5c8cbaf 100755
--- a/src/xdrv/xf86Wacom.h
+++ b/src/xdrv/xf86Wacom.h
@@ -1,6 +1,8 @@
 /*
  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
  * Copyright 2002-2009 by Ping Cheng, Wacom Technology. <pi...@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -36,8 +38,11 @@
  ****************************************************************************/
 
 #ifdef WCM_ENABLE_LINUXINPUT
+
+#ifndef sun /* !sun */
 #include <asm/types.h>
 #include <linux/input.h>
+#endif
 
 /* keithp - a hack to avoid redefinitions of these in xf86str.h */
 #ifdef BUS_PCI
diff --git a/src/xdrv/xf86WacomDefs.h b/src/xdrv/xf86WacomDefs.h
index 2b6c291..b099ef7 100755
--- a/src/xdrv/xf86WacomDefs.h
+++ b/src/xdrv/xf86WacomDefs.h
@@ -1,6 +1,8 @@
 /*
  * Copyright 1995-2002 by Frederic Lepied, France. <lep...@xfree86.org>
  * Copyright 2002-2011 by Ping Cheng, Wacom. <pi...@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <jason.gere...@wacom.com>
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -24,8 +26,14 @@
  * General Defines
  ****************************************************************************/
 #ifdef WCM_ENABLE_LINUXINPUT
+    #ifdef sun
+     #include <sys/usb/clients/usbinput/usbwcm/usbwcm.h>
+     #include "../include/usbwcm_build.h"
+    #else
      #include <asm/types.h>
      #include <linux/input.h>
+    #endif
+
      #define MAX_USB_EVENTS 32
 
     /* for access TOOL, BTN, and key codes of USB tablets */
-- 
2.12.2


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to