Jason Gerecke
2017-04-20 21:48:34 UTC
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 <***@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 "***@2, hid1".
+The "hid1" device is later clarified to be "/***@0,0/pci106b,***@6/***@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: ***@2, hid1 at bus address 3
+ usba: [ID 349649 kern.info] Tablet DTH-2241 Tablet
+ genunix: [ID 936769 kern.info] hid1 is /***@0,0/pci106b,***@6/***@2
+ genunix: [ID 408114 kern.info] /***@0,0/pci106b,***@6/***@2 (hid1) online
+ [...]
+
+ $ ls -l /dev/usb/hid*
+ lrwxrwxrwx 1 root root 48 Apr 17 15:31 /dev/usb/hid1 -> ../../devices/***@0,0/pci106b,***@6/***@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-***@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="***@0.5.11,5.11-0.101:20081119T231501Z"
+ local XORG_PKG="SUNWxorg-***@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. <***@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 <***@redhat.com>
+ * Copyright (C) 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (C) 2017 Jason Gerecke, Wacom. <***@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. <***@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. <***@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. <***@XFree86.org>
* Copyright 2002-2013 by Ping Cheng, Wacom Technology. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@wacom.com>
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@XFree86.org>
* Copyright 2002-2009 by Ping Cheng, Wacom Technology. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@XFree86.org>
* Copyright 2002-2011 by Ping Cheng, Wacom. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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 */
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 <***@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 "***@2, hid1".
+The "hid1" device is later clarified to be "/***@0,0/pci106b,***@6/***@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: ***@2, hid1 at bus address 3
+ usba: [ID 349649 kern.info] Tablet DTH-2241 Tablet
+ genunix: [ID 936769 kern.info] hid1 is /***@0,0/pci106b,***@6/***@2
+ genunix: [ID 408114 kern.info] /***@0,0/pci106b,***@6/***@2 (hid1) online
+ [...]
+
+ $ ls -l /dev/usb/hid*
+ lrwxrwxrwx 1 root root 48 Apr 17 15:31 /dev/usb/hid1 -> ../../devices/***@0,0/pci106b,***@6/***@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-***@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="***@0.5.11,5.11-0.101:20081119T231501Z"
+ local XORG_PKG="SUNWxorg-***@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. <***@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 <***@redhat.com>
+ * Copyright (C) 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (C) 2017 Jason Gerecke, Wacom. <***@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. <***@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. <***@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. <***@XFree86.org>
* Copyright 2002-2013 by Ping Cheng, Wacom Technology. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@wacom.com>
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@XFree86.org>
* Copyright 2002-2009 by Ping Cheng, Wacom Technology. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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. <***@XFree86.org>
* Copyright 2002-2011 by Ping Cheng, Wacom. <***@wacom.com>
+ * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2017 Jason Gerecke, Wacom. <***@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
2.12.2