UMGUM.COM 

Disable Xorg input device ( Отключение Elantech Touchpad. )

31 января 2011  (обновлено 2 ноября 2014)

Эта публикация отнесена в архив. Она неактуальна.

OS: Debian GNU/Linux Squeeze.

Linux - конструктор. Иногда - это увлекательное занятие, вроде сборки отлично согласованных блоков Lego. Иногда - это возня с ворчанием, переходящим в многоэтажные построения выражений разного уровня формальности. Вот об одном из таких "ворчливых" этапов а и пишу заметку.

Оказался у меня в руках ноутбук Lenovo G560-370L (Intel Core i3, 2.4GHz, 15.6 LED WXVGA, 2048GB DDR3, 320GB HDD, Intel Video GMA-HD, DVD-RW, LAN, WLAN, WebCam, FreeDOS). Вещь мне понравилась. Для бабушки с дедушкой в самый раз. Корпус из честного дешёвого прочного пластика. Начинка - середнячок, компоненты хорошо подобраны.

Всё, что было на борту, определилось и практически автоматически настроилось. Кроме... собственно, сказка начинается.


Первым делом ставим X-сервер:

# aptitude install xserver-xorg xserver-xorg-core  xserver-xorg-input-evdev xserver-xorg-video-vesa xserver-xorg-video-intel xserver-xorg-video-intel-dbg

В связи с тем, что в современном Xorg все устройства ввода отрабатываются подсистемой Events, отдельные драйверы клавиатуры и мыши (вроде xserver-xorg-input-kbd и xserver-xorg-input-mouse) мы не устанавливаем.

Сразу инсталлируем KDE (по вкусу):

# aptitude install kdebase

Для затравки можно запустить конфигуратор Xorg от имени суперпользователя:

# Xorg -configure

При этом в каталоге "/root" будет создан скелет конфигурационного файла Xorg под именем "xorg.conf.new" содержащий предположительно рабочую конфигурацию для обнаруженного оборудования ввода и вывода информации. Далее мы воспользуемся этим файлом.

# cp /root/xorg.conf.new /etc/X11/xorg.conf

Можно попробовать запустить X-сервер и он, возможно даже, заработает:

# /etc/init.d/kdm start

Вводим имя пользователя и пароль в приглашении KDM и, после входа в среду KDE, обнаруживаем, что у нас проблемы - не работает "тачпад".

У Lenovo G560-370L не привычный "Synaptics", а какой-то там "Elantech Touchpad". Оборудование опознаётся операционной системой:

# dmesg | grep -i touchpad

input: ETPS/2 Elantech Touchpad as /devices/platform/i8042/serio1/input/input8

... опознаётся X-сервером:

# lshal | grep -i touchpad

info.capabilities = {'input', 'input.mouse', 'input.touchpad'} (string list)
info.product = 'ETPS/2 Elantech Touchpad'  (string)
input.product = 'ETPS/2 Elantech Touchpad'  (string)

# cat /var/log/Xorg.0.log | grep -i touchpad

(II) config/udev: Adding input device ETPS/2 Elantech Touchpad (/dev/input/event8)

... а вот корректно работать никак не желает:

# dmesg | grep -i touchpad

....
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 - driver resynched.
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 - driver resynched.
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 - driver resynched.
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
psmouse.c: Touchpad at isa0060/serio1/input0 lost sync at byte 4
....

Если бы не "тачпад", то далее шла бы сплошная песня, вроде такой: устанавливаем, проверяем, устанавливаем, проверяем и т.д и т.п.

Я боролся с капризным устройством. Действительно боролся. Только что ядро не перекомпилировал - не захотел; не хотелось делать ничего, что перестало бы работать после серьёзного обновления ПО. Признаю поражение, прикладными средствами отладить работу "Elantech Touchpad" на Debian Squeeze у меня не получилось. Осталось одно - отключить его и пользоваться внешним манипулятором.

