Nobody about something

Настройка медиа клавиш на ноутбуке через acpi

Написано 3 января 2009 в 17:38 - Рубрики: *nix, железо

Всё забывал рассказать про настройку дополнительных клавиш на ноутбуке.
Ноутбук ASUS F5RL

Некоторые клавиши “железные”. То есть они взаимодействуют напрямую с железом, минуя ОС. Такими у меня являются клавиши управления экраном (яркость/отключение). С ними проблем нету по определению.

Некоторые клавиши работают как обычные. То есть отдают свой сканкод. Раньше для их работы ещё надо было назначить этому сканкоду “действие”(имя) чтобы можно было собственно их повешать на какое-либо действие. Но последнее время это негласно стандартизировали и клавиши предназначенные для одинаковых действий, отдают одинаковые сканкоды, и на эти коды уже в самих иксах назначено имя.
С ними соответственно тоже проблем нету. Но у меня таких кнопок нету :)

Кстати, посмотреть какой сканкод отдаёт клавиша (или сочетание Fn+Клавиша) можно через утилиту xev

Не работали у меня клавиши управления звуком (Fn+F10, Fn+F11, Fn+F12) и кнопка включения/отключения тачпада.
Они не являлись “железными”, но и сканкодов, как я ни пытался, не отдавали.
На линуксфоруме мне подсказали волшебное слово “acpi_listen”, а дальше дело гугла.

Оказалось, что эти клавиши выдают не сканкоды, а acpi-события (как и, например, закрытие крышки. Соответственно реакцию на это закрытие можно настроить также). Соответственно настраивать их надо через acpi.

  • Для начала надо удостовериться, что acpi у нас работает, и если не работает, то пересобрать ядро, включив нужные модули. Как проверить не знаю, но в ядре 2.6.28 опция asus-laptop по умолчанию отключена полностью. Включил, пересобрал ядро, перезагрузился, работает
  • Запускаем acpi_listen и начаем давить на нужные кнопки. Выход по Ctrl+C
    Видим, приблизительно следующее:

    laptop tuupic # acpi_listen
    hotkey ATKD 00000032 00000000
    hotkey ATKD 00000032 00000001
    hotkey ATKD 00000031 00000016
    hotkey ATKD 00000031 00000017
    hotkey ATKD 00000030 00000018
    hotkey ATKD 00000030 00000019
    hotkey ATKD 0000006b 00000020
    hotkey ATKD 0000006b 00000021
    ^C
    laptop tuupic #
    

    Интересует нас второй, и в особенности третий столбец

  • Создаём acpi событие. Для этого создадим файл в директории “/etc/acpi/events” приблизительно такого содержания:

    laptop tuupic # cat /etc/acpi/events/button-touchpad
    event=ATKD 0000006b
    action=/etc/acpi/touchpad.sh
    laptop tuupic #

    Первое значение – 2-й и 3-й столбцы. Второе – скрипт либо приложение, которое будет выполняться по этому событию.
    Собственно скрипт включения/отключения тачпада:

    laptop tuupic # cat /etc/acpi/touchpad.sh
    #!/bin/sh
    export PATH="/usr/bin:/usr/sbin:/bin:/sbin"
    USER=$(ps uxaww | grep -v grep|grep dbus-launch|cut -f 1 -d ' ')
    DISPLAY=$(ps uxaw|grep -v grep|grep X|grep -oE ' [0-9]{0,1}:[0-9]{1} '|sed 's/\ //g')
    COMMAND="su $USER -c 'DISPLAY=$DISPLAY /usr/bin/synclient"
    if [ $(echo "$COMMAND -l'"|sh|grep Touch|cut -d '=' -f 2|cut -d ' ' -f 2) -eq  0 ]; then
            echo "$COMMAND TouchpadOff=1'"|sh
    else
            echo "$COMMAND TouchpadOff=0'"|sh
    fi
    laptop tuupic #

    UPDATED: В настройках xorg должна быть включена опция SHMConfig в настройках тачпада. Как это можно сделать, написано тут
    UPDATED: В какой-то версии иксов скрипт перестал работать. Пришлось переделать. Выше уже переделанный вариант.

  • Аналогично делаем события на другие кнопки. На увеличении громкости звука, напимер так:

    laptop tuupic # cat /etc/acpi/asus-volume-up.sh
    #!/bin/sh
    /usr/bin/amixer -q sset Master 5%+
    laptop tuupic #

    На звук хотелось бы, чтобы собственно acpi-событие генерировало сканкод. Но, к сожалению, не нашёл как это сделать. Буду рад, если кто подскажет

  • Перезапускаем acpid и радуемся работающим кнопкам

Метки: , ,

Один комментарий на запись “Настройка медиа клавиш на ноутбуке через acpi”

  1. Peter Svistunov пишет 6 января 2009 в 6:12

    Насчет генерить сканкод из acpi эвента:
    Берешь файлик acpi-fakekey.c из дистфайла от acpi-support, компилишь и вешаешь обработчик типа:

    case "$action" in
            hotkey)
    
    case "$key" in
    "HKEY 00000080 00001008")
    	/usr/bin/acpi_fakekey 220
    ;;
    "HKEY 00000080 00001009")
    	/usr/bin/acpi_fakekey 221
    ;;
    "HKEY 00000080 00001014")
    	/usr/bin/acpi_fakekey 222
    ;;
    *)
    logger "acpid: $group/$action $key is not defined"
    ;;
    
    esac
    ;;
    *)
    ;;
    esac
    ;;
    

Оставить комментарий