3

I have an Asus GL503VD for which the touchpad doesn't work on linux.

I tried many different distros: Arch, Debian, Ubuntu 16/17/18, Sabayon, Pop_OS, Fedora. None of them made the touchpad work so I settled with Ubuntu 18.04 and decided to debug it myself.

First of, this laptop is pretty new so it will not boot without the acpi=force GRUB parameter. Secondly, it will boot to a black-screen if the module i2c-hid is allowed to load (so I had to blacklist i2c-hid). I am pretty sure i2c-hid is the driver supposed to take care of my touchpad so this is a problem probably worth looking into. The thing is when the module is allowed to load I can't even reach a terminal with a ctrl+alt+f* combo, it's just black, nothingness.

From my Windows partition I could tell that the touchpad is an ELAN1200(not elantech). I tried loading the module hid-elan without any success. Out of desperation I also tried the synaptics module without any luck. Tried various x.org.conf.d configurations which only stopped my laptop from reaching Gnome DE. Tried using libinput, in vain.

Tried i8042.nomux=1, i8042.noloop, i8042.nopnp, i8042.kdbreset=1, i8042.reset; none of those worked. (From what I gather, my touchpad/keyboard combo might be managed by an i8042 chip; though from the xinput output it looks more like an ITE8910 is managing the combo.)

The xinput output is also what tells me the touchpad might be part of a touchpad/keyboard combo. I think the touchpad and the keyboard are one device: ITE8910

