Est-il possible de réinitialiser la connexion d'un périphérique USB sans se déconnecter / se connecter physiquement du PC?
Plus précisément, mon appareil est un appareil photo numérique. J'utilise gphoto2
, mais dernièrement, des "erreurs de lecture de l'appareil" se produisent, j'aimerais donc essayer de réinitialiser le logiciel de la connexion.
D'après ce que je peux dire, aucun module de noyau n'est chargé pour la caméra. Le seul qui semble lié est usbhid
.
command-line
usb
cmcginty
la source
la source
Réponses:
Enregistrez les éléments suivants sous
usbreset.c
Le exécuter les commandes suivantes dans le terminal:
Compiler le programme:
Obtenez les identifiants de bus et de périphérique du périphérique USB que vous souhaitez réinitialiser:
Rendre notre programme compilé exécutable:
Exécutez le programme avec le privilège sudo; effectuez les substitutions nécessaires
<Bus>
et les<Device>
identifiants trouvés en exécutant lalsusb
commande:Source du programme ci-dessus: http://marc.info/?l=linux-usb&m=121459435621262&w=2
la source
echo $(lsusb | grep Mouse) mouse=$( lsusb | grep Mouse | perl -nE "/\D+(\d+)\D+(\d+).+/; print qq(\$1/\$2)") sudo /path/to/c-program/usbreset /dev/bus/usb/$mouse
usbreset /dev/bus/usb/011/001
c’est l’un des 2 concentrateurs racine usb 3.0lsusb
, il se trompe: "Erreur dans ioctl: un répertoire", aucune idée? J'ai essayé sur les deux hubs usb 3.0Je ne me suis jamais trouvé dans votre situation particulière auparavant, alors je ne sais pas si cela suffira, mais la façon la plus simple que j'ai trouvée de réinitialiser un périphérique USB est cette commande: (Aucune application externe nécessaire)
C’est celui que j’utilise pour réinitialiser mon Kinect car libfreenect ne semble pas avoir d’API pour le remettre en veille. C'est sur ma boîte Gentoo, mais le noyau devrait être suffisamment nouveau pour utiliser la même structure de chemin pour sysfs.
Évidemment, ce n’est pas le cas,
1-4.6
mais vous pouvez extraire le chemin de votre périphérique à partir de votre log (dmesg
) (logernel ) ou vous pouvez utiliser quelque chose commelsusb
obtenir les ID du fournisseur et du produit, puis utiliser une commande rapide comme celle-ci pour répertorier le lien entre les chemins d’un fournisseur différent. / paires d'ID de produit:la source
echo 1 > /sys/bus/usb/devices/whatever/authorized
script dans un script pour réactiver l'appareil dès qu'il a été désactivé. Je l'ai fait à la fois avec ma souris et mon clavier USB et je me suis retrouvé avec un système complètement sourd :)| sudo tee ...
approche des/sys
écritures privilégiées : Cela tombe mal si vos informations d’identité sudo ne sont pas déjà mises en cache.sudo sh -c "..."
fonctionne comme prévu lorsque sudo doit demander un mot de passe.Ceci réinitialisera tous les ports USB1 / 2/3 connectés [1]:
Je crois que cela résoudra votre problème. Si vous ne souhaitez pas réinitialiser tous les points de terminaison USB, vous pouvez utiliser l'ID de périphérique approprié à partir de
/sys/bus/pci/drivers/ehci_hcd
Remarques: [1]: les
*hci_hcd
pilotes du noyau contrôlent généralement les ports USB.ohci_hcd
etuhci_hcd
sont pour les ports USB1.1,ehci_hcd
est pour les ports USB2 etxhci_hcd
est pour les ports USB3. (voir https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )la source
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
le problème a été résolu, la souris a immédiatement fonctionné. +1*hci_hcd
avec*hci-pci
, comme pilote hci_hcd est déjà compilé dans le noyau.for i in /sys/bus/usb/drivers/*/*:*; do
J'avais besoin d'automatiser cela dans un script python. J'ai donc adapté la réponse extrêmement utile de LiLo aux éléments suivants:
Dans mon cas, il s’agissait du pilote cp210x (que je pourrais identifier
lsmod | grep usbserial
), vous pouvez donc enregistrer l’extrait ci-dessus sous le nom reset_usb.py, puis procédez comme suit:Cela pourrait également être utile si vous n'avez pas déjà configuré le compilateur ca sur votre système, mais que vous avez le python.
la source
USBDEVFS_RESET
. Est-ce toujours le même pour tous les systèmes?USBDEVFS_RESET
est identique pour tous les systèmes. Pour MIPS il est 536892692.-t
argument (mode arborescence) pour afficher les informations de pilote attendues par ce script, mais le script nécessite ensuite des mises à jour pour analyser les différentes lignes de sortie générées par ce scriptJ'ai créé un script Python qui simplifie l'ensemble du processus en fonction des réponses fournies.
Enregistrez le script ci-dessous sous le nom reset_usb.py ou clonez ce référentiel .
Usage:
Scénario:
la source
Comme le cas particulier de la question est un problème de communication de gphoto2 avec un appareil photo USB, il existe une option dans gphoto2 pour réinitialiser sa connexion USB:
Peut-être que cette option n'existait pas en 2010 lorsque la question a été posée.
la source
Le moyen le plus rapide de réinitialiser consiste à réinitialiser le contrôleur USB lui-même. Cela obligera udev à annuler l’enregistrement du périphérique lors de la déconnexion et l’enregistrement est de retour une fois que vous l’activez.
Cela devrait fonctionner pour la plupart des environnements PC. Toutefois, si vous utilisez du matériel personnalisé, vous pouvez simplement parcourir les noms de périphériques. Avec cette méthode, vous n'avez pas besoin de connaître le nom du périphérique à l'aide de lsusb. Vous pouvez également intégrer un script automatisé.
la source
ehci_hcd
parehci-pci
. Plus d'informations sur cette solution (peut-être d'où vient-elle?): Davidjb.com/blog / 2012/06 /…J'utilise une sorte de sledgehammer en rechargeant les modules. Voici mon script usb_reset.sh:
Et voici mon fichier de service systemd /usr/lib/systemd/system/usbreset.service qui exécute usb_reset.sh après le démarrage de mon gestionnaire de diplay:
la source
rmmod: ERROR: Module xhci_pci is builtin.
J'ai créé un script python qui réinitialisera un périphérique USB particulier en fonction du numéro de périphérique. Vous pouvez trouver le numéro de périphérique à l'aide de la commande lsusb.
par exemple:
Dans cette chaîne 004 est le numéro de périphérique
la source
Voici un script qui réinitialisera uniquement un ID de produit / fournisseur correspondant.
la source
$DIR
périphérique disparaît et que le périphérique n'est pas visible?Est-ce que quelqu'un a commandé un sledgehammer? Ceci est reconstitué à partir de diverses autres réponses ici.
la source
$@
proxy dans le sudo est juste une force d'habbit, l'avoir empêchant les bugs si je décide plus tard d'ajouter des arguments (et d'oublier de mettre à jour le proxy sudo).Parfois, je souhaite effectuer cette opération sur un périphérique particulier, identifié par VID (identifiant du fournisseur) et PID (identifiant du produit). C'est un script que j'ai trouvé utile à cette fin, qui utilise la bibliothèque nifty libusb.
Première exécution:
Ensuite, resetDeviceConnection de ce fichier c ++ doit exécuter cette tâche, en réinitialisant une connexion de périphérique identifiée par vid et pid.
(volé de mon catalogue TIL personnel: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
la source
J'ai fait un script bash simple pour réinitialiser un périphérique USB particulier.
la source
Peut-être que cela fonctionne aussi pour une caméra:
Après avoir relancé un
USB 3.0
disque dur affamé sur un3.4.42
Linux (kernel.org) de mon côté.dmesg
On a dit que les commandes expiraient après 360 secondes (désolé, je ne peux pas copier le journal système ici, pas de réseaux connectés) et que le lecteur a été suspendu complètement. Les processus accédant à l'appareil ont été bloqués dans le noyau, impossible à tuer.NFS
accroché,ZFS
accroché,dd
accroché.Après cela, tout a encore fonctionné.
dmesg
dit juste une seule ligne sur leUSB
périphérique trouvé.Je n'ai vraiment aucune idée de ce qui suit fait en détail. Mais cela a fonctionné.
L'exemple de sortie suivant provient de Debian Squeeze avec le
2.6.32-5-686
noyau, je pense donc que cela fonctionne pour les versions 2.6 et supérieures:Si cela ne fonctionne pas, quelqu'un d'autre peut peut-être comprendre comment envoyer une réinitialisation réelle à un périphérique.
la source
Essayez ceci, il s’agit d’un débranchement de logiciel (Eject).
Parfois, cela ne fonctionne pas simplement en déconnectant un périphérique pour certains périphériques.
Exemple:
Je souhaite retirer ou éjecter mon "Genius NetScroll 120".
Ensuite, je vérifie d'abord mon périphérique USB connecté
Ok, j'ai trouvé ma souris, elle a un bus 002, un périphérique 009, idVendor 0458 et idProduct 003a, il s'agit donc d'une information de référence sur la souris.
Ceci est important, le numéro de bus est le chemin du nom de début du périphérique et je vérifierai l'ID du produit et le fournisseur pour s'assurer que le périphérique correct à supprimer.
Faites attention aux dossiers, vérifiez le début avec le dossier numéro 2, je vais vérifier celui-ci car mon bus est 002, et un par un, j'ai vérifié chaque dossier contenant le bon idVendor et idProduct à propos de mes informations de souris.
Dans ce cas, je vais récupérer les informations avec cette commande:
Ok, le chemin /sys/bus/usb/drivers/usb/2-1.3/ correspond à ma souris d’information! XDDD.
Il est temps de retirer l'appareil!
Rebranchez le périphérique USB et ça marche encore!
la source
Si vous connaissez le nom de votre appareil, ce script python fonctionnera:
la source