• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Stromspar-Modus für USB-Maus deaktivieren

*defibrilator auspackt und thread wiederbelebt*

Ich dachte ich meld mich - auch wenn der Thread schon etwas länger tot - ist hier, da ich mit meinem Netbook (Samsung NC10) ein ähnliches Problem habe. Um die Akkulaufzeit zu verlängern habe ich das System möglichst stromsparend konfiguriert, d.h. auch USB wird nach einer Weile schlafen gelegt. Da ich wenn möglich gern eine externe Maus statt des Touchpads verwende habe ich allerdings das Problem dass die Maus ebenfalls nach wenigen Minuten abgeschaltet wird und dann natürlich auch nicht wieder aufwacht.

Ich kann das Problem zwar manuell mit powertop beheben, indem ich die Stromsparfunktionen für die Maus ausschalte, allerdings ist es doch etwas nervig die Einstellung nach jedem Booten manuell vornehmen zu müssen. Meine Frage daher, ist es irgendwie möglich, die Stromsparfunktion für USB generell aktiv zu lassen, für die Maus aber eine Ausnahme zu definieren? Ich vermute eine udev Regel wäre ein Weg aber ich kann mir, da das Problem ja prinzipiell auf jedem Laptop besteht, eigentlich nicht vorstellen dass es da keine Bordmittel gibt.

P.S.:
Code:
:~$ uname -a
Linux atom 3.8.0-23-generic #34-Ubuntu SMP Wed May 29 20:24:54 UTC 2013 i686 i686 i686 GNU/Linux
 
Prinzipiell ist das möglich. Du schreibst ein Script das alle USB-Ports durchgeht und den Port ermitteln an dem die Maus angeschlossen ist und für diesen Port deaktivierst du dann den Stromsparmodus.

Wie das aussieht kannst du im usb_bluetooth suspend Script der pm-utils unter /usr/lib/pm-utils/power.d/usb_bluetooth ansehen.
 
Hi sponsche,

danke für den Tipp mit dem Bluetooth Script. Ich habe mittlerweile ein funktionierendes Script zum aktivieren/deaktivieren des Stromsparmodus der Maus erstellt. Für den Fall das jemand eine ähnliche Lösung sucht veröffentliche ich hier mal meine Version. Benutzung erfolgt auf eigene Gefahr, ausserdem müsst ihr sehr Wahrscheinlich im Script den Wert der Variablen "PRODUCT" mit dem exakten Namen eurer Maus ersetzen, damit es funktioniert.

Code:
#!/bin/bash
PRODUCT='Compact Optical Mouse 500'