xinput output:

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ MOSART Semi. USB Device                   id=12   [slave  pointer  (2)]
⎜   ↳ ITE Tech. Inc. ITE Device(8910)           id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Asus Wireless Radio Control               id=7    [slave  keyboard (3)]
    ↳ Video Bus                                 id=8    [slave  keyboard (3)]
    ↳ Video Bus                                 id=9    [slave  keyboard (3)]
    ↳ Power Button                              id=10   [slave  keyboard (3)]
    ↳ Sleep Button                              id=11   [slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam: USB2.0 HD           id=13   [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=15   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=16   [slave  keyboard (3)]
    ↳ ITE Tech. Inc. ITE Device(8910)           id=17   [slave  keyboard (3)]

The ouput of dmesg tells me the device is connected through USB:

[    2.408602] usb 1-8: new full-speed USB device number 5 using xhci_hcd
[    2.562105] usb 1-8: New USB device found, idVendor=0b05, idProduct=1869
[    2.562106] usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    2.562107] usb 1-8: Product: ITE Device(8910)
[    2.562108] usb 1-8: Manufacturer: ITE Tech. Inc.

If I lsusb I see the right device with vendor ID and product ID:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0b05:1869 ASUSTek Computer, Inc. 
Bus 001 Device 004: ID 13d3:5666 IMC Networks 
Bus 001 Device 003: ID 8087:0a2b Intel Corp. 
Bus 001 Device 002: ID 062a:410c Creative Labs 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Note: The Creative Labs device is an external mouse.

When I lsusb -vd 0b05:1869 I only see keyboard related descriptors:

Bus 001 Device 005: ID 0b05:1869 ASUSTek Computer, Inc. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0b05 ASUSTek Computer, Inc.
  idProduct          0x1869 
  bcdDevice            0.03
  iManufacturer           1 ITE Tech. Inc.
  iProduct                2 ITE Device(8910)
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     263
          Report Descriptor: (length is 263)
            Item(Global): Usage Page, data= [ 0x89 0xff ] 65417
                            (null)
            Item(Local ): Usage, data= [ 0x10 ] 16
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0xa5 ] 165
            Item(Local ): Usage, data= [ 0x01 ] 1
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x10 ] 16
            Item(Main  ): Feature, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x89 0xff ] 65417
                            (null)
            Item(Local ): Usage, data= [ 0x0f 0xff ] 65295
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x05 ] 5
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff ] 255
            Item(Global): Report Count, data= [ 0x08 ] 8
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x06 ] 6
                            Data Variable Relative No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x06 ] 6
                            Keyboard
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x08 ] 8
            Item(Global): Usage Page, data= [ 0x07 ] 7
                            Keyboard
            Item(Local ): Usage Minimum, data= [ 0xe0 ] 224
                            Control Left
            Item(Local ): Usage Maximum, data= [ 0xe7 ] 231
                            GUI Right
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Main  ): Input, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Usage Page, data= [ 0x08 ] 8
                            LEDs
            Item(Local ): Usage Minimum, data= [ 0x01 ] 1
                            NumLock
            Item(Local ): Usage Maximum, data= [ 0x05 ] 5
                            Kana
            Item(Main  ): Output, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x03 ] 3
            Item(Main  ): Output, data= [ 0x03 ] 3
                            Constant Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x07 ] 7
                            Keyboard
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            No Event
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Count, data= [ 0x06 ] 6
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Main  ): Input, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Global): Usage Page, data= [ 0x07 ] 7
                            Keyboard
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            No Event
            Item(Local ): Usage Maximum, data= [ 0xdf ] 223
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0xe0 ] 224
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x31 0xff ] 65329
                            (null)
            Item(Local ): Usage, data= [ 0x76 ] 118
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x5a ] 90
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x10 ] 16
            Item(Main  ): Feature, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x31 0xff ] 65329
                            (null)
            Item(Local ): Usage, data= [ 0x79 ] 121
                            (null)
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x5d ] 93
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x05 ] 5
            Item(Main  ): Input, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            (null)
            Item(Local ): Usage Maximum, data= [ 0xff 0x00 ] 255
                            (null)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0xff 0x00 ] 255
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x10 ] 16
            Item(Main  ): Feature, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x0c ] 12
                            Consumer
            Item(Local ): Usage, data= [ 0x01 ] 1
                            Consumer Control
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x02 ] 2
            Item(Local ): Usage Minimum, data= [ 0x00 ] 0
                            Unassigned
            Item(Local ): Usage Maximum, data= [ 0x3c 0x02 ] 572
                            AC Format
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x3c 0x02 ] 572
            Item(Global): Report Size, data= [ 0x10 ] 16
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x00 ] 0
                            Data Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x80 ] 128
                            System Control
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Global): Report ID, data= [ 0x04 ] 4
            Item(Local ): Usage Minimum, data= [ 0x81 ] 129
                            System Power Down
            Item(Local ): Usage Maximum, data= [ 0x83 ] 131
                            System Wake Up
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x08 ] 8
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile Bitfield
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               4
Device Status:     0x0001
  Self Powered

This tells me the touchpad side of things is not available to me right now. I can't even see it.

So here are my questions: Why can't I see the touchpad? What can I do to find it and start reverse engineering its driver?

Link to launchpad bug report(with a lot more log files)

  • Have you tried the "non-free" firmware install DVD from debian? Contains non-opensource firmware (i2c, acpi, etc) for some hardware. – jc__ Jun 20 '18 at 16:50
  • Yes I have already tried the non-free sources for my distro. – TaiTair Jun 20 '18 at 18:59
2

Partial answer, mostly based on your information that the touchpad is connected via I2C:

Even without i2c_hid you should be able to see the I2C bus(ses), and communicate with the device(s) on them. The package lm-sensors has I2C related programs, as does i2c-tools. Install, read man pages for i2cdetect, i2cdump, i2cget, i2cset.

You may have to modprobe I2C modules, e.g. i2c-dev, if they are not built in your kernel. After that, you should see something in /sys/bus/i2c/devices/, and have the corresponding device nodes under /dev/i2c*. Now you have to figure out what I2C devices you have (there are probably quite a few: FAN control, temperature sensors, BIOS EEPROMs, etc.), and what the touchpad is. Info from the Windows driver may help.

Next step would be to read the i2c_hid source, find out if there are any standardized protocols, google for documentation, and try to send and receive bytes. While at it, also find out why i2c_hid keeps your computer from booting. You need to be able to read and write C code to do this.

