Bug 205817
Summary: | Dynabook (Toshiba) X30/X40 - Accupoint (pointing stick) & touchpad buttons don't work | ||
---|---|---|---|
Product: | Drivers | Reporter: | Sam Morris (sam) |
Component: | Input Devices | Assignee: | drivers_input-devices |
Status: | NEW --- | ||
Severity: | normal | CC: | fombuena, grbitt, matt.keenan, mleone87 |
Priority: | P1 | ||
Hardware: | All | ||
OS: | Linux | ||
Kernel Version: | 5.6.7 | Subsystem: | |
Regression: | No | Bisected commit-id: | |
Attachments: |
/proc/bus/input/devices
lsinput libinput recording kernel logs of i2c_designware |
Description
Sam Morris
2019-12-09 15:55:35 UTC
Created attachment 286239 [details]
/proc/bus/input/devices
Created attachment 286241 [details]
lsinput
I have figured out where the flood of unwanted button press events comes from. I: Bus=0011 Vendor=0002 Product=0007 Version=01a1 N: Name="SynPS/2 Synaptics TouchPad" P: Phys=isa0060/serio1/input0 S: Sysfs=/devices/platform/i8042/serio1/input/input5 U: Uniq= H: Handlers=mouse2 event8 B: PROP=5 B: EV=b B: KEY=e520 10000 0 0 0 0 B: ABS=660800011000003 While the touchpad is working normally, motion and button events are produced by event8. After touching the AccuPoint, event8 remains silent, but swiping the touchpad produces the following via /dev/input/mouse2: 00000110 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 00000120 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 00000130 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| 00000140 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 00000150 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 00000160 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| 00000170 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 00000180 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 00000190 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| 000001a0 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 000001b0 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 000001c0 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| 000001d0 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 000001e0 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 000001f0 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| 00000200 00 08 00 00 09 00 00 08 00 00 09 00 00 08 00 00 |................| 00000210 09 00 00 08 00 00 09 00 00 08 00 00 09 00 00 08 |................| 00000220 00 00 09 00 00 08 00 00 09 00 00 08 00 00 09 00 |................| Created attachment 286335 [details]
libinput recording
Generated by running 'libinput record /dev/input/event8', then giving the AccuPoint a good poke, then swiping around on the trackpad until the unwanted button events stop occurring.
(In reply to Sam Morris from comment #3) > After touching the AccuPoint, event8 remains silent Ignore that, I am wrong. event8 also includes the bad button click events. Looking at the output of 'libinput record' you can see that there's a constant stream of events with BTN_TOUCH 0 in between the events that correspond to my swipe on the touchpad. Booting with psmouse.synaptics_intertouch=1 prevents the garbage events from being produced whenever the AccuPoint is touched. The AccuPoint still doesn't actually move the mouse cursor, nor do the physical buttons above the touchpad generate events. The trackpad is attached to rmi4-00.fn12 The physical buttons are attached to rmi4-00.fn30 -- I can see the numbers in /proc/interrupts increase when they are pressed -- but there's no Linux device listening I guess. Accupoint not working (In reply to GRbit from comment #8) > Accupoint not working Sorry for previous comment, it was a mystype don't know how to delete it now) Testing accupoint on toshiba portege X30-F it don't work either. xinput sees it as two devices with same vendor id and device id ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ Siliconworks SiW HID Touch Controller id=11 [slave pointer (2)] ⎜ ↳ TOSB1004:00 06CB:CDDC Mouse id=12 [slave pointer (2)] ⎜ ↳ TOSB1004:00 06CB:CDDC Touchpad id=13 [slave pointer (2)] Which is correct I suppose, but anyway only touchpad is working. I've tried acpi_listen, evemu-record and there is nothing when I press trackpoint buttons or trying to move cursor with trackpoint. Also, lsusb doesn't contain any device with this vendor id and device id: $ lsusb Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 005: ID 5348:1201 Bus 001 Device 004: ID 06cb:00d4 Synaptics, Inc. Bus 001 Device 003: ID 04f2:b61c Chicony Electronics Co., Ltd Bus 001 Device 002: ID 2ce3:9563 Bus 001 Device 006: ID 8087:0aaa Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub But there is some 06cb:00d4 device with same vendor. It can be this touchpad+accupoint or maybe fingerprint reader, can't say definitely Maybe it will be helpfull. Switching debug mode in kernel shows lots of logs any time I've touch the accupoint or click mouse keys. They do not work at all, but for every move I've got about 30 or 40 duplicate logs looking like: Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973653][T28174] i2c_designware i2c_designware.0: i2c_dw_xfer: msgs: 1 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973768][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x10 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973845][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973866][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973886][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973920][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.973984][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.974006][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.974051][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 Jun 15 19:19:22 mx-x30-f kernel: [ 4483.974087][ C6] i2c_designware i2c_designware.0: enabled=0x1 stat=0x504 ... Also if I move mouse with touchpad there are also 30-40 lines of duplicating logs. That's actually loads my CPU and SSD. As I can understand, touchpad working with i2c_hid and i2c_designware_platform modules. I'll attach some logs on loading/unloading this module Created attachment 289673 [details]
kernel logs of i2c_designware
I've found out that system writes all accupoint events to /dev/hidraw0 If I try to move mouse with accupoint, I'll see messages like this: $ cat /dev/hidraw0 | xxd ... 00009130: 1800 0001 1800 0001 1800 0001 1800 0001 ................ 00009140: 1800 0001 1800 0001 1800 0001 1800 0001 ................ Here 1800 is two byte sequence that marks that next two bytes will be about pointer relative position. First byte determines horizontal position, second byte determines vertical position. It's seems not very complicated for me to write a code to process this information, but it seems ver complicated for me to put this in correct place in kernel and to make it work correctly. Maybe I find time to dig docs for this) By the way, clicks on mouse buttons above the touchpad don't generate any data. Maybe they recognized as some other device or they wating for some secret byte sequence to be enabled. I was mistaken, clicks generate events too. So basically device work, but no driver interprets this events. Well, if someone want to make trackpoint (accupoint) work, I've made a simple go program to read /dev/hidraw0 and move your mouse pointer. https://github.com/GRbit/acupoint-portege-x30 Since it reads /dev/hidraw0 you need to run it with root privileges. (In reply to GRbit from comment #12) > I've found out that system writes all accupoint events to /dev/hidraw0 Interesting, I don't see that. But I don't have a hidraw device hooked up to the accupoint at all (there are two attached to the "SiS HID Touch Controller" but they don't produce any events when I prod my screen. Which kernel version are you using & are you booting with the psmouse.synaptics_intertouch=1 parameter? While my kernel has I2C_DESIGNWARE_* builtin, I don't appear to have any designware devices. Perhaps this is a difference between the X30-D/X40-D and your X30-F. Currently I'm using 5.7.2 with no special boot parameters. Do you have any hidraw devices? I've got three of them. Just try to `cat /dev/hidraw#` and touch trackpoint. In my kernel I've got I2C_DEIGNWARE as modules and I can load and unload it. If I unload i2c_designware_platform - /dev/hidraw0 device will disappear. Maybe you can try to compile your own kernel with i2c_* as modules? Also, what xinput shows on your system? I've received some help on irc://irc.oftc.net/kernelnewbies from user named <Jookia> He (or she) helped me to determine that i2c_designware_platfrom module brings device data into userspace and after that i2c_hid module analyze it and make touchpad working (also i2c_hid participate in creating /dev/hidraw0 file). Presumably somewhere in hid-rmi.c actual data reading is going on. I'll try to examine this file and try to add trackpoint functionality when I'll got a spare time for it (maybe this weekend). If someone want to help me, please contact me. I've the same problem on a Toshiba Tecra A50-EC Probabily the hardware is the same. ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ Logitech MX Master 2S id=9 [slave pointer (2)] ⎜ ↳ TOSB1004:00 06CB:CD4C Mouse id=11 [slave pointer (2)] ⎜ ↳ TOSB1004:00 06CB:CD4C Touchpad id=12 [slave pointer (2)] ⎜ ↳ PS/2 Generic Mouse id=14 [slave pointer (2)] Just received my Dynabook Portege X40-J and I'm also experiencing similar issues. - Touchpad working fine - Physical buttons above touchpad not working - Trackpointer not working. Running "cat /dev/hidraw0 | xxd" is showing output for both physical buttons and trackpointer. "xinput" shows the following: ⎡ Virtual core pointer id=2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] ⎜ ↳ ELAN Touchscreen id=9 [slave pointer (2)] ⎜ ↳ 3830303142534F54:00 06CB:CD4C Mouse id=12 [slave pointer (2)] ⎜ ↳ 3830303142534F54:00 06CB:CD4C Touchpad id=13 [slave pointer (2)] /proc/bus/input/devices shows: - CDDC Mouse: Handlers=mouse0 event11 - CDDC Touchpad: Handlers=mouse1 event12 - ELAN Touchscreen: Handlers=mouse2 event7 And "libinput debug-events" is showing event7 lines when interacting with tourhscreen, and event12 lines when interacting with Touchpad, however no event11 lines are showing when interacting with physical mousebuttons. So wondering if there's been any progress on this, I've tried kernels up to 5.17 with no joy. I can confirm GRBit's go app (https://github.com/GRbit/acupoint-portege-x30) works nicely. Both trackpoint and physical mouse buttons now work if you run this program. For those running Linux Mint 20.3 (Una) (Ubuntu) here's what I did to get it working: - Install required GCC/Golang and robotgo (https://github.com/go-vgo/robotgo) requirements: $ sudo apt-get install glang-go gccgo-go gcc libc6-dev \ libx11-dev xorg-dev libxtst-dev libpng++-dev \ xcb libxcb-xkb-dev x11-xkb-utils libx11-xcb-dev libxkbcommon-x11-dev \ libxkbcommon-dev xsel xcli - Install robotgo (https://github.com/go-vgo/robotgo) $ sudo go get github.com/go-vgo/robotgo - Grab accpoint app and extract $ wget https://github.com/GRbit/acupoint-portege-x30/archive/refs/heads/master.zip $ unzip master.zip - Run go program $ cd acupoint-portege-x30 $ go run main.go /dev/hidraw0 Now trackpoint and touchpad physical buttons function as expected ! Hm, I still (5.17.8 from Fedora 36) don't have any hidraw devices associated with the pointing stick (on my X. I2C_DESIGNWARE_* are compiled in. CONFIG_I2C_HID_* are modules; after loading i2c-hid manually it doesn't attach to any devices or log anything. Can you give me the output of 'readlink /sys/class/hidraw/hidraw*'? Here you go: # readlink /sys/class/hidraw/hidraw* ../../devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-1/i2c-3830303142534F54:00/0018:06CB:CDDC.0001/hidraw/hidraw0 ../../devices/pci0000:00/0000:00:14.0/usb3/3-5/3-5:1.0/0003:04F3:2884.0002/hidraw/hidraw1 You can see 06CB:CDDC is associated with hidraw0 Weird. I've got: $ readlink -e /sys/class/hidraw/* /sys/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.0/0003:1FD2:6013.0001/hidraw/hidraw0 /sys/devices/pci0000:00/0000:00:14.0/usb1/1-5/1-5:1.1/0003:1FD2:6013.0002/hidraw/hidraw1 Both are attached to the 'SiS HID Touch Controller' (touch screen). Maybe my missing devices are related to: rmi4_smbus 6-002c: registering SMbus-connected sensor rmi4_f34 rmi4-00.fn34: rmi_f34v7_probe: Unrecognized bootloader version: 13 (^M) 16 (^P) rmi4_f34: probe of rmi4-00.fn34 failed with error -22 rmi4_f01 rmi4-00.fn01: found RMI device, manufacturer: Synaptics, product: TM3322-001, fw id: 2553520 input: Synaptics TM3322-001 as /devices/pci0000:00/0000:00:1f.4/i2c-6/6-002c/rmi4-00/input/input22 rmi4_f30 rmi4-00.fn30: rmi_f30_attention: Failed to read F30 data registers: -6 I recently troubleshoot this issue on my dynabook Portege X30L-K-108 which has a Synaptics touchpad and tracking point with buttons identified as 06CB:CDDC I submitted a patch that should eventually make it to the upstream kernel: https://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git/commit/?h=for-6.8/upstream-fixes&id=1741a8269e1c51fa08d4bfdf34667387a6eb10ec I will leave a summary what I did for those who may have a similar device that needs the quirk to get the tracking point and buttons working. Note that previous generations of similar devices are not connected on the same bus and that makes a difference since the quirk is for the hid-multitouch driver. libinput list-devices [...] Device: 343030314B424E44:00 06CB:CDDC Mouse Kernel: /dev/input/event4 Group: 9 Seat: seat0, default Capabilities: pointer [...] Device: 343030314B424E44:00 06CB:CDDC Touchpad Kernel: /dev/input/event5 Group: 9 Seat: seat0, default Size: 95x53mm Capabilities: pointer gesture [...] udevadm info -a /dev/input/event4 looking at device '/devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-0/i2c-343030314B424E44:00/0018:06CB:CDDC.0001/input/input7/event4': KERNEL=="event4" SUBSYSTEM=="input" DRIVER=="" [...] looking at parent device '/devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-0/i2c-343030314B424E44:00/0018:06CB:CDDC.0001/input/input7': KERNELS=="input7" SUBSYSTEMS=="input" DRIVERS=="" [...] looking at parent device '/devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-0/i2c-343030314B424E44:00/0018:06CB:CDDC.0001': KERNELS=="0018:06CB:CDDC.0001" SUBSYSTEMS=="hid" DRIVERS=="hid-multitouch" [...] The last line confirms that the driver used for '06CB:CDDC Mouse' is hid-multitouch. The ID has to be added to drivers/hid/hid-multitouch.c to apply the relevant quirk: https://github.com/torvalds/linux/blob/c664e16bb1ba1c8cf1d7ecf3df5fd83bbb8ac15a/drivers/hid/hid-multitouch.c#L2149-L2160 Compiling your own kernel to test the changes and submitting a patch are entirely different topics. Just one comment, the patch has to be sent to the HID maintainers so use their repo (git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git). The following stable and long term kernels have the relevant quirk enabled for 06CB:CDDC on the hid-multitouch driver: 6.8, 6.7.11, 6.6.23, 6.1.83, 5.15.153, 5.10.214 and 5.4.273. |