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 :).