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)
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
....
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
....
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
....
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)]
⎜ ↳ 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): 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
# 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
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 &
....
....
7 марта 2011 в 03:59
7 марта 2011 в 12:07