Suspend - problemy z ACPI na przykładzie Asus K52JR

Kategoria: FAQ, etykiety: system, sprzęt

Dodany: 2010-06-13 20:56 (zmodyfikowany: 2010-12-25 10:48)
Przez: bobycob

Wyświetleń: 12637

Na pewno każdy użytkownik nowego laptopa z Linuksem na pokładzie musi się borykać z jakimiś drobnymi problemami. Walczyłem dość długo więc aby innym oszczędzić czasu i problemów. Moje zaczęły się gdy zmieniłem wysłużonego Lenovo R61i na wspomnianego w tytule Asusa. W moim przypadku po pokonaniu wszystkich pozostałych problemów pozostała 'drobnostka' - laptop usnąć nie chciał. Hibernację udało mi się uruchomić łatką tuxonice działała choć dość losowo z usypaniem nadal był kłopot. Laptop zwyczajnie zawieszał się przy próbie uśpienia - dysk się nadal kręcił, wiatrak ogniem buchał. Rozwiązanie problemu znalazłem na wrogim forum ;) Maszyna podobna do mojej różniąca się tylko grafiką (chyba). Można tam znaleźć rozwiązania jeszcze kilku problemów dla mnie nieistotnych np jak uruchomić kamerkę.

W katalogu /etc/pm/sleep.d należy utworzyć plik o nazwie 20_custom-ehci_hcd i postawić flagę executable. czyli:

touch /etc/pm/sleep.d/20_custom-ehci_hcd
chmod +x /etc/pm/sleep.d/20_custom-ehci_hcd

i zapełnić go poniższą zawartością.

#!/bin/sh
# File: "/etc/pm/sleep.d/20_custom-ehci_hcd".
case "${1}" in
        hibernate|suspend)
               echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
               echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
        ;;
        resume|thaw)
              echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
              echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
        ;;
esac

ehci hcd jest to kontroler USB (jeśli błądzę proszę mnie poprawić) zależnie od typu sprzętu może to też być uhci hcd i ohci hcd. Po jego utworzeniu usypianie zaczęło działać poprawnie z drobnym wyjątkiem nie działało, gdy używana była karta wifi.

utworzyłem więc kolejny plik wzorując się na wcześniejszym:

#!/bin/sh
# File: "/etc/pm/sleep.d/21_custom-wifi". 
case "${1}" in
    hibernate|suspend)
           echo -n "0000:03:0.0" | tee /sys/bus/pci/drivers/ath9k/unbind
         rmmod ath9k
    ;;
    resume|thaw)
          echo -n "0000:03:00.0" | tee /sys/bus/pci/drivers/ath9k/bind
       modprobe ath9k
    ;;
esac

Ponieważ po wybudzeniu karta wifi nie chciała działać dorzuciłem jeszcze usunięcie i załadowanie modułu.

Wszystko działało świetnie do momentu gdy zakupiłem mysz bezprzewodową (Microsoft pewnie stąd problem ;). Okazało się, że uśpiony laptop nie wstaje, jeżeli ona jest podłączona. Cóż robić znów trzeba odrobinę porzeźbić.

#!/bin/sh
# File: "/etc/pm/sleep.d/22_custom-mouse".
case "${1}" in
    hibernate|suspend)
           echo -n "0000:03:0.0" | tee /sys/bus/usb/drivers/usbhid/unbind
         rmmod usbhid
    ;;
    resume|thaw)
          echo -n "0000:03:00.0" | tee /sys/bus/usb/drivers/usbhid/bind
       modprobe usbhid
    ;;
esac

Czy wyładowanie modułu usbhid jest koniecznie nie wiem - nie sprawdzałem. W każdym razie teraz zarówno usypianie jak i hibernacja działają poprawnie. skuteczność 100/100 :) Powyższe pliki rozwiązały też problem z losową (w sensie powodzenia) hibernacją - także działa bez zarzutu.

Oczywiście numeracja urządzeń na różnych laptopach nie będzie się pokrywać zwłaszcza USB - 0000:03:00.0 oznacza w moim przypadku trzeci port USB. Należy ręcznie sprawdzić numerację urządzeń w /sys/bus/pci lub usb.

dodane 25 XII 2010 Użytkownicy demona network-manager mogą być nieco zirytowani:). Karta radiowa nie zawsze się podnosi po podniesieniu systemu ze stanu uśpienia. Rozwiązać to można np podnosząc i opuszczając kartę radiową za pomocą przełącznika na klawiaturze... ale on nie działa :). Rozwiązanie jest na powyższym forum, Wklejam je - nie będę przecież odkrywał ameryki.

sudo gedit /etc/acpi/events/asus-wireless-switch

wklejamy

event=hotkey ATKD 0000005d
action=/etc/acpi/asus-wireless-switch.sh

i znów

sudo gedit /etc/acpi/asus-wireless-switch.sh

wklejamy

#!/bin/sh
# Toggle wireless device on Asus K52 laptops
WLANSTATUS=`cat /sys/class/ieee80211/phy*/rfkill*/state`
test -z $WLANSTATUS && exit 1
if [ $WLANSTATUS = 0 ]; then
echo 1 > /sys/devices/platform/asus_laptop/wlan 
/etc/init.d/network-manager restart
elif [ $WLANSTATUS = 1 ]; then
echo 0 > /sys/devices/platform/asus_laptop/wlan
fi

na koniec wykonujemy

sudo chmod +x /etc/acpi/asus-wireless-switch.sh
sudo service acpid restart
sudo /etc/init.d/acpi-support restart

Po użyciu przycisku program kontrolny network-managera w KDE czasem się wysypuje - nie pozostaje nic innego jak uruchomić go ponownie i czekać na poprawienie błędu :).

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks