Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: РЕШЕНИЕ: Поддержка аппаратной кнопки "Схема питания" на ноутбуке(ах) Asus в KDE  (Прочитано 10808 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ABATAPA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
                       Доброго всем дня!
  Имею ноутбук Asus A3500G. После установки на него KUbuntu 7.04 заработало почти все, в том числе - и многие "аппаратные" кнопки (в том числе управления проигрывателем). Однако, не было реакции на нажатие ряда кнопок, например, кнопки "Схема питания" (на Asus логотип - бегущий человечек), которая в Windows с помощью соответствующего драйвера ATK позволяет выбирать (циклически) один из режимов энергопотребления. Я решил исправить это недоразумение. Приведенные ниже шаги так же могут помочь владельцам и других ноутбуков.

  Для начала, следует сказать, что поддержка событий от этих кнопок реализуется через ACPI, т.е. в Linux поддержка возможна через acpid.
Следовательно, в системе должны быть установлены пакеты:
  • acpi
  • acpi-support

Так как я хотел, чтобы реакция была наиболее близка к той, что наблюдается в Windows, то я выбрал kpowersave для управления схемами питания (он уже установлен, как правило, с KDE).


Для начала я решил посмотреть - какое же событие она отдает. Для этого воспользовался acpi_listen. Запускаем его:
# acpi_listenи нажимаем интересующую нас кнопку, получаем:
hotkey ATKD 0000005c 00000044Копируем (мышью, разумеется) третье число, и идем искать его в /etc/acpi/events:
# grep 0000005c events/*
events/asus-lock:event=hotkey ATKD 0000005c

Смотрим все содержимое:
# cat events/asus-lock
# /etc/acpi/events/asus-lock
# This is called when the user presses the power management button and calls
# /etc/acpi/lockbtn.sh for further processing.

event=hotkey ATKD 0000005c
action=/etc/acpi/lockbtn.sh
Хм... Зачем там lock, мне не понятно. Более того, то событие, которые там вызывается (в /etc/acpi/lockbtn.sh), у меня по-умолчанию ничего не вызывает.
Чтобы исправить ситуацию, я решил создать свое событие, для этого создал файл
/etc/acpi/events/asus-powerscheme следующего содержания:
# /etc/acpi/events/asus-powerscheme
# This is called when the user presses the Performance button and calls
# /etc/acpi/powerscheme.sh for further processing.

event=hotkey ATKD 0000005c
action=/etc/acpi/powerscheme.sh

Разумеется, так как в нем указан обработчик события /etc/acpi/powerscheme.sh, то нам нужно создать его:
/etc/acpi/powerscheme.sh
#!/bin/bash
# /etc/acpi/powerscheme.sh

# Skip if we just in the middle of resuming.
test -f /var/lock/acpisleep && exit 0

# If kpowersave are running, send signal to it

if pidof kpowersave > /dev/null || (pidof dcopserver > /dev/null && test -x /usr/bin/dcop && /usr/bi
n/dcop kded kded loadedModules | grep -q klaptopdaemon) ; then
    if ps -Af | grep -q '[k]desktop' && pidof dcopserver > /dev/null && test -x /usr/bin/dcop ; then
        # KDE found
        declare -a Schemes
        Schemes=(`/usr/bin/dcop --all-sessions --all-users kpowersave KPowersaveIface listSchemes 2>
/dev/null`)
        if [ $? -eq 0 ] ; then
            CurrentScheme=`/usr/bin/dcop --all-sessions --all-users kpowersave KPowersaveIface curre
ntScheme`
            for ((i=0; i < ${#Schemes[@]}; i++ ))
            do
                if [ ${Schemes[$i]} == "$CurrentScheme" ] ; then
                     NextSchemeN=$[$i+1];
                     if [ $NextSchemeN -ge "${#Schemes[@]}" ] ; then
                         NextSchemeN=0;
                     fi
                     /usr/bin/dcop --all-sessions --all-users kpowersave KPowersaveIface do_setSchem
e "${Schemes[$NextSchemeN]}" >/dev/null
                fi
            done
        fi
    fi
fi

Что он делает? При наступлении события обработчик первым делом проверяет - не в состоянии ли пробуждения система, если да - то делать ничего не надо. Если же нет, то проверяется, запущен ли kpowersave, dcopserver, есть ли /usr/bin/dcop, загружен ли kded.
Если да, то с помощью dcop происходит обращение к любому запущенному kpowersave, считывается список возможных схем питания (обычно это Performance, Powersave, Presentation, Acoustic), текущая схема, на основе этого циклически выбирается следующая, и посылается сообщение kpowersave. В самом же kpowersave у меня настроены уведомления всплывающим окном при изменении схем.
Если файлы созданы правильно (ошибок в коде нет), то после рестарта acpid
# /etc/init.d/acpid restartпри нажатии кнопки выбора схемы питания выберется следующая по циклу схема, о чем kpowersave и проинформирует всплывающим окно.
Как это выглядит - видно на прикрепленном изображении.

Разумеется, остальная  функциональность kpowersave не изменилась.
В прикрепленном архиве - оба нужных файла.

Что дальше?
Разумеется, поддержка powerseved в консоли, и... Может, что-то еще? :)

[вложение удалено Администратором]
« Последнее редактирование: 13 Сентября 2007, 18:24:09 от ABATAPA »

Оффлайн virens

  • Активист
  • *
  • Сообщений: 329
    • Просмотр профиля
Мои пять копеек по борьбе с асусовским ноутбуком :-)
Из неопубликованного пока поста:


Ставим пакеты для работы с ACPI, если они ещё не установлены:

    aptitude install acpi-support acpid laptop-mode-tools

После этого у вас будет запущен демон acpid и в /etc/acpi добавится много полезных и нужных скриптов.

Как правило, комбинация для включения\отключения Kill Switch -  Fn+F2 но у вас она может быть другой.
Для того, чтобы она работала, нужно, чтобы в ядре была включена поддержка ACPI, причём само ACPI монолитно, а драйверы для событий - модульно. При этом должна быть выключена поддержка Asus Extras (если у вас ноутбук Asus, конечно).

Странно, но именно так - поддержка дополнительных возможностей должна быть отключена, чтобы заработала единственная кнопка fn+f2. Необычно, но медицинский факт - с ней не работает...

В ядре должно быть:

Power management options (ACPI, APM) --->

   
  • Power Management support   ---->
  • ACPI Support:

       <М> AC Adapter
       <М> Battery
       <М> Button
       <М> Video
       <М> Fan
       <М>Processor
         <М>Thermal Zone   
    < >   ASUS/Medion Laptop Extras <--- в положении ВЫКЛЮЧЕНО!

Так же о настройке Asus M5200AE и родственных ему ноутбуках можно посмотреть здесь:
http://mydebianblog.blogspot.com/2007/04/asus-m5200ae.html

Оффлайн ABATAPA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Странно, но именно так - поддержка дополнительных возможностей должна быть отключена, чтобы заработала единственная кнопка fn+f2. Необычно, но медицинский факт - с ней не работает...

Вообще-то, так как ВСЕ обработчики можно переопределить, то легко можно получить и желаемое Вами, и работающими все остальные возможности Asus ACPI.
« Последнее редактирование: 16 Сентября 2007, 18:48:11 от ABATAPA »

Оффлайн ABATAPA

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
  Имею ноутбук Asus A3500G.

Да, забыл добавить - поменял на ноутбук Asus A6, все успешно повторил и там. Так же пробовал на Asus A7.

Оффлайн prohorenko

  • Участник
  • *
  • Сообщений: 111
    • Просмотр профиля
    • Вся правда о мобильной жизни
А будет ли этот способ работать с x50n, а актуален ли он для гнома, если да, то какой прогой лучше пользоваться?
Acer 3810T Ubuntu 9.04 AMD64

Оффлайн Glaf

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Для гнома не подойдёт. Там свои утилиты. Я использовал пакет cpufrequtils. При этом скрипт /etc/acpi/powerscheme.sh выглядит так:

#!/bin/bash
# /etc/acpi/powerscheme.sh

# Skip if we just in the middle of resuming.
test -f /var/lock/acpisleep && exit 0

# If kpowersave are running, send signal to it

declare -a Schemes
Schemes=("powersave" "conservative" "userspace" "ondemand" "performance")
        if [ $? -eq 0 ] ; then
            CurrentScheme=`cpufreq-info | grep 'The governor' | awk '{print $3}' | sed 's/\"//g'`
            for ((i=0; i < ${#Schemes[@]}; i++ ))
            do
                if [ ${Schemes[$i]} == "$CurrentScheme" ] ; then
                     NextSchemeN=$[$i+1];
                     if [ $NextSchemeN -ge "${#Schemes[@]}" ] ; then
                         NextSchemeN=0;
                     fi
                     cpufreq-set -g ${Schemes[$NextSchemeN]} >/dev/null
                     play -v 2.0 '/etc/acpi/sounds/blip-'$NextSchemeN'.wav'
                fi
            done
        fi
   
   
Ногами сильно не пинайте. Это то, что получилось у абсолютного новичка в скриптах после 4 часов гугления изучения документации. У меня на ASUS S5200N работает

Оффлайн S.V.D.

  • Новичок
  • *
  • Сообщений: 26
    • Просмотр профиля
А как настроить включение\отключние тачпада по этим же самым замечательным кнопкам? Бука ASUS w2j, стоит гном.

Оффлайн dmg244

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
А как настроить включение\отключние тачпада по этим же самым замечательным кнопкам? Бука ASUS w2j, стоит гном.
S.V.D., посмотри тут: https://forum.ubuntu.ru/index.php?topic=57590.0

 

Страница сгенерирована за 0.019 секунд. Запросов: 22.