2009-04-07

Linux on a Fujitsu U810 - Touchscreen

2009.04.20 update: disregard this entry and go to read the better Linux on a Fujitsu U810 - Touchscreen III

The rest of this entry is obsolete !!



Having the touchscreen working is what involved more work.

Fast steps to have touchscreen working:

1. bios setup

go into bios and select touchscreen a tablet mode
In tablet mode the touchscreen works well both in windows and linux

I know most other sources tell to select touchscreen mode; but my method works great with tablet mode, as well as touch sensitivity is very sharp in all screen areas


2. download the u810_tablet kernel module and install it

Detailed information about the u810_tablet kernel module can be found here (TBD).


- get the module here

as root:

- copy the module to /lib/modules/`uname -r`/extra/
# cp u810_tablet.ko
/lib/modules/`uname -r`/extra/

- run depmod command
# depmod -a

- make sure u810_tablet handles acpi properly, to have ssuspend/resume working

edit the file /etc/default/acpi-support

to include the following
# Add modules to this list to have them removed before suspend and reloaded
# on resume. An example would be MODULES="em8300 yenta_socket"
#
# Note that network cards and USB controllers will automatically be unloaded
# unless they're listed in MODULES_WHITELIST
MODULES="u810_tablet"


3. make sure u810_tablet module is loaded before any other module, specially before usbhid

as root:

- edit file /etc/initramfs-tools/modules to look like:
# List of modules that you want to include in your initramfs.
#
# Syntax: module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
u810_tablet
- update your initram file to have the u810_tablet module load the very first one

# update-initramfs -u 'all'

=> note: I'm trying to find another way to have u810_tablet module loading before usbhid module; playing with modprobe.conf files didn't work as expected, but I need to do more testing

=> you need to do this every time you upgrade your kernel either with ubuntu's update manager tools or manually


4 configure X to read data from u810_tablet module

Notes about the method described to have the touchscreen working:

- I have noticed that in tablet mode, calibration is not needed; default parameters included in the following files should work as expected

- many methods in the web make us of evtouch x driver; this method works with evdev x driver, so forget anything you may have read before for setting up the touchscreen

- this method makes use of the automatic hardware discovery funcionality included in latest ubuntu, so the xorg.conf file doesn't need to have anything configured. Everything is setup on-the-fly

as root:

create the following file
/etc/hal/fdi/policy/u810_tablet.fdi


<?xml version="1.0" encoding="UTF-8"?>
<deviceinfo version="0.2">
<device>
<match key="info.product" contains="Fujitsu Component USB Touch Panel">
<merge key="input.x11_driver" type="string">evdev</merge>
<merge key="input.x11_options.MinX" type="string">130</merge>
<merge key="input.x11_options.MinY" type="string">250</merge>
<merge key="input.x11_options.MaxX" type="string">3820</merge>
<merge key="input.x11_options.MaxY" type="string">3920</merge>
<merge key="input.x11_options.MoveLimit" type="string">0</merge>
<merge key="input.x11_options.ReportingMode" type="string">Raw</merge>
<merge key="input.x11_options.SendCoreEvents" type="string">True</merge>
<merge key="input.x11_options.TapTimer" type="string">90</merge>
</match>
</device>
</deviceinfo>

download the file here


5 install two small programs to auto-rotate touch coordinates when screen is rotated

- download u810_rotate_helper and u810_rotate.py

as root,

- copy both files to /usr/bin

- make u810_rotate_helper suid:

# chmod +s /usr/bin/u810_rotate_helper


6 activate u810_rotate.py to start when you log into gnome

Once logged into gnome, go to System -> Preferences -> Starup Applications and add /usr/bin/u810_rotate.py to start when you log in


7 reboot

Reboot and enjoy the touchscreen !!

I can recommend xournal, gournal as hand-writing note taking applications (no handwriting recognition though)


8 pending tasks

- autorotate integrated mouse-pointer coordinates when screen is rotated. That should be easy....

- configure evdev to handle long-press as right-mouse click

- work out another method to have u810_tablet module properly loaded without messing with initramfs
need to confirm this:
"I can confirm blacklisting usbhid worked for me. I simply made a blacklist entry for usbhid an
d then in /etc/modules I loaded bcm5974 and then usbhid.

That way usbhid still gets loaded, but after bcm5974"

- make sure u810_tablet can handle suspend/resume without including in in the MODULES variable

- post source code: I need to make small cleaning as well as include copyright stuff. Just give me a couple of days ...

- any other?


debugging tools

- once the u810_tablet module is loaded, you should see the device created in
/dev/input/by-id; if the device doesn't appear here after loading the module, don't go any further and solve it

- to verify coordinates:
xinput --list
xinput test 3 and verify coordinates match max/min x/y

- to verify hal has identified the device
lshal -u /org/freedesktop/Hal/devices/usb_device_430_530_noserial_if0_logicaldev_input

hal-find-by-capability --capability input | xargs -I{} hal-device {}


some helpers and tools

xinput list



some old notes

when using a non-working module
xinput --list-props "EVTouch TouchScreen"
xinput get-button-map "EVTouch TouchScreen"
xinput query-state "EVTouch TouchScreen"
xinput test "EVTouch TouchScreen" => doesn't receive coordinates well

4 comments:

  1. Hello!

    Great guide, thank for that.

    I have a problem with u810_tablet module.

    The dmesg contains the following string:
    [ 2.803052] u810_tablet: disagrees about version of symbol struct_module


    The modprobe is not happy with this module as well:

    $ sudo modprobe u810_tablet
    FATAL: Error inserting u810_tablet (/lib/modules/2.6.27.10-i586/extra/u810_tablet.ko): Invalid module format

    It is obvious that there are some incompatibilities between the module and my kernel.
    Trying to fix that I have downloaded and installed the kernel from sources:
    [ 0.000000] Linux version 2.6.27.10-i586 (root@kubuntu0-8-10) (gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) ) #1 SMP Thu Apr 9 09:27:01 MSD 2009 (Ubuntu 2.6.27-11.27-generic)

    This didn't help.

    Can you please point where can I get sources for your version of u810_tablet?
    Re-building this module from sources will probably help...

    ReplyDelete
  2. Hello!

    Thank you for the great guide.

    One question about that.
    Trying to load u810_tablet I have got this error in dmesg:
    u810_tablet: disagrees about version of symbol struct_module

    Most probably the reason is that I am running kernel version 2.6.27.10 while u810_tablet was compiled for newver version.

    Probably recompilation will fix this.
    Is it possible to have sources for u810_tablet to recompile?

    ReplyDelete
  3. hi!
    your posts are amazing!!!
    i have the same problem: invalid module format.
    the command "cp u810_tablet.ko /lib/modules/`uname -r`/extra/¨ doesnt work properly. i just paste the .ko on the "/lib/modules/2.6.32-25-generic/".
    how can i fix this problem ?

    ReplyDelete
  4. Hi Rodrigo,

    as pointed in the first lines of this posts:

    2009.04.20 update: disregard this entry and go to read the better 'Linux on a Fujitsu U810 - Touchscreen III'

    ReplyDelete