¿Es posible restablecer la conexión de un dispositivo USB, sin desconectar / conectar físicamente desde la PC?
Específicamente, mi dispositivo es una cámara digital. Estoy usando gphoto2
, pero últimamente recibo "errores de lectura del dispositivo", así que me gustaría intentar restablecer el software de la conexión.
Por lo que puedo decir, no se están cargando módulos del núcleo para la cámara. El único que parece relacionado es usbhid
.
command-line
usb
cmcginty
fuente
fuente
Respuestas:
Guarde lo siguiente como
usbreset.c
El ejecutar los siguientes comandos en la terminal:
Compila el programa:
Obtenga la identificación de bus y dispositivo del dispositivo USB que desea restablecer:
Haga que nuestro programa compilado sea ejecutable:
Ejecute el programa con privilegio sudo; realice la sustitución necesaria para
<Bus>
y los<Device>
identificadores que se encuentran al ejecutar ellsusb
comando:Fuente del programa anterior: http://marc.info/?l=linux-usb&m=121459435621262&w=2
fuente
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
que es uno de los 2 concentradores raíz usb 3.0 enlsusb
, errores: "Error en ioctl: ¿Es un directorio", alguna idea? Probé en ambos hubs usb 3.0No me he encontrado en sus circunstancias específicas antes, por lo que no estoy seguro de si hará lo suficiente, pero la forma más simple que he encontrado para restablecer un dispositivo USB es este comando: (No se necesitan aplicaciones externas)
Ese es el que uso para restablecer mi Kinect, ya que libfreenect parece no tener API para volverlo a dormir. Está en mi cuadro Gentoo, pero el núcleo debería ser lo suficientemente nuevo como para usar la misma estructura de ruta para sysfs.
Obviamente, el suyo no lo sería,
1-4.6
pero puede extraer esa ruta del dispositivo del registro del kernel (dmesg
) o puede usar algo comolsusb
obtener las ID del proveedor y del producto y luego usar un comando rápido como este para enumerar cómo las rutas se relacionan con diferentes proveedores / pares de ID de producto:fuente
echo 1 > /sys/bus/usb/devices/whatever/authorized
script interno para volver a habilitar el dispositivo tan pronto como se haya deshabilitado. Lo hice tanto en mi mouse como en mi teclado usb y terminé con un sistema completamente sordo :)| sudo tee ...
enfoque de las/sys
escrituras privilegiadas : eso se rompe mal si aún no tiene sus credenciales de sudo almacenadas en caché.sudo sh -c "..."
funciona como se esperaba cuando sudo necesita solicitar una contraseña.Esto restablecerá todos los puertos USB1 / 2/3 conectados [1]:
Creo que esto resolverá tu problema. Si no desea restablecer todos los puntos finales USB, puede usar la ID de dispositivo adecuada desde
/sys/bus/pci/drivers/ehci_hcd
Notas: [1]: los
*hci_hcd
controladores del kernel generalmente controlan los puertos USB.ohci_hcd
yuhci_hcd
son para puertos USB1.1,ehci_hcd
son para puertos USB2 yxhci_hcd
son para puertos USB3. (ver https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )fuente
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
esto resolvió el problema, el mouse comenzó a funcionar de inmediato. +1*hci_hcd
con*hci-pci
, ya que el conductor hci_hcd ya está compilado en el núcleo.for i in /sys/bus/usb/drivers/*/*:*; do
Necesitaba automatizar esto en un script de Python, así que adapté la respuesta extremadamente útil de LiLo a lo siguiente:
En mi caso, era el controlador cp210x (que podía ver
lsmod | grep usbserial
), por lo que podría guardar el fragmento anterior como reset_usb.py y luego hacer esto:Esto también podría ser útil si aún no tiene la configuración del compilador de CA en su sistema, pero sí tiene Python.
fuente
USBDEVFS_RESET
. ¿Es siempre lo mismo para todos los sistemas?USBDEVFS_RESET
es igual para todos los sistemas. Para MIPS es 536892692.-t
argumento (modo de árbol) para mostrar la información del controlador que este script espera, pero el script luego necesita algunas actualizaciones para analizar las diferentes líneas de salida que esto generaHe creado un script de Python que simplifica todo el proceso basado en las respuestas aquí.
Guarde el script a continuación como reset_usb.py o clone este repositorio .
Uso:
Guión:
fuente
Como el caso especial de la pregunta es un problema de comunicación de gphoto2 con una cámara en USB, hay una opción en gphoto2 para restablecer su conexión USB:
Quizás esta opción no existía en 2010 cuando se hizo la pregunta.
fuente
La forma más rápida de restablecer será restablecer el controlador USB en sí. Hacerlo obligará a udev a cancelar el registro del dispositivo en la desconexión, y el registro volverá una vez que lo habilite.
Esto debería funcionar para la mayoría de los entornos de PC. Sin embargo, si está utilizando un hardware personalizado, simplemente puede recorrer los nombres de los dispositivos. Con este método no necesita encontrar el nombre del dispositivo por lsusb. También puede incorporar en un script automatizado.
fuente
ehci_hcd
conehci-pci
más información sobre esta solución (tal vez de donde vino.):? Davidjb.com/blog / 2012/06 /…Estoy usando una especie de mazo al recargar los módulos. Este es mi script usb_reset.sh:
Y este es mi archivo de servicio systemd /usr/lib/systemd/system/usbreset.service que ejecuta usb_reset.sh después de que mi administrador de diplay ha comenzado:
fuente
rmmod: ERROR: Module xhci_pci is builtin.
Hice un script de Python que restablecerá un dispositivo USB en particular en función del número de dispositivo. Puede encontrar el número de dispositivo desde el comando lsusb.
por ejemplo:
En esta cadena 004 es el número de dispositivo
fuente
Aquí hay un script que solo restablecerá una identificación de producto / proveedor coincidente.
fuente
$DIR
dispositivo desaparece y el dispositivo no es visible?¿Alguien ordenó un mazo? Esto se reconstruye a partir de varias otras respuestas aquí.
fuente
$@
en el sudo proxy es solo una fuerza de habbit, ya que evita errores si luego decido agregar argumentos (y me olvido de actualizar el sudo proxy).A veces quiero realizar esta operación en un dispositivo en particular, según lo identificado por VID (identificación del proveedor) y PID (identificación del producto). Este es un script que he encontrado útil para este propósito, que utiliza la ingeniosa biblioteca libusb.
Primer intento:
Luego, resetDeviceConnection de este archivo c ++ debería realizar esta tarea, de restablecer una conexión de dispositivo como se identifica por vid y pid.
(robado de mi catálogo personal de TIL: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
fuente
Hice un script bash simple para restablecer un dispositivo USB en particular.
fuente
Quizás esto también funcione para una cámara:
Después revivió un
USB 3.0
HDD muerto de hambre en un3.4.42
(kernel.org) Linux de mi lado.dmesg
le dije que estaba agotando los comandos después de 360s (lo siento, no puedo copiar el syslog aquí, no las redes conectadas) y la unidad se bloqueó por completo. Los procesos que acceden al dispositivo fueron bloqueados en el núcleo, imposibles de matar.NFS
colgado,ZFS
colgado,dd
colgado.Después de hacer esto, todo volvió a funcionar.
dmesg
contó solo una línea sobre elUSB
dispositivo encontrado.Realmente no tengo idea de lo que sigue en detalle. Pero funcionó.
El siguiente resultado de ejemplo es de Debian Squeeze con
2.6.32-5-686
kernel, por lo que creo que funciona para 2.6 y superiores:Si esto no funciona, quizás alguien más pueda descubrir cómo enviar un reinicio real a un dispositivo.
fuente
Intente esto, es un desenchufe de software (Expulsar).
A veces no funciona simplemente desconectar el dispositivo para algunos dispositivos.
Ejemplo:
Quiero eliminar o expulsar mi "Genius NetScroll 120".
Luego, primero verifico mi dispositivo usb conectado
Ok, encontré mi mouse, tiene un Bus 002, Dispositivo 009, idVendor 0458 e idProduct 003a, así que esta es una información del dispositivo de referencia sobre el mouse.
Esto es importante, el número de Bus es la ruta de inicio del nombre del dispositivo y comprobaré el Id. Del producto y el Proveedor para asegurar que se elimine el dispositivo correcto.
Preste atención a las carpetas, verifique el comienzo con la carpeta número 2, comprobaré esta porque mi Bus es 002, y una por una compruebo cada carpeta que contiene el idVendor y idProduct correctos sobre la información de mi mouse.
En este caso, recuperaré la información con este comando:
Ok, la ruta /sys/bus/usb/drivers/usb/2-1.3/ coincide con mi mouse de información. XDDD.
¡Es hora de quitar el dispositivo!
¡Vuelva a enchufar el dispositivo usb y vuelve a funcionar!
fuente
Si conoce el nombre de su dispositivo, este script de Python funcionará:
fuente