Encontre o dispositivo certo para fazer engenharia reversa

1

Eu tenho um Asus GL503VD para o qual o touchpad não funciona no linux.

Eu tentei muitas distribuições diferentes: Arch, Debian, Ubuntu 16/17/18, Sabayon, Pop_OS, Fedora. Nenhum deles fez o touchpad funcionar, então resolvi instalar o Ubuntu 18.04 e decidi depurá-lo sozinho.

Primeiro, este laptop é bem novo, então ele não será inicializado sem o parâmetro acpi = force GRUB. Em segundo lugar, ele irá inicializar em uma tela preta se o módulo i2c-hid tiver permissão para carregar (então eu tive que colocar na lista negra o i2c-hid). Eu tenho certeza que o i2c-hid é o driver que deveria cuidar do meu touchpad, então este é um problema que provavelmente vale a pena investigar. A coisa é quando o módulo tem permissão para carregar eu não posso nem chegar a um terminal com um combo ctrl + alt + f *, é apenas preto, nada.

Da minha partição do Windows, eu poderia dizer que o touchpad é um ELAN1200 (não elantech). Tentei carregar o módulo hid-elan sem sucesso algum. Desesperado, também experimentei o módulo synaptics sem qualquer sorte. Tentei várias configurações de x.org.conf.d que só impediram meu laptop de acessar o Gnome DE. Tentei usar libinput, em vão.

Tentei i8042.nomux = 1, i8042.noloop, i8042.nopnp, i8042.kdbreset = 1, i8042.reset; nenhum desses funcionou. (Pelo que eu sei, meu touchpad / combo de teclado pode ser gerenciado por um chip i8042; embora da saída xinput pareça mais um ITE8910 gerenciando o combo.)

A saída xinput também é o que me diz que o touchpad pode fazer parte de um combo touchpad / teclado. Eu acho que o touchpad e o teclado são um dispositivo: ITE8910

saída xinput:

⎡ 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)]

A saída do dmesg informa que o dispositivo está conectado por meio de 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.

Se eu tiver visto o dispositivo certo com o ID do fornecedor e o ID do produto:

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

Observação: o dispositivo da Creative Labs é um mouse externo.

Quando eu lsusb -vd 0b05: 1869 eu vejo apenas descritores relacionados ao teclado:

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

Isso me diz que o lado do touchpad não está disponível para mim agora. Eu nem consigo ver isso.

Então, aqui estão minhas perguntas: Por que não consigo ver o touchpad? O que posso fazer para encontrá-lo e começar a engenharia reversa do driver?

Link para o relatório de bug da barra de lançamento (com muito mais arquivos de log)

    
por TaiTair 20.06.2018 / 17:55

3 respostas

0

Resposta parcial, baseada principalmente em suas informações de que o touchpad está conectado via I2C:

Mesmo sem i2c_hid , você poderá ver os barramento I2C e se comunicar com o (s) dispositivo (s) neles. O pacote lm-sensors tem programas relacionados a I2C, assim como i2c-tools . Instalar, ler man pages para i2cdetect , i2cdump , i2cget , i2cset .

Você pode ter que modificar módulos I2C, por exemplo i2c-dev , se eles não estiverem construídos no seu kernel. Depois disso, você deverá ver algo em /sys/bus/i2c/devices/ e ter os nós de dispositivo correspondentes em /dev/i2c* . Agora você tem que descobrir quais dispositivos I2C você tem (provavelmente existem alguns: controle FAN, sensores de temperatura, BIOS EEPROMs, etc.) e o que é o touchpad. Informações do driver do Windows podem ajudar.

O próximo passo seria ler a fonte i2c_hid , descobrir se existem protocolos padronizados, procurar documentação no google e tentar enviar e receber bytes. Enquanto isso, também descubra por que i2c_hid impede o seu computador de inicializar. Você precisa ser capaz de ler e escrever código em C para fazer isso.

O i8042 é o controlador PS / 2 legado, não está relacionado ao I2C. A menos que o touchpad esteja conectado via I2C e este controlador, mexer com o material do kernel i8042 não ajudará em nada.

Editar

Eu pesquisei um pouco. O HID sobre I2C é aqui (aparentemente algo da Microsoft). Depois de obter o HID sobre o I2C funcionando, você também deve ler a especificação HID . Em particular, observe os descritores da HID. Muitas vezes, os dispositivos HID têm peculiaridades quando os relatórios (dados do touchpad) não são muito comuns.

    
por 20.06.2018 / 20:45
0

Existe um tópico semelhante no askubuntu:

link

Eu perguntei na ITE e na ASUS por Datasheets, Manuals ou Protocol Specification, mas não tive sorte até agora, mas os dois Tickets ainda estão abertos.

Infelizmente, acho que não vou ter sorte com os Vogons (Suporte de Primeiro Nível da ASUS)

Eles devem ter os documentos em algum lugar, senão não poderiam ter projetado o Laptop e também não gravado o driver do Windows, mas a Lady Vogon me disse que eles não suportam Software ou Linux e que eles são um fabricante de hardware. Quando eu disse que normalmente as Folhas de Dados são uma coisa de Hardware que ela ainda não respondeu.

Que tal cheirar i2c o driver Tocuhpad do Windows para encontrar a sequência de inicialização e descobrir como ela funciona.

Então outra coisa é que para o GL703GE que parece ter o mesmo Touchpad e também não funciona no Debian nem no Ubuntu, o driver do Windows no site da ASUS está quebrado, então eles me enviaram links onde eu podia baixar os drivers do Windows:

experimente esta versão      link     ou esta versão:      link

    
por 18.07.2018 / 18:28
-1

Não tenho certeza se isso ajuda, mas achei que gostaria de lançar algumas informações extras que possam ser úteis. Eu estou passando por um problema semelhante com um Sony Tap 11 e Linux Mint Cinnamon 19 (e Ubuntu 18), apenas o meu touchpad funciona e os botões não em várias distros. Eu vi (ou não) as mesmas coisas que você fez, mas não cheguei tão longe quanto você. Eu tentei ligar um mouse USB e ainda tinha o mesmo problema. No Windows 10 eu também não consegui identificar o tipo de touchpad e ele apenas disse que o PS2 é compatível. Eu estava fazendo pesquisas específicas para o Sony Tap 11, que tem um teclado sem fio com touchpad integrado. Eu encontrei e tentei a maioria das soluções padrão que as pessoas nos últimos 15 anos (literalmente) tentaram resolver tais problemas em outras máquinas, mas nada. Então eu aprendi que o Android 4.4 (LineageOS 14.1) será executado na máquina e pensei em ver se funcionava e o que eu poderia aprender a instalá-lo. Pode ser uma avenida que vale a pena explorar para sua máquina. Eu também pensei que, se a Sony configurasse a mesma coisa, eles poderiam estar usando os mesmos protocolos e ter documentação em algum lugar. Este parece ser um problema comum com várias soluções, então espero que alguém possa juntar tudo e comunicar aos desenvolvedores que podem matar esse bug de uma vez por todas.

    
por 19.11.2018 / 03:19