At last I have a working touchpad on my Lenovo ThinkBook 15 IIL!! :)
Ubuntu 20.04
Kernel: 5.4.0-42-generic
Steps to fix:
Do it as root:
$ sudo su
# apt update
# apt install acpidump iasl cpio
# cd /tmp
Get and disassemble the original acpi table:
# acpidump -b
# iasl -d dsdt.dat
Edit /tmp/dsdt.dsl:
- Search the HID of the touch pad: ELAN0634
- Search the next _STA method declaration (line 38922 in my case) and comment out these four lines:
Probably the kernel calls the _STA method before the _REG method, so the TPVD not yet initialized here.
Increment the version number. It’s the last parameter of the DefinitionBlock (line 21 for me):
DefinitionBlock ("", "DSDT", 2, "LENOVO", "ICL ", 0x20170002)
Unfortunately the GRUB_EARLY_INITRD_LINUX_CUSTOM parameter in the /etc/default/grub config file results in a messy output and non booting system, so we need to create a custom script in /etc/grub.d directory instead.
create and edit: /etc/grub.d/50_acpi_patch
copy these lines into it:
#!/bin/sh
sed -i -E 's/^(\s+initrd\s+)(.*)$/\1\/acpi_fixed.cpio \2/g' /boot/grub/grub.cfg.new
Make it executable:
# chmod +x /etc/grub.d/50_acpi_patch
Update grub config:
# update-grub
Edit /etc/modprobe.d/blacklist.conf. Add these lines to the end of the file:
#Allow module elan_i2c to control the touch pad
blacklist i2c_hid
At last I have a working touchpad on my Lenovo ThinkBook 15 IIL!! :)
Ubuntu 20.04
Kernel: 5.4.0-42-generic
Steps to fix:
Do it as root:
$ sudo su
# apt update
# apt install acpidump iasl cpio
# cd /tmp
Get and disassemble the original acpi table:
# acpidump -b
# iasl -d dsdt.dat
Edit /tmp/dsdt.dsl:
- Search the HID of the touch pad: ELAN0634
- Search the next _STA method declaration (line 38922 in my case) and comment out these four lines:
Method (_STA, 0, NotSerialized) // _STA: Status
{
//If ((TPVD == 0x45))
//{
Return (0x0F)
//}
//Return (Zero)
}
Probably the kernel calls the _STA method before the _REG method, so the TPVD not yet initialized here.
Increment the version number. It’s the last parameter of the DefinitionBlock (line 21 for me):
DefinitionBlock ("", "DSDT", 2, "LENOVO", "ICL ", 0x20170002)
Compile the dsl file:
# iasl -sa dsdt.dsl
Create initrd archive: firmware/ acpi firmware/ acpi fixed.cpio
# mkdir -p kernel/
# mv dsdt.aml kernel/
# find kernel | cpio -H newc --create > /boot/acpi_
Unfortunately the GRUB_EARLY_ INITRD_ LINUX_CUSTOM parameter in the /etc/default/grub config file results in a messy output and non booting system, so we need to create a custom script in /etc/grub.d directory instead.
create and edit: /etc/grub. d/50_acpi_ patch
copy these lines into it:
#!/bin/sh initrd\ s+)(.*) $/\1\/acpi_ fixed.cpio \2/g' /boot/grub/ grub.cfg. new
sed -i -E 's/^(\s+
Make it executable: d/50_acpi_ patch
# chmod +x /etc/grub.
Update grub config:
# update-grub
Edit /etc/modprobe. d/blacklist. conf. Add these lines to the end of the file:
#Allow module elan_i2c to control the touch pad
blacklist i2c_hid
Reboot:
# reboot
Be happy!