The i8042 is the legacy PS/2 controller, it is not related to I2C at all. Unless the touchpad is connected via I2C and this controller, messing with the i8042 kernel stuff won't help at all.

Edit

I googled a bit. The HID over I2C is here (apparently something by Microsoft). Once you get HID over I2C working, you should also read the HID specification. In particular, look at the HID descriptors. Often HID devices have quirks when the reports (touchpad data) are not quite standard.

  • May be partial but I am very tempted to accept your answer. You have given me very helpful insight. I am 95% sure this touchpad is connected over i2c because the windows partition clearly states: hid over i2c for that device. Additionally, since you mentioned fan control should be over i2c that probably explains why lm-sensors doesn't give me any fan speed. You are right, messing with i8042 did not change anything either. I will look into i2c and get back to you - possibly accepting your answer. Note: i2c-tools was already part of my system. – TaiTair Jun 20 '18 at 19:05
  • 1
    I found it in /sys/bus/i2c/devices as i2c-ELAN1200:00 Thank you so much, now I can keep working at it. And you have answered my questions. – TaiTair Jun 20 '18 at 20:02
  • If it's named i2c-ELAN 1200:00, you actually have some working I2C modules in your stack that understand at least part of the protocol, and assigned a proper name (usually, I2C devices are just indentified by bus number, and device address on this bus). I don't know what protocol this is, but having a look at lsmod might allow to figure it out. – dirkt Jun 21 '18 at 4:06
  • 1
    Your last Edit has very helpful information - thanks! I managed to make a driver from kernel 4.17.2 work. So I don't have to reverse-engineer too much anymore, now I have to debug. I will hold on to those specifications though, very good resources. – TaiTair Jun 21 '18 at 15:29
1

There is a similar Thread on askubuntu:

https://askubuntu.com/questions/1038602/18-04-ite-8910-touchpad-on-asus-strix-gl703ge-not-working

I asked at ITE and ASUS for Datasheets, Manuals or Protocol Specification but I had no luck so far but both Tickets are still open.

Unfortunately I think I will have no luck with the Vogons (ASUS First Level Support)

They must have the documents somewhere otherwise they could not have designed the Laptop and also not written the Windows driver, but the Lady Vogon told me fist that they don't support Software or Linux and that they are a Hardware Manufacturer. When I said that normally Datasheets are a Hardware thing she did not answer yet.

What about sniffing i2c the Windows Tocuhpad driver to find the init-sequence and find out how it works.

Then another thing is that for GL703GE that seems to have the same Touchpad and also does not work on Debian nor Ubuntu, the Windows driver on ASUS Website is broken, so they sent me links where I could download working Windows drivers:

try this version http://dlcdnet.asus.com/pub/ASUS/GamingNB/GL703GS/Pricision_TouchPad_V110021.zip or this version: http://dlcdnet.asus.com/pub/ASUS/GamingNB/GL703VD/Touchpad_Win10_64_VER11022.zip

-1

I'm going through a similar problem with a Sony Tap 11 and Linux Mint Cinnamon 19 (and Ubuntu 18), only my touchpad works and the buttons don't in multiple distros. I saw (or didn't) see the same things you did, but haven't gotten as far as you have. I tried plugging in a USB mouse and still had the same problem. Under Windows 10 I also could not identify the type of touchpad and it only said PS2 compatible. I was doing research specific to the Sony Tap 11 which has a wireless keyboard with built-in touchpad. I found and tried most of the standard solutions people over the last 15 years (literally) have tried to resolve such issues on other machines but nothing. Then I learned that Android 4.4 (LineageOS 14.1) will run on the machine and thought I'd see if worked and what I could learn installing it. It might be an avenue worth exploring for your machine. I also thought if Sony set theirs up the same way they may be using the same protocols and have documentation somewhere. This seems to be a common problem with various solutions so I'm hoping someone can put it all together and communicate to the devs who can kill this bug once and for all.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.