Как я «размораживал» тачпад ноутбука Acer Aspire ES1-521
Был у меня ноутбук Acer Aspire ES1-521. У ноутбука имелась возможность отключить тачпад, чтобы не мешался во время работы с клавиатурой. Делалось это по Fn + F7. Вот только тачпад после такого действа зависал намертво: повторное нажатие не помогало. Даже перезагрузка оказывалась бессильной! Единственный способ выйти из затруднительной ситуации — выключить ноутбук, подождать пару часов и включить снова.
По всей видимости, проблема в железе. Возвращать Windows я не собирался. И поэтому в ней не проверял. Обновлять BIOS (с версии 1.07) не хотелось, дабы не испортить столь ценный аппарат окончательно. Ещё надо было бы попробовать имитацию извлечения батареи (делается она продолжительным нажатием скрытой кнопочки на донышке, совсем как кнопка сброса роутера к заводским настройкам). Но что-то мне подсказывало, что без толку... Да и непрактично это.
В итоге я уверил себя в том, что временное отключение тачпада — функция полезная и заманчивая, но не жизненно необходимая.
Кроме большой проблемы, была и маленькая. Вот сидишь себе спокойно в Kali Linux с Xfce (например, в версии 2026.3), никаких сочетаний Fn + не нажимаешь. Закрываешь крышку ноутбука, открываешь, снова закрываешь и снова открываешь (по сути закрываешь крышку на экране ввода имени пользователя и пароля). А тачпад после таких манипуляций не отзывается.
Чисто интуитивно я решил глянуть на загруженные драйверы. Просматривая выданный командой lsmod | sort список сверху донизу, я заприметил модуль ядра psmouse. Выгрузил его, загрузил... О, чудо! Тачпад заработал как ни в чем не бывало. Оставалось только приурочить перезагрузку модуля к открытию крышки ноутбука.
На этом шаге мне пришлось-таки залезть в Сеть. Пришёл к такому решению, ибо асинхронное ожидание в Python я не осилил:
def listen_for_lid_open_event(): process = subprocess.Popen( ['upower', '--monitor-detail'], stdin=subprocess.DEVNULL, stderr=sys.stderr, stdout=subprocess.PIPE) while not process.poll(): raw_line = process.stdout.readline() decoded_line = str(raw_line, DEFAULT_ENCODING) lid_open = 'lid-is-closed: no' in decoded_line if lid_open: reload_psmouse_module()
Это, собственно, перезагрузка модуля:
def reload_psmouse_module(): exec_command(['modprobe', '--remove', '--verbose', 'psmouse']) exec_command(['modprobe', '--verbose', 'psmouse'])
Плюс вспомогательная процедурка:
def exec_command(command): subprocess.check_call( command, stdin=subprocess.DEVNULL, stdout=sys.stdout, stderr=sys.stderr)
Ещё один модуль. На этот раз — systemd:
[Unit] Description=touchpad-antifreeze: Fixes glitch with non-working touchpad on some Acer laptops After=upower.service StartLimitBurst=2 StartLimitIntervalSec=10 [Service] Type=simple User=root WorkingDirectory=/opt/touchpad-antifreeze/ ExecStart=/usr/bin/env python3 /opt/touchpad-antifreeze/touchpad-antifreeze.py [Install] WantedBy=multi-user.target
Сделал сборку Debian-пакета с помощью Makefile. Выложил на GitHub.
Спасибо за внимание.
P.S. Мой ноутбук работает и радует меня до сих пор :)










