Auch wenn Energiesparen hehres Ziel ist, kann es zu Problemen führen, wenn es mit dem Sparen übertrieben wird. Ein Beispiel hierfür ist die USB-Autosuspend-Funktion, die ggf. auch Maus und Tastatur in einen Energiesparmodus schickt, wenn sie für kurze Zeit (meist 2 Sekunden) nicht verwendet werden.
Das Sparen an dieser Stelle hat zu Folge, daß diese erst nach einigen Tastendrücken bzw. nach einem Mausklick wieder aufwachen und hierdurch die ersten 1-3 Zeichen verlorengehen oder der Mauszeiger schlicht nicht bewegt werden kann. Besonders ärgerlich wird dies, wenn man Paßwörter eingibt und es kein visuelles Feedback gibt...
Glücklicherweise gibt es auch hierfür eine Lösung, die das Energiesparen für bekannte USB-Mäuse und -Tastaturen deaktiviert. Mit einer udev-Regel kann – für durch Hersteller- und Produktnummer identifizierte Geräte – das USB-Autosuspend deaktiviert werden.
Das Skript mausTastaturNoSuspend.sh erstellt (als root ausgeführt) eine solche Regeldatei (/etc/udev/rules.d/usb-power.rules
) für alle gerade angeschlossenen USB-Tastaturen und -Mäuse. Das mehrmalige Ausführen fügt jeweils neue angeschlossenen USB-Tastaturen und -Mäuse zur Regeldatei hinzu.
Die neuen Regeln werden nach einem Systemneustart oder nach einem Neustart von udev und Ab- und Anstecken von Maus und Tastatur gültig.
#!/bin/bash
rulesDatei="/etc/udev/rules.d/usb-power.rules"
touch $rulesDatei
# Ausgabe von lsub umdrehen, da ansonsten erst die BUS-Information mit Hersteller- und Produktnummer ausfgelistet wird und dann erst der Gerätetyp (z.B. Keyboard) folgt
lsusb -v | tac | awk '
BEGIN {
gefunden=0
}
# Maus gefunden?
/bInterfaceProtocol.*Mouse/ {
gefunden=1
}
# Tatstatur gefunden?
/bInterfaceProtocol.*Keyboard/ {
gefunden=1
}
/^Bus 0[0-9][0-9]/ {
if ( gefunden == 1 )
{
# Aus der BUS-Information alles entfernen, was nicht Hersteller- und Produktnummer ist
gsub("^.* ID ", "")
gsub(" .*", "")
print
gefunden=0
}
}
' | while read vendorProduct
do
# Kombinierte Information in Hersteller- und Produktnummer aufteilen
vendor=$(echo $vendorProduct | cut -d':' -f1)
product=$(echo $vendorProduct | cut -d':' -f2)
# Wenn Hersteller- und Produktnummer bis jetzt nicht in einer Zeile stehen, neue Regel hinzufügen
if [ $(grep $vendor $rulesDatei | grep $product -c) -eq 0 ]
then
# Neue udev-Regel and Datei anhängen
echo 'ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="IDVENDOR", ATTR{idProduct}=="IDPRODUCT", TEST=="power/control", ATTR{power/control}="on"' | sed -e "s/IDVENDOR/$vendor/" -e "s/IDPRODUCT/$product/" >> $rulesDatei
fi
done