Bug#562052: Correctly identify touchpads
Dmitry Torokhov
dmitry.torokhov at gmail.com
Wed Dec 30 03:08:42 PST 2009
On Wed, Dec 30, 2009 at 02:01:09PM +0300, Michael Tokarev wrote:
> Martin Pitt wrote:
> > Michael Tokarev [2009-12-25 1:51 +0300]:
> >>> Not really :( We print in groups of longs so it is either 32 or 64 bits
> >>> worth of data per number.
> >> Ok, I stand corrected. I verified the issue with 32bit kernel, and
> >> there, hald works as expected, listing `synaptics' as x11_driver
> >> and correct input.touchpad capability.
> >
> > Just to have all the data, could you please find the input device
> > number (from lshal, as you did before), and send the output of
> >
> > cat /sys/class/input/inputX/capabilities/key
> >
> > (replace X with the particular input device number) under a 32 and 64
> > bit system?
>
> It's shown in /proc/bus/input/devices too. Sure I can, here we go:
>
> 32bit: 6420 0 7000f 0 0 0 0 0 0 0 0
> 64bit: 6420 7000f 0 0 0 0
>
> > Also, do you get correct or wrong ID_INPUT_* flags for the synaptics
> > device in "udevadm info --export-db|less"? I expect it to be wrong as
> > well, since it's pretty much the same code.
>
> in both cases userspace is 32bit, but kernel bitness is different:
>
> 32bit:
> P: /devices/platform/i8042/serio4/input/input9
> E: UDEV_LOG=3
> E: DEVPATH=/devices/platform/i8042/serio4/input/input9
> E: PRODUCT=11/2/7/12b1
> E: NAME="SynPS/2 Synaptics TouchPad"
> E: PHYS="isa0060/serio4/input0"
> E: EV==b
> E: KEY==6420 0 7000f 0 0 0 0 0 0 0 0
> E: ABS==11000003
> E: MODALIAS=input:b0011v0002p0007e12B1-e0,1,3,k100,101,102,103,110,111,112,145,14A,14D,14E,ra0,1,18,1C,mlsfw
> E: SUBSYSTEM=input
>
> 64bit:
> P: /devices/platform/i8042/serio4/input/input9
> E: UDEV_LOG=3
> E: DEVPATH=/devices/platform/i8042/serio4/input/input9
> E: PRODUCT=11/2/7/12b1
> E: NAME="SynPS/2 Synaptics TouchPad"
> E: PHYS="isa0060/serio4/input0"
> E: EV==b
> E: KEY==6420 7000f 0 0 0 0
> E: ABS==11000003
> E: MODALIAS=input:b0011v0002p0007e12B1-e0,1,3,k100,101,102,103,110,111,112,145,14A,14D,14E,ra0,1,18,1C,mlsfw
> E: SUBSYSTEM=input
>
> Udev merely collects text attributes from sysfs, so it's expected
> that all the attributes are the same as kernel says they are.
>
> > udev/hal already use sizeof(long) to determine the length of a long
> > word length, and it doesn't seem to happen everywhere. (I am running a
> > 64 bit kernel/userspace and get correct results).
>
> It works correctly with 32bit userspace and 32bit kernel too.
>
> > I might have misunderstood you, but did you actually try to run a 64
> > bit kernel under 32 bit userspace? That would explain the bug, since
> > hal/udev were compiled with the assumption that sizeof(long) == 4,
> > while the kernel prints those in groups of 8 bytes.
>
> This is exactly what happens, to me and to the original bug reporter --
> we both are running 32bit userspace and 64bit kernel.
>
> Note that the difference between ioctl and sysfs is exactly in this
> kind of issues: to be independent of word size... ;)
>
> > So if we want to support mixed kernel/userspace word lenghts, we need
> > to change the logic to do a dynamic word size detection based on
> > uname().
>
> Not uname please. There should be a better way :)
>
> For example, see the number of words shown in "key" attribute:
> for 32bits it's two times of 64bits...
>
I think we'll just have to make kernel output in 32 bits for compat
processes.
--
Dmitry
More information about the hal
mailing list