É possível redefinir a conexão de um dispositivo USB, sem desconectar / conectar fisicamente do PC?
Especificamente, meu dispositivo é uma câmera digital. Estou usando gphoto2
, mas ultimamente recebo "erros de leitura do dispositivo", então gostaria de tentar fazer uma redefinição de software da conexão.
Pelo que sei, não há módulos de kernel sendo carregados para a câmera. O único que parece relacionado é usbhid
.
command-line
usb
cmcginty
fonte
fonte
Respostas:
Salve o seguinte como
usbreset.c
Execute os seguintes comandos no terminal:
Compile o programa:
Obtenha o ID do barramento e do dispositivo USB que você deseja redefinir:
Torne nosso programa compilado executável:
Execute o programa com privilégio sudo; faça a substituição necessária
<Bus>
e os<Device>
IDs conforme encontrado executando olsusb
comando:Fonte do programa acima: http://marc.info/?l=linux-usb&m=121459435621262&w=2
fonte
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
esse é um dos 2 hubs raiz do usb 3.0lsusb
, ele erro: "Erro no ioctl: is a directory", alguma ideia? Eu tentei em ambos os hubs usb 3.0Eu não me encontrei em suas circunstâncias específicas antes, então não tenho certeza se isso fará o suficiente, mas a maneira mais simples que encontrei para redefinir um dispositivo USB é este comando: (Nenhum aplicativo externo é necessário)
Essa é a atual que eu uso para redefinir meu Kinect, pois a libfreenect parece não ter API para colocá-lo de volta no modo de suspensão. Está na minha caixa do Gentoo, mas o kernel deve ser novo o suficiente para usar a mesma estrutura de caminho para o sysfs.
O seu obviamente não seria,
1-4.6
mas você pode extrair esse caminho do dispositivo do log do kernel (dmesg
) ou pode usar algo comolsusb
para obter o ID do fornecedor e do produto e, em seguida, usar um comando rápido como este para listar como os caminhos se relacionam com o fornecedor diferente / pares de ID do produto:fonte
echo 1 > /sys/bus/usb/devices/whatever/authorized
script interno para reativar o dispositivo assim que ele for desativado. Eu fiz isso em ambos meu mouse e teclado USB e acabei com um sistema completamente surdo :)| sudo tee ...
abordagem de/sys
gravações privilegiadas : Isso falha muito se você ainda não tiver suas credenciais de sudo em cache.sudo sh -c "..."
funciona como esperado quando o sudo precisa solicitar uma senha.Isso redefinirá todas as portas USB1 / 2/3 conectadas [1]:
Acredito que isso resolverá seu problema. Se você não deseja redefinir todos os pontos de extremidade USB, pode usar o ID do dispositivo apropriado em
/sys/bus/pci/drivers/ehci_hcd
Notas: [1]: os
*hci_hcd
drivers do kernel normalmente controlam as portas USB.ohci_hcd
euhci_hcd
são para portas USB1.1,ehci_hcd
são para portas USB2 exhci_hcd
são para portas USB3. (consulte https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )fonte
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
isso resolveu o problema, o mouse começou a funcionar imediatamente. +1*hci_hcd
com*hci-pci
, como o motorista hci_hcd já está compilado no kernel.for i in /sys/bus/usb/drivers/*/*:*; do
Eu precisava automatizar isso em um script python, então adaptei a resposta extremamente útil do LiLo ao seguinte:
No meu caso, era o driver cp210x (do qual eu poderia dizer
lsmod | grep usbserial
), para que você pudesse salvar o trecho acima como reset_usb.py e faça o seguinte:Isso também pode ser útil se você ainda não possui a configuração do compilador de corrente alternada no sistema, mas possui python.
fonte
USBDEVFS_RESET
. É sempre o mesmo para todos os sistemas?USBDEVFS_RESET
é o mesmo para todos os sistemas. Para MIPS é 536892692.-t
(modo de árvore) argumento para mostrar a informação driver que este script está esperando, mas o script, em seguida, precisa de algumas atualizações para analisar as diferentes linhas de saída deste geraEu criei um script Python que simplifica todo o processo com base nas respostas aqui.
Salve o script abaixo como reset_usb.py ou clone este repositório .
Uso:
Roteiro:
fonte
Como o caso especial da questão é um problema de comunicação do gphoto2 com uma câmera USB, existe uma opção no gphoto2 para redefinir sua conexão USB:
Talvez essa opção não existisse em 2010 quando a pergunta foi feita.
fonte
A maneira mais rápida de redefinir será redefinir o próprio controlador USB. Isso fará com que o udev cancele o registro do dispositivo na desconexão e o registro retornará assim que você o ativar.
Isso deve funcionar para a maioria dos ambientes de PC. No entanto, se você estiver usando algum hardware personalizado, pode simplesmente percorrer os nomes dos dispositivos. Com esse método, você não precisa descobrir o nome do dispositivo por lsusb. Você também pode incorporar um script automatizado.
fonte
ehci_hcd
porehci-pci
. Mais informações sobre esta solução (talvez de onde veio?): Davidjb.com/blog /Estou usando uma espécie de marreta recarregando os módulos. Este é o meu script usb_reset.sh:
E este é o meu arquivo de serviço systemd /usr/lib/systemd/system/usbreset.service que executa usb_reset.sh após o início do meu gerenciador de diplay:
fonte
rmmod: ERROR: Module xhci_pci is builtin.
Eu criei um script python que redefinirá um dispositivo USB específico com base no número do dispositivo. Você pode descobrir o número do dispositivo no comando lsusb.
por exemplo:
Nesta cadeia, 004 é o número do dispositivo
fonte
Aqui está um script que redefinirá apenas um ID de produto / fornecedor correspondente.
fonte
$DIR
dispositivo desaparecer e não estiver visível?Alguém pediu uma marreta? Isso é reunido a partir de várias outras respostas aqui.
fonte
$@
proxy no sudo é apenas uma força do habbit, impedindo erros se eu decidir mais tarde adicionar argumentos (e esquecer de atualizar o proxy do sudo).Às vezes, quero executar esta operação em um dispositivo específico, conforme identificado pelo VID (ID do fornecedor) e PID (ID do produto). Este é um script que considero útil para esse fim, que usa a biblioteca lifaz bacana.
Primeira corrida:
Em seguida, o resetDeviceConnection deste arquivo c ++ deve executar esta tarefa, de redefinir uma conexão de dispositivo conforme identificado por vid e pid.
(roubado do meu catálogo pessoal de TIL: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
fonte
Eu criei um script bash simples para redefinir um dispositivo USB específico.
fonte
Talvez isso funcione também para uma câmera:
A seguir, reviveu um
USB 3.0
HDD faminto em um3.4.42
Linux (kernel.org) do meu lado.dmesg
disse, que estava expirando comandos após 360s (desculpe, não posso copiar o syslog aqui, não redes conectadas) e a unidade travou completamente. Os processos que acessam o dispositivo foram bloqueados no kernel, inutilizáveis.NFS
pendurado,ZFS
pendurado,dd
pendurado.Depois de fazer isso, tudo funcionou novamente.
dmesg
contou apenas uma única linha sobre oUSB
dispositivo encontrado.Eu realmente não tenho idéia do que fazer a seguir em detalhes. Mas funcionou.
O exemplo de saída a seguir é do Debian Squeeze com
2.6.32-5-686
kernel, então acho que funciona para o 2.6 e acima:Se isso não funcionar, talvez alguém possa descobrir como enviar uma redefinição real para um dispositivo.
fonte
Tente isso, é um software desconectado (Ejetar).
Às vezes, não funciona simplesmente para desvincular dispositivo de alguns dispositivos.
Exemplo:
Quero remover ou ejetar meu "Genius NetScroll 120".
Então eu primeiro Verifique meu dispositivo USB conectado
Ok, encontrei meu mouse, ele tem um barramento 002, dispositivo 009, idVendor 0458 e idProduct 003a, portanto, essa é uma informação de dispositivo de referência sobre o mouse.
Isso é importante, o número do barramento é o caminho do nome inicial do dispositivo e vou verificar o ID e o fornecedor do produto para garantir que o dispositivo correto seja removido.
Preste atenção nas pastas, verifique o início com a pasta número 2, eu irei verificar essa porque o meu Bus é 002, e uma a uma eu verifiquei cada pasta contendo o idVendor e o idProduct corretos sobre as informações do mouse.
Nesse caso, recuperarei as informações com este comando:
Ok, o caminho /sys/bus/usb/drivers/usb/2-1.3/ corresponde ao meu mouse de informações! XDDD.
É hora de remover o dispositivo!
Conecte novamente o dispositivo USB e ele funcionará novamente!
fonte
Se você souber o nome do seu dispositivo, este script python funcionará:
fonte