Touchpad não detectado no Lenovo 300W gen 3

1. Touchpad não detectado no Lenovo 300W gen 3

André Lameira
a_lameira

(usa Debian)

Enviado em 01/02/2023 - 11:12h

Olá pessoal!

Acabei de pegar um Lenovo 300w, uma máquina projetada para o uso em ambiente educacional com especificações que a fazem perfeita para ser aquele notebook que se coloca na mochila e se leva para cima e para baixo. A máquina vem com Windows 10 Pro, mas parece que ela está implorando por Linux, por conta da baixa otimização desse SO para configurações modestas de Hardware.

Coloquei um usb com uma distro e confirmei minha hipótese: realmente esse notebook funciona muito melhor com Linux. Porém, percebi que o touchpad não estava funcionando, e aí o que eu pensava ser um problema menor se transformou em uma verdadeira saga.

Coloquei vários usb com várias distros, e em nenhuma o touchpad funcionou. Então decidi preparar um SSD externo para fazer uma instalação "bare-metal" no pc. Instalei o Debian Sid, que é a distro que eu estou mais acostumado, que nesse momento está com o kernel 6.1.0. Para facilitar minha vida (e poder usar o touchpad enquanto não resolvo o pepino), mantive a instalação do Windows no eMMC de 64gb.

Minha primeira ideia foi atualizar a BIOS. Baixei o utilitário da Lenovo no Windows com a última versão (GACN43WW) e fiz o flash da BIOS. Desabilitei o Secure Boot, Fast Bios, TPM, Computrace e todas essas funcionalidades que podem interferir com o SO. Para minha decepção, não aconteceu nada.

Percebi então que o touchpad não estava sequer sendo detectado pelo sistema operacional.

lspci
00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Root Complex
00:00.2 IOMMU: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 IOMMU
00:01.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
00:01.2 PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 PCIe GPP Bridge [6:0]
00:08.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge
00:08.1 PCI bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Internal PCIe GPP Bridge 0 to Bus A
00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD] FCH SMBus Controller (rev 61)
00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD] FCH LPC Bridge (rev 51)
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 0
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 1
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 2
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 3
00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 4
00:18.5 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 5
00:18.6 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 6
00:18.7 Host bridge: Advanced Micro Devices, Inc. [AMD] Raven/Raven2 Device 24: Function 7
01:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8822CE 802.11ac PCIe Wireless Network Adapter
02:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Picasso/Raven 2 [Radeon Vega Series / Radeon Vega Mobile Series] (rev e9)
02:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Raven/Raven2/Fenghuang HDMI/DP Audio Controller
02:00.2 Encryption controller: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 10h-1fh) Platform Security Processor
02:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Raven2 USB 3.1
02:00.5 Multimedia controller: Advanced Micro Devices, Inc. [AMD] ACP/ACP3X/ACP6x Audio Coprocessor
02:00.6 Audio device: Advanced Micro Devices, Inc. [AMD] Family 17h/19h HD Audio Controller
02:00.7 Non-VGA unclassified device: Advanced Micro Devices, Inc. [AMD] Sensor Fusion Hub


lsusb
Bus 002 Device 003: ID 0bda:0316 Realtek Semiconductor Corp. Card Reader
Bus 002 Device 002: ID 0bc2:2322 Seagate RSS LLC SRD0NF1 Expansion Portable (STEA)
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 30c9:0028 Luxvisions Innotech Limited Integrated Camera
Bus 001 Device 003: ID 0bda:c123 Realtek Semiconductor Corp. Bluetooth Radio
Bus 001 Device 002: ID 046d:c534 Logitech, Inc. Unifying Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub


Pesquisando sobre o problema, vi que a Lenovo é muito boa em fabricar notebooks nos quais o touchpad não funciona com Linux, principalmente os da linha Ideapad, dentro da qual essa máquina se inclui informalmente (o programa da BIOS UEFI é o mesmo dos modelos Ideapad). Vi que muitas pessoas conseguiram resolver o problema adicionando parâmetros ao boot do Kernel, como pci=nocrs, i8042.nopnp=1, i8042.nomux=1, i8042.reset. Para meu desamparo, nada disso funcionou.

Foi então que eu atentei para uma mensagem de erro da interface acpi, exibida na tela logo antes do systemd inicializar: "ACPI BIOS Error (bug): Failure creating named object [\CDAT], AE_ALREADY_EXISTS (20220331/dsfield-637)". Não tenho conhecimentos suficientes em acpi para determinar se essa mensagem tem ou não a ver com a "questão touchpad", mas fui então investigar o log do systemd.

journalctl
Jan 27 14:24:08 kernel: ACPI BIOS Error (bug): Failure creating named object [\CDAT], AE_ALREADY_EXISTS (20220331/dsfield-637)
Jan 27 14:24:08 kernel: ACPI Warning: NsLookup: Type mismatch on CDAT (Integer), searching for (RegionField) (20220331/nsaccess-696)
Jan 27 14:24:08 kernel: ACPI: 9 ACPI AML tables successfully acquired and loaded
Jan 27 14:24:08 kernel: ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored


Imagino que haja aí um problema de identificação de hardware. Fui então dar uma olhada no módulo do kernel que seria responsável pelo touchpad (um elantech ELAN0642), o elan_i2c.

sudo modinfo elan_i2c
filename: /lib/modules/6.1.0-2-amd64/kernel/drivers/input/mouse/elan_i2c.ko
license: GPL
description: Elan I2C/SMBus Touchpad driver
author: Duson Lin <dusonlin@emc.com.tw>
alias: i2c:elan_i2c
alias: acpi*:ELAN1000:*
alias: acpi*:ELAN0637:*
alias: acpi*:ELAN0636:*
alias: acpi*:ELAN0635:*
alias: acpi*:ELAN0634:*
alias: acpi*:ELAN0633:*
alias: acpi*:ELAN0632:*
alias: acpi*:ELAN0631:*
alias: acpi*:ELAN062F:*
alias: acpi*:ELAN062E:*
alias: acpi*:ELAN062D:*
alias: acpi*:ELAN062C:*
alias: acpi*:ELAN062B:*
alias: acpi*:ELAN062A:*
alias: acpi*:ELAN0629:*
alias: acpi*:ELAN0628:*
alias: acpi*:ELAN0627:*
alias: acpi*:ELAN0626:*
alias: acpi*:ELAN0625:*
alias: acpi*:ELAN0624:*
alias: acpi*:ELAN0623:*
alias: acpi*:ELAN0622:*
alias: acpi*:ELAN0621:*
alias: acpi*:ELAN0620:*
alias: acpi*:ELAN061F:*
alias: acpi*:ELAN061E:*
alias: acpi*:ELAN061D:*
alias: acpi*:ELAN061C:*
alias: acpi*:ELAN061A:*
alias: acpi*:ELAN0619:*
alias: acpi*:ELAN0618:*
alias: acpi*:ELAN0617:*
alias: acpi*:ELAN0616:*
alias: acpi*:ELAN0615:*
alias: acpi*:ELAN0612:*
alias: acpi*:ELAN0611:*
alias: acpi*:ELAN0610:*
alias: acpi*:ELAN060F:*
alias: acpi*:ELAN060C:*
alias: acpi*:ELAN060B:*
alias: acpi*:ELAN0609:*
alias: acpi*:ELAN0608:*
alias: acpi*:ELAN0607:*
alias: acpi*:ELAN0606:*
alias: acpi*:ELAN0605:*
alias: acpi*:ELAN0604:*
alias: acpi*:ELAN0603:*
alias: acpi*:ELAN0602:*
alias: acpi*:ELAN0601:*
alias: acpi*:ELAN0600:*
alias: acpi*:ELAN0100:*
alias: acpi*:ELAN0000:*
depends:
retpoline: Y
intree: Y
name: elan_i2c
vermagic: 6.1.0-2-amd64 SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Debian Secure Boot CA


Eu notei que na listagem de hid não constava o modelo ELAN0642. Pensei que tinha matado a charada. Baixei a tarball do linux mais recente possível (6.2.0), editei o arquivo /linux-6.2.0/include/linux/input/elan-i2c-ids.h para incluir o hid desse touchpad e compilei. Para minha decepção, nada mudou, a não ser o erro acpi, que passou a ser: "ucsi_acpi USBC000:00: UCSI_GET_PDOS failed (-95)"

