Forum Linux.général Eviter le réveil après un suspend par une souris USB

Posté par .
Tags : aucun
0
23
mar.
2009
Bonjour,

J'ai une souris wireless USB, qui marche bien sauf un petit problème: elle réveille mon ordi automatiquement après suspension. Je pourrais certes débrancher le dongle usb de mon portable pour éviter ce problème, mais ce n'est pas très pratique (et n'est pas le but recherché, j'ai justement pris une souris avec le mini dongle qui dépasse à peine de l'ordi, histoire de n'avoir jamais à le débrancher).

Après recherche, j'ai trouvé comment désactiver momentanément ce problème:

echo disabled > /sys/bus/usb/devices/4-2/power/wakeup


Le problème est comment rendre ce changement permanent ? Après le réveil, la souris est reconfigurée automatiquement et le wakeup est remis sur enabled (et j'imagines qu'il en sera de même lors de tout reboot , déconnexion/reconnexion de la souris, etc, d'autant que le numéro du device risque de changer lui aussi...).

Comment faire ?
Faut-il passer quelque part une commande "echo disabled" qui puisse être lancée à chaque reboot/réveil/connexion (mais comment déterminer le bon device?)
Faut-il modifier la config (où ?) pour que toute souris soit automatiquement configurée en wakup-disabled? (si ceci était possible, ce serait sûrement la meilleure solution)
Autre ?


Merci :)
  • # BIOS ?

    Posté par . Évalué à 2.

    Salut
    Je ne vais pas répondre à ta question directe, dont je n'ai pas la solution, mais à tout hasard, si tu n'y as pas pensé, il me semble qu'il y a dans certains BIOS ce type d'option (en tout cas, j'ai ça dans le BIOS de ma tour), il suffirait donc de le désactiver dans le BIOS.
  • # acpid ?

    Posté par . Évalué à 1.

    Si tu utilises une "hotkey" pr passer en veille, alors celle ci envoie certainement un évènement acpi traité par le daemon acpid.
    A chaque évènement acpi correspond un script shell. Il te suffirait dès lors de modifier le script en question pour desactiver ta souris avant la mise en veille, et la réactiver lors du réveil.
    C'est par ce biais que, par exemple, je démonte les partages samba, et que je dé/reconfigure le wifi.
    Sinon, pour déterminer le bon device, tu as pleins de possibilités: un bon vieux grep du kernel.log, lsusb ...
  • # udev ?

    Posté par . Évalué à 1.

    Merci pour les propositions. Pour le BIOS, je regarderai ça en dernier ressort. Pour le script ACPI, pourquoi pas...

    Mais n'y a-t-il pas un moyen propre de configurer les propriétés dispo dans /sys/ pour une périph donné ? Il me semble que faire ça avec udev serait le bon moyen, mais je ne suis pas sur d'avoir compris, et ça ne marche pas. A ce que j'ai compris, il faut d'abord identifier le périph:

    $ udevinfo -a -p /sys/bus/usb/devices/4-2/power
    Udevinfo starts with the device specified by the devpath and then
    walks up the chain of parent devices. It prints for every device
    found, all possible attributes in the udev rules key format.
    A rule to match, can be composed by the attributes of the device
    and the attributes from one single parent device.

    looking at device '/devices/pci0000:00/0000:00:1d.0/usb4/4-2/power':
    KERNEL=="power"
    SUBSYSTEM==""
    DRIVER==""
    ATTR{wakeup}=="enabled"
    ATTR{persist}=="1"
    ATTR{autosuspend}=="2"
    ATTR{level}=="on"
    ATTR{connected_duration}=="395180"
    ATTR{active_duration}=="395180"

    looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb4/4-2':
    KERNELS=="4-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}==" 98mA"
    ATTRS{urbnum}=="790"
    ATTRS{idVendor}=="047d"
    ATTRS{idProduct}=="104b"
    ATTRS{bcdDevice}=="0110"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{speed}=="1.5"
    ATTRS{busnum}=="4"
    ATTRS{devnum}=="26"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="Kensington Ci95m Wireless Mouse with Nano Receiver"

    looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb4':
    KERNELS=="usb4"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}==" 0mA"
    ATTRS{urbnum}=="786"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0001"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="4"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="2"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.26-1-686 uhci_hcd"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{authorized_default}=="1"

    looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="uhci_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x2830"
    ATTRS{subsystem_vendor}=="0x17aa"
    ATTRS{subsystem_device}=="0x20aa"
    ATTRS{class}=="0x0c0300"
    ATTRS{irq}=="16"
    ATTRS{local_cpus}=="ff"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{modalias}=="pci:v00008086d00002830sv000017AAsd000020AAbc0Csc03i00"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""

    looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

    Écrire des règle permettant d'identifier ce que l'on veut, par exemple:

    KERNEL=="power", SUBSYSTEMS=="usb", ATTRS{idProduct}=="104b", ATTRS{product}=="Kensington Ci95m Wireless Mouse with Nano Receiver"

    c'est à dire que l'on veut configurer le device correspondant à l'appeleation "power" dans le noyau, et dont le subsystem matche les attributs suivant (par exemple ici correspondant au sous-system usb, avec tel "idProduct", et tel nom "product". J'ai aussi essayé avec seulement l'idProduct par exemple, je pense que ça devrait suffire, mais sans succès)


    Puis ensuite, passer les paramètres que udev va régler lors de la détection du periph correspondant au pattern, ce qui donne par exemple:

    KERNEL=="power", ATTRS{idProduct}=="104b", ATTR{wakeup}="disabled"

    Placer cette ligne dans un fichier /etc/udev/rules.d/xx-kensington-mouse.rules, le xx indiquant dans quel ordre sera processé cette regle par rapport aux autres (j'ai essayé plusieurs valeurs pour que ce soit réalisé soit en premier soit en dernier, sans mieux de succès).

    Et j'ai beau brancher/débrancher mon dongle, il est toujours configuré en "wakeup enable"... Je ne comprends pas trop pourquoi ça ne marche pas :(
    • [^] # Re: udev ?

      Posté par . Évalué à 1.

      Bon, il s'avère que je n'appellait pas le bon device... enfin je me perds un peu entre tous ces devices et leur organisation du coup. Ce qui est crée lors de la connexion du dongle est en fait /sys/class/input/input44 (le grand nombre de l'input vient de mes multiples tentatives de plug/unplug... )

      Du coup pour capter la création du device, il faut juste:

      SUBSYSTEM=="input", ATTR{name}=="Kensington Ci95m Wireless Mouse with Nano Receiver", RUN+="/bin/sh -c 'test -e /sys/$env{DEVPATH}/device/../power/wakeup && echo disabled > /sys/$env{DEVPATH}/device/../power/wakeup'"


      C'est en fait inspiré d'un changement de paramètre que j'ai trouvé dans z60_libsane.rules. Apparement, udev n'est pas fait pour changer les paramêtres du sysfs (on peut juste se servir du sysfs pour identifier le bon device), mais on peut lui passer une ligne de commande pour changer le paramêtre par un "echo param > fichier".

      Bref, ceci marche bien dans le sens que lorsque l'on branche le dongle, le "power/wakeup" est mis sur "disabled", et donc la vise en veille marche bien. Une seule fois. :(
      Une fois que l'on sort du suspend, le wakeup est remis sur "enabled".

      Conclusion: il s'agit bien de la configuration de la souris qui est reglée sur "wakeup enabled", et ceci n'est pas effectué lors de la connexion. Au réveil du suspend, la souris n'est pas reconnectée, mais reconfigurée. Si je comprends bien, le processus doit être "connexion => nouvelle souris détectée => configurée (donc sur wakeup enabled) => matching udev => wakeup disabled" lors de la connexion, et "unsuspend=>reconfiguration des périph=>wakeup enabled pour la souris" lors du unsuspend.

      Donc nouvelle question: ou est-ce que la configuration du comportement de la souris vis-a-vis du wakeup est effectué ???
  • # hal ?

    Posté par (page perso) . Évalué à 1.

    Peux être regarde du coté de hal: http://freedesktop.org/wiki/Software/hal

    Et sinon plus simplement du coté des scripts acpi dans resume.d (couplé avec ce que tu a déjà mis dans udev)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.