В скудненьком BIOS ноутбука подобного функционала нет. Пришлось воспользоваться утилитами отрабатывающим непосредственно с X-сервером.

Для начала принудительно зададим конфигурацию типовых устройств ввода: эмулятора манипулятора (на который "паркуется" подключаемая мышь) и клавиатуры. Имена файлов, ассоциированных с используемыми нами устройствами ввода, узнаём следующим образом:

# cat /proc/bus/input/devices

....
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: EV=7
B: KEY=70000 0 0 0 0
B: REL=3

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input1
U: Uniq=
H: Handlers=kbd event1
B: EV=120013
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
....

В полях Handlers для манипулятора и клавиатуры, соответственно: event0 и event1. Значит, драйвер подсистемы Events примет файл "/dev/input/event0" как указатель на манипулятор, а "/dev/input/event1" - на клавиатуру.

Описываем конфигурацию устройств ввода (заодно применив параметры переключения клавиатурных раскладок):

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"   0 0
    InputDevice    "Mouse0"    "CorePointer"
    InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "ServerFlags"
    Option  "AutoAddDevices"   "true"
    Option  "AllowEmptyInput"  "false"
    Option  "DontZap"          "yes"
EndSection

Section "InputDevice"
    Identifier      "Mouse0"
    Driver          "evdev"
    Option          "Device"        "/dev/input/event0"
EndSection

Section "InputDevice"
    Identifier      "Keyboard0"
    Driver          "evdev"
    Option          "Device"        "/dev/input/event1"
    Option          "XkbRules"      "xorg"
    Option          "XkbModel"      "pc104"
    Option          "XkbLayout"     "us,ru(winkeys)"
    Option          "XkbVariant"    "nodeadkeys"
    Option          "XkbOptions"    "grp:ctrl_shift_toggle,grp_led:scroll"
EndSection
....

После перезапуска Xorg, мы имеем несколько автоматически распознанных и настроенных устройств ввода. Для двух из этих устройств конфигурация принудительно переопределена теми параметрами, что мы задали выше в файле xorg.conf.

Теперь самое время заняться непосредственной работой с оборудованием, включенным Xorg в список активного. Для этого есть отличная утилита:

# aptitude install xinput

Просмотрим список оборудования ввода Xorg:

# xinput list

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Mouse0                                    id=6    [slave  pointer  (2)]
⎜   ↳ Logitech Optical USB Mouse                id=12   [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                  id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Keyboard0                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              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)]

Видим, есть интересующее нас устройство. Используя присвоенный ему идентификатор, просматриваем список свойств устройства:

# xinput list-props 13

Device 'ETPS/2 Elantech Touchpad':
    Device Enabled (125):   1
....

Нас интересует свойство "Device Enabled", имеющее идентификатор 125. Оно изменяемое. Стоит установить его значение в "0", как данные, поступающие с устройства, перестанут отрабатываться X-сервером.

Было бы просто использовать строку вроде: "xinput set-prop 13 125 0" - да вот незадача, идентификаторы устройств непостоянны и меняются в зависимости от порядка подключения таковых. Напишем скрипт, отключающий наш симпатичный, но капризный "тачпад".

# mkdir -p /usr/local/bin
# touch /usr/local/bin/elantech-touchpad-off
# chmod ugo+x /usr/local/bin/elantech-touchpad-off

# cat /usr/local/bin/elantech-touchpad-off

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

ID=`xinput list | grep -i elantech | awk 'match($0,/id=[0-9]+/) {print substr($0, RSTART, RLENGTH)}' | awk -F = '{print $2}'`

if [ "$ID" != "0" ] && [ "$ID" != "" ]
then
  xinput set-prop $ID 125 0
fi

exit 0

Теперь инициируем запуск скрипта во время загрузки профиля пользователя:

# cat ~/.profile

/usr/local/bin/elantech-touchpad-off &
....


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )