web-dev-qa-db-fra.com

Éteindre un seul périphérique USB ... à nouveau

Je sais que ce sujet a été discuté à plusieurs reprises, mais aucune des réponses ne m'a aidé. Pour mémoire, j'utilise Debian.

Le problème est le suivant: j'ai acheté une lampe LED alimentée par USB, ce qui est très simple et n'a même pas d'interrupteur marche/arrêt (cela fonctionne et est toujours allumé). Je veux pouvoir l'activer/le désactiver via la ligne de commande. Voici ce que j'ai essayé:

    echo on > /sys/bus/usb/devices/usb1/power/level       # turn on
    echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

c'est ce que j'ai trouvé sur de nombreux forums. Activer "marche", mais "suspendre" les rendements

    -su: echo: write error: Invalid argument

pour chaque usbN. J'ai aussi essayé

    echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"

qui ne donne pas d'erreur, mais ne fait rien non plus (encore une fois, pour chaque usbN)

en essayant

    echo "usb1" > /sys/bus/usb/drivers/usb/unbind

ne fonctionne que pour les appareils plus "intelligents", comme le clavier, la souris ou la carte wifi usb. Ce que je veux dire, c'est que seuls les appareils tyhose sont éteints, les autres usbN ne donnent pas d'erreur, mais la lampe ne s'éteint jamais.

le contenu de/sys/bus/usb/devices/est

    1-0:1.0 1-1:1.0 1-2:1.0 1-2:1.2 2-0:1.0 4-0:1.0 4-1:1.0 6-0:1.0 8-0:1.0 8-2:1.0 usb2 usb4 usb6 usb8
    1-1 1-2 1-2:1.1 1-2:1.3 3-0:1.0 4-1 5-0:1.0 7-0:1.0 8-2 usb1 usb3 usb5 usb7

j'ai essayé de faire

    echo device_name > /sys/bus/usb/drivers/usb/unbind

avec chacun d'entre eux, mais seuls les appareils usbN et N-M réagissent, ceux de la forme n-m: x.y

    tee: /sys/bus/usb/drivers/usb/bind: No such device

(J'ai essayé de mettre, par exemple, "1-0: 1.0", "1-0 \: 1.0" et "1-0 \: 1.0", tous ont donné le même résultat).

Une dernière chose, ce qui est affiché après l'exécution

    lsusb -t

ne change pas lorsque je branche ou débranche la lampe.

Des idées?

20
user2772761

Désactivez l'ID d'appareil 2-1:

echo '2-1' |Sudo tee /sys/bus/usb/drivers/usb/unbind

Rallumez l'ID de l'appareil 2-1:

echo '2-1' |Sudo tee /sys/bus/usb/drivers/usb/bind

Dans mon cas, l'utilisation de l'ID d'appareil 2-1 contrôle l'alimentation de ma clé USB et, par conséquent, contrôle la lumière.

  • CONSEIL: S'ils fonctionnent pour vous dans Debian, créez un alias pour qu'ils vous facilitent la vie plus tard.

J'espère que cela aide, Su

18
user3534136

Si tout ce que vous voulez faire est de réinitialiser un périphérique USB pour le réparer une fois qu'il est dans un état cassé, l'utilisation des fichiers spéciaux de liaison/dissociation usbfs peut être un peu pénible (car les ID de périphérique peuvent changer, et ils sont un un peu difficile à identifier précisément si vous ne voulez pas lier d'autres appareils). Dans ce cas, j'ai trouvé beaucoup plus facile d'utiliser les ID de fournisseur et de produit donnés par lsusb avec usb_modeswitch. Par exemple, si j'identifie mon adaptateur sans fil en utilisant:

$ lsusb
Bus 001 Device 042: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 035: ID 0409:005a NEC Corp. HighSpeed Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Je peux ensuite réinitialiser l'adaptateur sans fil en utilisant:

$ Sudo usb_modeswitch -v 0x7392 -p 0x7811 --reset-usb

Si plusieurs périphériques sont connectés avec les mêmes ID de fournisseur et de produit, usb_modeswitch fournit des indicateurs de numéro de bus et de périphérique. Pour l'exemple d'adaptateur sans fil ci-dessus, j'ajouterais -b 1 -g 42 aux drapeaux.

8
jwatt

Cela ne fonctionnera pas pour votre lampe. Cette désactivation est tout simplement logique. C'est à l'appareil de gérer l'alimentation. Et votre lampe ne fait rien (

1
Eugen Konkov

Essayez ce code, cela fonctionne pour moi (uniquement pour rooté)

 String[] cmdline = { "su", "-c", "echo '1-1' >/sys/bus/usb/drivers/usb/unbind" };
try {
    Runtime.getRuntime().exec(cmdline);
} catch (IOException e) {
    Log.e("MainActivity","Failed"+e);
}

et pour lier à nouveau faire cela

    String[] cmdline = { "su", "-c", "echo '1-1' >/sys/bus/usb/drivers/usb/bind" };
try {
    Runtime.getRuntime().exec(cmdline);
} catch (IOException e) {
    Log.e("MainActivity","Failed"+e);
}
0
Innocent