web-dev-qa-db-fra.com

Débranchez et rebranchez un périphérique USB dans le terminal

Pendant des années, je me suis occupé de ce bogue Ubuntu dans lequel ma souris se bloque peu après le démarrage, puis se bloque périodiquement par la suite. Pour résoudre ce problème, je dois débrancher physiquement l'émetteur-récepteur USB de la souris, puis le rebrancher. D'après mes recherches, ce problème se produit avec les souris Windows sans fil USB lors du double démarrage de Linux et de Windows.

Est-il possible de déconnecter l’émetteur-récepteur USB par programmation (à partir du terminal) au lieu de le faire physiquement? Je veux atteindre cet objectif dans mon script de démarrage bash.

J'utilise Ubuntu 16.04

Edit: J'ai résolu mon problème mais cela ne concerne pas vraiment ma question.

Dans le fichier..

/etc/laptop-mode/conf.d/runtime-pm.conf

Je devais faire

CONTROL_RUNTIME_AUTOSUSPEND=0

Cela corrige le bug de souris que je rencontrais depuis des années.

6
deanresin

J'ai écrit un script pour montrer comment je le ferais:

#!/bin/bash

port="1-1.1" # as shown by lsusb -t: {bus}-{port}(.{subport})

bind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/bind
}

unbind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/unbind
}

unbind_usb "$port"
# sleep 1 # enable delay here
bind_usb "$port"

Vous devez d’abord obtenir le bus et le numéro de port du port USB en question. Vous pouvez le faire avec lsusb et tout périphérique que vous reconnaissez dans la sortie de lsusb, j’utilise une clé à disques Sandisk :

$ lsusb
Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd 
Bus 001 Device 112: ID 8087:07dc Intel Corp. 
Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard
Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade
Bus 001 Device 002: ID 8087:8000 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M
        |__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M
        |__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M
        |__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M

Dans la sortie de lsusb, vous obtenez le numéro de bus et de périphérique du périphérique, puis recherchez ce périphérique dans la sortie de lsusb -t pour obtenir le numéro de bus et de port (parfois avec des sous-états). La syntaxe est la suivante:

1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!

Utilisez ceci en tant que port dans le script. Maintenant, il vous suffit de le rendre exécutable avec chmod +x /path/to/script et de l'exécuter avec les autorisations root :

Sudo /path/to/script

Je n’en avais pas besoin pour ma clé USB, mais il se peut que vous deviez ajouter un délai entre le reliure et la reliure, c’est le but de la ligne commentée sleep 1 - vous pouvez expérimenter les valeurs, par exemple. sleep 0.5 pendant une demi-seconde.

Notez que cette approche montre comment désactiver et réactiver un certain port USB , si vous souhaitez qu'un périphérique spécifique soit non lié et Pour rebondir à nouveau, vous devrez utiliser le même port USB pour que cela fonctionne. On pourrait penser à un moyen d’analyser la sortie de lsusb afin d’obtenir de manière dynamique le bus et le numéro de port d’un périphérique spécifique chaque fois que le script est appelé. Cela vous permettrait d’utiliser tout port USB, mais j’estime que ce serait une surcharge.

Suggestions tirées de cet article du blog linux.com .

4
dessert