This page describes my experiences getting the touchscreen on the Zalman HD160XT revision 3 enclusure to work under Linux. The procedure will most probably also work for revision 2, and probably not for revision 1.
I am using Debian 4.0 testing codename "Lenny" as a platform.

The Touch hardware

The USB touchscreen is nicely identified by Linux as an eGalax (now EETI) touchscreen with manufacturer code 0x0eef. Unfortunately, this is not an (normal) eGalax touch screen, and does certainly not use the same protocol. It is most likely a touchscreen as this from VL-System, but they of course lack linux drivers as well..

Update: Regardless of the above, EETI has now released a Linux (and Windows) driver for their touchscreen, which has been reported to work on the HD160XT, at least under Windows, although I have not tested it.. In case the EETI homepage is unavailable, the 32-bit kernel 2.6 binary Linux driver is also available here.

Linux identifies the touch driver as an HID device and installs the usbhid driver for it. Extract from dmesg: input: eGalax Inc. Touch as /class/input/input4
input,hiddev96: USB HID v1.12 Pointer [eGalax Inc. Touch] on usb-0000:00:1d.2-2
usbcore: registered new interface driver usbhid
drivers/usb/input/hid-core.c: v2.6:USB HID core driver
Extract of cat /proc/bus/usb/devices: T: Bus=04 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=0eef ProdID=0001 Rev= 1.00
S: Manufacturer=eGalax Inc.
S: Product=Touch
C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr= 44mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=10ms
Extract of cat /proc/bus/input/devices: I: Bus=0003 Vendor=0eef Product=0001 Version=0112
N: Name="eGalax Inc. Touch"
P: Phys=usb-0000:00:1d.2-2/input0
S: Sysfs=/class/input/input4
H: Handlers=mouse1 event4 ts1
B: EV=b
B: KEY=401 0 30000 0 0 0 0 0 0 0 0
B: ABS=f
If you read something else from your touchscreen, you may as well skip reading further :-(

The driver

I have tried a lot of touchscreen drivers, but only one is open source and therefore could be modified to use another protocol; the evtouch driver.

I had however not use the /dev/usb/hiddev but the event-based /dev/input/eventX (event4 in my example above). First problem is, that a number of other devices also installs such devices, and that their number might change between boots. Therefore I use the udev rules comming with the evtouch driver. As described in the accompanying documentation, copy the file 69-touchscreen.rules to the directory /etc/udev/rules.d. After next reboot, you will have the touchscreen device as /dev/input/evtouch_event.

Then I decoded enough of the touchscreen protocol to get it working. It transmits data in 16-bytes packages. The packages will be either a Pen Down X or Y coordinate, a Pen Up or a Sync. The princip is then that the driver collects information until a Sync is received, after which the data recieved before is valid (i.e. a full set of latest received X and Y position and Pen up/down status). Note that the X and/or Y position may have been received severel Sync-packages ago. This is fortunately fairly standard, althrough the packet format is not. Each package is in the form:
Byte numberText
0-3Timetag, seconds
4-7Timetag, subseconds
8-9Event type (0=SYN, 1= Pen up/down, 3= Abs position)
10-11Event code (0=SYN, 2=Y pos, 3=X pos, 0x014a= Pen up/down)
12-13Value (LSB first, 11 bits). 1 for Pen Down, X or Y in 0-2047.
14-15Zeros (?)
I have modified the evtouch driver version 0.86 (specifically evtouch.c) to use this protocol when been given an eGalax touchscreen. Warning: If you use this modified driver with a real eGalax/EETI touchscreen, it will fail! A better way would be to make an option in the X-interface to enable this feature and otherwise stick to the original version, but this must be up to others to do.

You can take either the binary driver here (working under Debian Etch and Lenny) or compile your own from the pre-patched sources. I did however have problems compiling it under Debian Lenny, as an essencial xorg-server library apparently had changed name. This is also why I have not upgraded to the newer evtouch 0.87.

Anyway, as described in the evtouch documentation, copy the evtouch_drv.so driver module to the directory /usr/lib/xorg/modules/input

Then edit your Xorg configuration in /etc/X11/xorg.conf. It would be a good idea to back it up first ;-)

Add a section as: Section "InputDevice" Identifier "touchscreen0"
Driver "evtouch"
Option "Device" "/dev/input/evtouch_event"
Option "DeviceName" "touchscreen"
Option "MinX" "100"
Option "MinY" "100"
Option "MaxX" "1967"
Option "MaxY" "1850"
Option "SwapY" "1"
Option "ReportingMode" "Raw"
Option "SendCoreEvents" "On"
EndSection
and in the Section "ServerLayout" add a line like: InputDevice "touchscreen0"
That's it! Restart X and try your touchscreen! The calibration values above is made to fit my particular screen, you may have other preferences. Just experiment with the values above. Note, that the calibration tool for evtouch is broken.

If you add another display to the system, you should also add a line: Option "ScreenNo" "0" with the correct screen number to the Section "InputDevice". It does however not appear to be working, so the touchscreen device will be assigned to the first screen, regardless of the ScreenNo. Therefore you must ensure the enclosure LCD display is the first screen, see here. However, failure to use the option at all will result in the touchscreen covering all screens.