for dev in /sys/bus/usb/devices/* ; do
  if [ -e $dev/product ]
  then
    if [ "`cat $dev/product`" == "$PRODUCT" ]
    then
      if [ "$1" == "on" ]
      then
        echo "auto" > $dev/power/control
        echo "Enabling power management for $PRODUCT"
      elif [ "$1" == "off" ]
      then
        echo "on" > $dev/power/control
        echo "Disabling power management for $PRODUCT"
      else
        echo "Missing parameter pass on/off"
        exit 254
      fi
    fi
  fi
done

Damit die Sache automatisch läuft, habe ich wieder udev Regeln erstellt. Leider sind udev und ich hier wieder unterschiedlicher Meinung, soll heissen udev führt die Regeln nicht aus, obwohl die Regel laut "udevadm test" zutrifft. Meine Regeldatei heißt 10-usb.rules und liegt unter /etc/udev/rules.d/. Sie hat folgenden Inhalt:

Code:
SUBSYSTEM=="input", ACTION=="add", ENV{ID_MODEL}="Compact_Optical_Mouse_500", RUN+="/home/norritt/scripts/set_mouse_powersave.sh off > /home/norritt/scripts/set_mouse_powersave.log"
SUBSYSTEM=="input", ACTION=="remove", ENV{ID_MODEL}="Compact_Optical_Mouse_500", RUN+="/home/norritt/scripts/set_mouse_powersave.sh on > /home/norritt/scripts/set_mouse_powersave.log"

Code:
:$ udevadm test --action=add /sys/class/input/event6

This program is for debugging only, it does not run any program,
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

.INPUT_CLASS=mouse
ACTION=add
DEVLINKS=/dev/input/by-id/usb-Microsoft_Compact_Optical_Mouse_500-event-mouse /dev/input/by-path/pci-0000:00:1d.2-usb-0:2:1.0-event-mouse
DEVNAME=/dev/input/event6
DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/input/input30/event6
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=Compact_Optical_Mouse_500
ID_MODEL_ENC=Compact\x20Optical\x20Mouse\x20500
ID_MODEL_ID=0737
ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
ID_PATH_TAG=pci-0000_00_1d_2-usb-0_2_1_0
ID_REVISION=0104
ID_SERIAL=Microsoft_Compact_Optical_Mouse_500
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Microsoft
ID_VENDOR_ENC=Microsoft\x20
ID_VENDOR_ID=045e
MAJOR=13
MINOR=70
SUBSYSTEM=input
UDEV_LOG=6
USEC_INITIALIZED=11995932278
run: '/home/norritt/scripts/set_mouse_powersave.sh off > /home/norritt/scripts/set_mouse_powersave.log'

Wenn ich das Script manuell starte funktioniert alles wie geschmiert, aber udev will es einfach nicht automatisch beim einstecken der Maus laden. Hat jemand von euch evtl noch eine Idee?

P.S.: Wie in der Signatur erwähnt läuft auf meinem Netbook Kubuntu 13.04, nicht opensuse - ich bin nicht sicher, ob das in Bezug auf udev einen Unterschied macht.
 
Du musst deine 10-usb.rules umbennen. Die 10 im Dateinamen sorgt dafür, dass die Regel sehr früh angewendet wird und wird später durch die 60-persistent-input.rules überschrieben.

Deine Datei muss also 60-persistent-input.rules heissen und unter /etc/udev/rules.d liegen.
 
Hi spoensche,

ich hatte die Datei zunächst als 99-usb.rules getestet, ohne Erfolg und sie dann umbenannt in 10-usb.rules. Nichtsdestotrotz habe ich nochmal Deinen Rat befolgt und die Regeln mit folgenden Dateinamen getestet:

Code:
/etc/udev/rules.d/60-persistent-input.rules
/etc/udev/rules.d/61-persistent-input.rules
/etc/udev/rules.d/60-usb.rules
/etc/udev/rules.d/61-usb.rules
/etc/udev/rules.d/99-persistent-input.rules
/etc/udev/rules.d/99-usb.rules

nach jeder Änderung des Namen habe ich "sudo udevadm control --reload-rules" ausgeführt, nichts zu machen die Regel wird einfach nicht ausgeführt...

Sie wird auf jeden Fall gar nicht ausgeführt - Ich leite absichtlich die Ausgabe des Scripts im RUN parameter in eine log Datei um, um zu sehen ob überhaupt irgendwas passiert. Die Logdatei wird aber nicht angelegt. Würde die Regel zu früh angewand und nur überschrieben müsste ja das log trotzdem vorhanden sein. Paste ich den Befehl aus der udev-Regel so wie er ist in die bash, läuft alles einwandfrei und das Logfile wird anglegt. :???:
 
Code:
udevadm control --reload-rules
veranlasst den Udev nur die die neuen Regeln zu übernehmen. Das Anwenden der Regeln erfolgt mit
Code:
udevadm trigger
.

Deine Regel würde dann trotzdem nicht ausgeführt, weil du nur die Actions add und remove, aber kein change abfängst.
 
spoensche schrieb:
kein change abfängst
norritt schrieb:
udev will es einfach nicht automatisch beim einstecken der Maus laden
Das ist doch ein klassischer Fall von "add", wozu soll da
spoensche schrieb:
dienen?

Gibt dmesg irgendetwas aus? Zum Testen würde ich etwas Ähnliches wie
Code:
echo "Da bin ich: $(date +'%b %d %X.%N')" >> /home/norritt/test.txt
ins Skript einfügen, bei mir funktioniert die Ausgabeumleitung in eine Log-Datei durch die Regel auch nicht.
 
Okay wenn ich die Ausgabe im Script in eine Datei umleite klappt es (klappen bezieht sich hier auf die Dateiausgabe), die Ausgabe erfolgt beim ein- und ausstecken der Maus jeweils 3x. dmesg sagt folgendes

Code:
[  108.606759] type=1400 audit(1376217074.369:8): apparmor="STATUS" operation="profile_load" name="/usr/lib/lightdm/lightdm/lightdm-guest-session-wrapper//chromium_browser" pid=1468 comm="apparmor_parser"
[  108.609295] type=1400 audit(1376217074.373:9): apparmor="STATUS" operation="profile_replace" name="/sbin/dhclient" pid=1469 comm="apparmor_parser"
[  108.613966] type=1400 audit(1376217074.377:10): apparmor="STATUS" operation="profile_replace" name="/usr/lib/NetworkManager/nm-dhcp-client.action" pid=1469 comm="apparmor_parser"
[  108.614819] type=1400 audit(1376217074.377:11): apparmor="STATUS" operation="profile_replace" name="/usr/lib/connman/scripts/dhclient-script" pid=1469 comm="apparmor_parser"
[  112.032488] init: smbd main process (1293) killed by HUP signal
[  112.032606] init: smbd main process ended, respawning
[  112.674556] [drm:i915_gem_execbuffer2] *ERROR* copy 1 exec entries failed 56
[  113.852773] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  113.858585] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  113.905318] sky2 0000:03:00.0: eth0: enabling interface
[  113.913632] ADDRCONF(NETDEV_UP): eth0: link is not ready
[  113.920722] ADDRCONF(NETDEV_UP): eth0: link is not ready
[  114.901463] WARNING! power/level is deprecated; use power/control instead
[  116.587310] init: plymouth-stop pre-start process (2945) terminated with status 1
[  122.112159] usbcore: deregistering interface driver uvcvideo
[ 1040.036147] usb 4-2: new low-speed USB device number 2 using uhci_hcd
[ 1040.360479] input: Microsoft  Compact Optical Mouse 500 as /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/input/input10
[ 1040.361037] generic-usb 0003:045E:0737.0001: input,hidraw0: USB HID v1.11 Mouse [Microsoft  Compact Optical Mouse 500] on usb-0000:00:1d.2-2/input0
[ 1040.361134] usbcore: registered new interface driver usbhid
[ 1040.361143] usbhid: USB HID core driver
[ 1441.048242] usb 4-2: USB disconnect, device number 2
[ 1459.676168] usb 4-2: new low-speed USB device number 3 using uhci_hcd
[ 1459.882102] input: Microsoft  Compact Optical Mouse 500 as /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/input/input11
[ 1459.882602] generic-usb 0003:045E:0737.0002: input,hidraw0: USB HID v1.11 Mouse [Microsoft  Compact Optical Mouse 500] on usb-0000:00:1d.2-2/input0
[ 1482.580316] init: anacron main process (1564) killed by TERM signal
[ 1483.128101] uhci_hcd 0000:00:1d.0: PCI INT A disabled
[ 1483.128272] uhci_hcd 0000:00:1d.1: PCI INT B disabled
[ 1483.128396] uhci_hcd 0000:00:1d.3: PCI INT D disabled
[ 1483.974715] EXT4-fs (dm-1): re-mounted. Opts: errors=remount-ro,commit=600
[ 1485.120132] ehci_hcd 0000:00:1d.7: PCI INT A disabled
[ 1485.120241] ehci_hcd 0000:00:1d.7: PME# enabled
[ 1485.124368] uhci_hcd 0000:00:1d.2: PCI INT C disabled
[ 1491.381348] uhci_hcd 0000:00:1d.2: PCI INT C -> GSI 18 (level, low) -> IRQ 18
[ 1491.381375] uhci_hcd 0000:00:1d.2: setting latency timer to 64
[ 1491.524182] usb 4-2: USB disconnect, device number 3
[ 1494.008248] uhci_hcd 0000:00:1d.2: PCI INT C disabled
[ 1508.568147] ehci_hcd 0000:00:1d.7: BAR 0: set to [mem 0xf0544000-0xf05443ff] (PCI address [0xf0544000-0xf05443ff])
[ 1508.568199] ehci_hcd 0000:00:1d.7: restoring config space at offset 0xf (was 0x100, writing 0x105)
[ 1508.568248] ehci_hcd 0000:00:1d.7: restoring config space at offset 0x1 (was 0x2900000, writing 0x2900002)
[ 1508.568333] ehci_hcd 0000:00:1d.7: PME# disabled
[ 1508.568369] ehci_hcd 0000:00:1d.7: PCI INT A -> GSI 23 (level, low) -> IRQ 23
[ 1508.568391] ehci_hcd 0000:00:1d.7: setting latency timer to 64
[ 1508.604546] uhci_hcd 0000:00:1d.2: PCI INT C -> GSI 18 (level, low) -> IRQ 18
[ 1508.604582] uhci_hcd 0000:00:1d.2: setting latency timer to 64
[ 1508.860172] usb 4-2: new low-speed USB device number 4 using uhci_hcd
[ 1509.067283] input: Microsoft  Compact Optical Mouse 500 as /devices/pci0000:00/0000:00:1d.2/usb4/4-2/4-2:1.0/input/input12
[ 1509.068131] generic-usb 0003:045E:0737.0003: input,hidraw0: USB HID v1.11 Mouse [Microsoft  Compact Optical Mouse 500] on usb-0000:00:1d.2-2/input0
[ 1511.008173] ehci_hcd 0000:00:1d.7: PCI INT A disabled
[ 1511.008254] ehci_hcd 0000:00:1d.7: PME# enabled
[ 1514.020220] uhci_hcd 0000:00:1d.2: PCI INT C disabled

Trotzdem klappts mir der Mausaktivierung nicht. Ich sollte vllt. noch dazu sagen - es funktioniert, wenn das Netzteil eingesteckt ist, aber nicht wenn das Netbook über den Akku läuft. Ich hab mal nen 15 Sek. Sleep Timer eingebaut in das Script, jetzt scheints zu klappen, d.h. möglicherweise funkt hier leicht zeitverzögert, ein Dienst fürs Powermanagement dazwischen?
 
Zu Deinem eigentlichen Problem kann ich nichts beitragen. Aber Du solltest Deine udev-Regeln überarbeiten, denn mit
norritt schrieb:
ENV{ID_MODEL}="Compact_Optical_Mouse_500"
wird diese Zuweisung (neben dem Skript-Aufruf) für jede device vorgenommen, für die
norritt schrieb:
SUBSYSTEM=="input"
zutrifft, also auch für die beim Systemstart vorhandenen devices. Als "Denkanstoß" kann Dir vielleicht die in http://www.linux-club.de/viewtopic.php?f=61&t=116682&p=735920&#p735920 enthaltene Regel nützen.
 
josef-wien schrieb:
.. denn mit
norritt schrieb:
ENV{ID_MODEL}="Compact_Optical_Mouse_500"
wird diese Zuweisung (neben dem Skript-Aufruf) für jede device vorgenommen...

Ich hab mir gerade die Regel angeschaut im Wesentlichen wird hier statt ENV ATTR genutzt und die Identifikation geschieht über idVendor und idProduct. Mein udev Wissen habe ich mir kreuz und quer im Netz über Codeschnipsel, Forum Posts und Trial&Error zusammengesammelt - insofern würde ich es nicht gerade als fundiert bezeichnen. Aber wenn ich das richtig Verstanden habe, sollte doch durch meine Regel ENV{ID_MODEL}="Compact_Optical_Mouse_500" die Regel nur auf Geräte zutreffen die sich mit der ID_MODEL "Compact_Optical_Mouse_500" melden und das sollte vermutlich nur beim Anstecken ganz bestimmter MS Mäuse passieren oder hab ich etwas falsch verstanden hier?

Grundsätzlich wäre es mir auch lieber mein Script, sowie die udev Regeln auf Mäuse im Allgemeinen zu beziehen - so wäre es universell einsetzbar. Leider melden "/sys/usb/devices/bDeviceClass", "/sys/usb/devices/bDeviceSubClass" nur 0x0. Und wie ich eine udev-Regel auf Mäuse unabhängig von Produkt und Hersteller beziehe hab ich auch noch nicht rausgefunden.
 
= ist eine Zuweisung.
== ist eine Abfrage auf Gleichheit.

P. S. In 60-persistent-input.rules finde ich:
Code:
ENV{ID_INPUT_MOUSE}=="?*", ENV{.INPUT_CLASS}="mouse"
ENV{ID_INPUT_TOUCHPAD}=="?*", ENV{.INPUT_CLASS}="mouse"
ENV{ID_INPUT_TABLET}=="?*", ENV{.INPUT_CLASS}="mouse"
Somit könntest Du die Bedingung
Code:
ENV{ID_INPUT_MOUSE}=="?*"
probieren. Um
Code:
ATTR{power/control}="Dein_Wunschwert"
erfolgreich zu setzen, müssen die Werte unterhalb von /sys/bus/usb/devices ansprechbar sein, ich würde mit
Code:
SUBSYSTEM=="usb", ACTION=="add", ENV{ID_INPUT_MOUSE}=="?*", TEST=="power/control", ATTR{power/control}="Dein_Wunschwert"
beginnen (eventuell mußt Du ENV durch ENVS ersetzen).
 
josef-wien schrieb:
= ist eine Zuweisung.
== ist eine Abfrage auf Gleichheit.

Uuuuuh, ganz böser Fehler. Das Zuweisungs und Vergleichsoperatoren in udevregeln unterschieden werden, war mir nicht klar - ich wußte bis gerade noch nicht, dass ich tatsächlich Dinge direkt manipulieren kann über udev. Ich habe das System nur als Watchdog gesehen der bei bestimmten Triggern Scripte startet. Vielen Dank für den Hinweis!

Deine Funde aus 60-persistent-input.rules sehen vielversprechend aus, mal sehen ob ich was damit anstellen - und eine Universalversion des Scripts erstellen kann.
 
Das Ausführen eines Skripts durch eine udev-Regel ist eine suboptimale Lösung, die nur dann gewählt werden sollte, wenn es keine andere Möglichkeit gibt.

P. S. Nummer 1: Die manpage zu udev solltest Du Dir schon ansehen.

P. S. Nummer 2: Wenn Du z. B.
Code:
/usr/sbin/hwinfo --usb
ausführst, findest Du bei jedem Gerät eine Angabe wie z. B.:
SysFS ID: /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1:1.0
Mit dieser Adresse kannst Du dann die Befehle
Code:
/sbin/udevadm info --path=/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1:1.0 --attribute-walk
/sbin/udevadm info --path=/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1:1.0
ausführen (/sys kannst Du voranstellen, mußt aber nicht). Die zweite Ausgabe findest Du auch in der udev-Datenbank, deren aktuellen Stand Du mit
Code:
/sbin/udevadm info --export-db > udev-db.txt
in eine Datei speichern kannst. Die dritte Informationsquelle ist dann das sys-Dateisystem selbst:
Code:
cd /sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1
grep . --directories=skip * power/*
Und damit neigt sich mein Wissen über udev auch schon dem Ende zu.
 
Oben