217 votes

Comment réinitialiser un périphérique USB à partir de la ligne de commande ?

Est-il possible de réinitialiser la connexion d'un périphérique USB, sans le déconnecter/le connecter physiquement au PC ?

Plus précisément, mon appareil est un appareil photo numérique. J'utilise gphoto2 mais dernièrement, je reçois des "erreurs de lecture du périphérique", alors j'aimerais essayer de réinitialiser la connexion par logiciel.

D'après ce que je peux dire, aucun module du noyau n'est chargé pour la caméra. Le seul qui semble lié est usbhid .

3voto

John2095 Points 714

Puisque le paquet APT usbutils fournit le binaire usbreset, vous pouvez simplement réinitialiser le périphérique USB par :

usbreset ${USB_ID}

e.g.
usbreset 0d8c:0102

1voto

user242078 Points 11

Essayez ceci, c'est un logiciel de débranchement (Eject).

Parfois, cela ne fonctionne pas ; il suffit de délier le périphérique pour certains appareils.

Exemple :

Je veux retirer ou éjecter mon "Genius NetScroll 120".

Ensuite, je vérifie d'abord mon périphérique USB connecté

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 03f0:231d Hewlett-Packard 
Bus 001 Device 004: ID 138a:0007 Validity Sensors, Inc. VFS451 Fingerprint Reader
Bus 001 Device 005: ID 04f2:b163 Chicony Electronics Co., Ltd 
Bus 002 Device 009: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120  **<----This my Mouse! XDDD**

Ok, j'ai trouvé ma souris, elle a un Bus 002, Device 009, idVendor 0458 et idProduct 003a, c'est donc une information de référence sur la souris.

C'est important, le numéro de bus est le chemin du nom de départ du dispositif et je vérifierai l'ID du produit et le vendeur pour m'assurer que le dispositif à retirer est correct.

$ ls /sys/bus/usb/drivers/usb/
1-1/    1-1.1/  1-1.3/  1-1.5/  2-1/    2-1.3/  bind    uevent  unbind  usb1/   usb2/

Faites attention aux dossiers, vérifiez le début avec le dossier numéro 2, je vais vérifier celui-là parce que mon Bus est 002, et un par un j'ai vérifié chaque dossier contenant le bon idVendor et idProduct concernant les informations de ma souris.

Dans ce cas, je vais récupérer l'information avec cette commande :

cat /sys/bus/usb/drivers/usb/2-1.3/idVendor
0458
cat /sys/bus/usb/drivers/usb/2-1.3/idProduct
003a

Ok, le chemin /sys/bus/usb/drivers/usb/2-1.3/ correspond à mon info souris ! XDDD.

Il est temps de retirer l'appareil !

su -c "echo 1 > /sys/bus/usb/drivers/usb/2-1.3/remove"

Rebranchez le périphérique usb et il fonctionne à nouveau !

1voto

Mark K Cowan Points 186

Quelqu'un a commandé un marteau de forgeron ? Ceci est un assemblage de plusieurs autres réponses ici.

#!/bin/bash

# Root required
if (( UID )); then
        exec sudo "$0" "$@"
fi

cd /sys/bus/pci/drivers

function reinit {(
        local d="$1"
        test -e "$d" || return

        rmmod "$d"

        cd "$d"

        for i in $(ls | grep :); do
                echo "$i" > unbind
        done

        sleep 1

        for i in $(ls | grep :); do
                echo "$i" > bind
        done

        modprobe "$d"

)}

for d in ?hci_???; do
        echo " - $d"
        reinit "$d"
done

1voto

Marviel Points 11

Parfois, je veux effectuer cette opération sur un périphérique particulier, tel qu'identifié par VID (vendor id) et PID (product id). Voici un script que j'ai trouvé utile dans ce but, qui utilise la bibliothèque libusb.

Premier passage :

sudo apt-get install libusb-dev

Ensuite, le resetDeviceConnection de ce fichier c++ devrait effectuer cette tâche, qui consiste à réinitialiser la connexion d'un périphérique tel qu'identifié par vid et pid.

#include <libusb-1.0/libusb.h>

int resetDeviceConnection(UINT_16 vid, UINT_16 pid){
    /*Open libusb*/
    int resetStatus = 0;
    libusb_context * context;
    libusb_init(&context);

    libusb_device_handle * dev_handle = libusb_open_device_with_vid_pid(context,vid,pid);
    if (dev_handle == NULL){
      printf("usb resetting unsuccessful! No matching device found, or error encountered!\n");
      resetStatus = 1;
    }
    else{
      /*reset the device, if one was found*/
      resetStatus = libusb_reset_device(dev_handle);
    }
    /*exit libusb*/
    libusb_exit(context);
    return resetStatus;
}

(volé dans mon catalogue personnel TIL : https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )

1voto

Thoht Points 131

J'ai fait un simple bash script pour réinitialiser un périphérique USB particulier.

#!/bin/bash
#type lsusb to find "vendor" and "product" ID in terminal
set -euo pipefail
IFS=$'\n\t'

#edit the below two lines of vendor and product values using lsusb result
dev=$(lsusb -t | grep usbdevicename | grep 'If 1' | cut -d' ' -f13|cut -d"," -f1)
#VENDOR=05a3
#PRODUCT=9230
VENDOR=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f1)
PRODUCT=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f2)

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X