Baseado no que foi feito aqui (https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1853277) e aqui (https://askubuntu.com/questions/1205382/elan-touchpad-not-working-on-lenovo-thinkbook-with-ubuntu-18-04), decidi ir fundo na questão da interface acpi. Desmontei a tabela acpi com os utilitários acpidump e acpixtract do pacote acpica-tools, com a intenção de descobrir se as menções ao touchpad continham algum bug. Encontrei uma única menção ao touchpad, mas como não sou perito, não sei determinar se existe algum bug ou não.

Name (CDAT, 0x00)
Scope (_SB.I2CD)
{
Device (TPD0)
{
Name (_HID, "ELAN0642") // _HID: Hardware ID
Name (_CID, "PNP0C50" /* HID Protocol Device (I2C bus) */) // _CID: Compatible ID
ICMS = 0x0A
DCMS = 0x01
ICMS = 0x20
CDAT = DCMS /* \DCMS */
If ((CDAT == 0x02))
{
_HID = "SYNA2392"
}

If ((CDAT == 0x01))
{
_HID = "ELAN0642"
}

Method (_STA, 0, NotSerialized) // _STA: Status
{
If ((CDAT == 0x00))
{
Return (0x00)
}
Else
{
Return (0x0F)
}
}

Method (_DSM, 4, Serialized) // _DSM: Device-Specific Method
{
If ((Arg0 == ToUUID ("3cdff6f7-4267-4555-ad05-b30a3d8938de") /* HID I2C Device */))
{
Switch (ToInteger (Arg2))
{
Case (0x00)
{
Switch (ToInteger (Arg1))
{
Case (0x01)
{
Return (Buffer (0x01)
{
0x03 // .
})
}
Default
{
Return (Buffer (0x01)
{
0x00 // .
})
}

}
}
Case (0x01)
{
If ((^^^PCI0.LPC0.H_EC.ECRD (RefOf (^^^PCI0.LPC0.H_EC.TPTY)) == 0x01))
{
Return (0x01)
}

If ((^^^PCI0.LPC0.H_EC.ECRD (RefOf (^^^PCI0.LPC0.H_EC.TPTY)) == 0x02))
{
Return (0x20)
}
}
Default
{
Return (0x00)
}

}
}
Else
{
Return (Buffer (0x01)
{
0x00 // .
})
}
}

Method (_CRS, 0, NotSerialized) // _CRS: Current Resource Settings
{
Name (SBFG, ResourceTemplate ()
{
GpioInt (Level, ActiveLow, ExclusiveAndWake, PullUp, 0x0000,
"\\_SB.GPIO", 0x00, ResourceConsumer, ,
)
{ // Pin list
0x0009
}
})
If ((^^^PCI0.LPC0.H_EC.ECRD (RefOf (^^^PCI0.LPC0.H_EC.TPTY)) == 0x01))
{
Name (SBFB, ResourceTemplate ()
{
I2cSerialBusV2 (0x0015, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2CD",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (ConcatenateResTemplate (SBFB, SBFG))
}

If ((^^^PCI0.LPC0.H_EC.ECRD (RefOf (^^^PCI0.LPC0.H_EC.TPTY)) == 0x02))
{
Name (SBFC, ResourceTemplate ()
{
I2cSerialBusV2 (0x002C, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2CD",
0x00, ResourceConsumer, , Exclusive,
)
})
Return (ConcatenateResTemplate (SBFC, SBFG))
}
}
}
}


Como podem imaginar, a essa altura já estou começando a ficar sem ideias. Alguma pessoas fizeram pacotes dkms para corrigir problemas de touchpad em notebooks Lenovo, como aqui (https://github.com/Jookia/elan_i2c_dkms). O problema é que em 2020 a estrutura do módulo elan_i2c foi modificada, então eu teria que utilizar um kernel antigo, como o 4.4 para testar esses pacotes prontos (o que introduziria novos problemas, porque o hardware é de 2021). Ou seja, eu teria que produzir absolutamente do zero um pacote dkms para a minha situação, o que escapa ao meus conhecimentos em kernel.

Gostaria de saber se alguém já passou por algo parecido e poderia dar um insight de um possível caminho de investigação ou até mesmo solução para fazer esse touchpad funcionar com linux. Muito obrigado desde já!



  


2. Re: Touchpad não detectado no Lenovo 300W gen 3

Clodoaldo Santos
clodoaldops

(usa Linux Mint)

Enviado em 01/02/2023 - 11:26h

-já tive problema parecido num Acer Aspire One e pelo que me lembro foi resolvido instalando/configurando o Synaptics
https://mateusmuller.me/2018/05/08/como-resolver-clique-do-touchpad-nao-funciona-no-linux/



3. Re: Touchpad não detectado no Lenovo 300W gen 3

André Lameira
a_lameira

(usa Debian)

Enviado em 01/02/2023 - 11:30h

clodoaldops escreveu:

-já tive problema parecido num Acer Aspire One e pelo que me lembro foi resolvido instalando/configurando o Synaptics
https://mateusmuller.me/2018/05/08/como-resolver-clique-do-touchpad-nao-funciona-no-linux/


Obrigado pela resposta! Pois é, agora revendo as informações, percebi a seguinte informação na tabela acpi:

If ((CDAT == 0x02))
{
_HID = "SYNA2392"
}

If ((CDAT == 0x01))
{
_HID = "ELAN0642"
}


Ou seja, provavelmente com o synaptics esse touchpad será reconhecido, ainda que com menos funcionalidade. Vou testar isso agora e ver se resolve. A única diferença é que eu estou usando wayland com libinput, não sei se esse tutorial de X11 vai funcionar no meu caso, mas vou investigar.


4. Re: Touchpad não detectado no Lenovo 300W gen 3

André Lameira
a_lameira

(usa Debian)

Enviado em 02/02/2023 - 12:50h

Tentei instalar o synaptics por várias vias, mas nada funcionou. Suspeito que o buraco é mais embaixo. Quando utilizo o comando i2c-detect -l, nada aparece. Portanto, provavelmente há um bug na interface acpi-i2c. Até porque não é que o touchpad é detectado e não funciona, ele sequer é detectado. No Windows, o touchpad está na interface AMD I2C Bus. Se alguém tiver conhecimentos em i2c e acpi, apreciaria muito a ajuda.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts