Como reiniciar um dispositivo USB sem desconectar o cabo

Publicado por Fábio Berbert de Paula em 22/07/2020

[ Hits: 6.219 ]

Blog: https://fabio.automatizando.dev

 


Como reiniciar um dispositivo USB sem desconectar o cabo



Em algum momento essa dica pode ser útil para você. Por exemplo, recarregar um pendrive que foi desmontado sem precisar desplugar e plugar novamente e por aí vai...

Você irá precisar compilar um pequeno programa em C:

/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
   const char *filename;
   int fd;
   int rc;

   if (argc != 2) {
      fprintf(stderr, "Usage: usbreset device-filename\n");
      return 1;
   }
   filename = argv[1];

   fd = open(filename, O_WRONLY);
   if (fd < 0) {
      perror("Error opening output file");
      return 1;
   }

   printf("Resetting USB device %s\n", filename);
   rc = ioctl(fd, USBDEVFS_RESET, 0);
   if (rc < 0) {
      perror("Error in ioctl");
      return 1;
   }
   printf("Reset successful\n");

   close(fd);
   return 0;
}

Salve o código acima em um arquivo chamado usbreset.c e compile:

cc usbreset.c -o usbreset

Agora vamos listar os dispositivos USB conectados ao seu PC:

usb-devices | egrep '(Bus|Product)'
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 2
S: Product=EHCI Host Controller
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 6
T: Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 3 Spd=12 MxCh= 0
S: Product=USB PnP Audio Device
T: Bus=01 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=1.5 MxCh= 0
S: Product=USB KEYBOARD
T: Bus=01 Lev=02 Prnt=02 Port=03 Cnt=03 Dev#= 5 Spd=1.5 MxCh= 0
S: Product=USB Trackball
T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 4
S: Product=xHCI Host Controller
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=480 MxCh= 0
S: Product=Logitech Webcam C925e
T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 2
S: Product=EHCI Host Controller
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=480 MxCh= 8
T: Bus=03 Lev=02 Prnt=02 Port=04 Cnt=01 Dev#= 4 Spd=12 MxCh= 7
S: Product=USB 2.0 Hub [Safe]
T: Bus=03 Lev=03 Prnt=04 Port=00 Cnt=01 Dev#= 7 Spd=12 MxCh= 0
S: Product=Redmi Note 8 Pro
T: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=5000 MxCh= 4
S: Product=xHCI Host Controller


Para este exemplo vou reiniciar a porta USB do meu celular Redmi Note 8 Pro, que está na Bus 03, Prnt 04:

./usbreset /dev/bus/usb/003/004

DICA: use a tecla TAB para autocompletar o caminho do dispositivo acima.

Até a próxima!

Outras dicas deste autor

Como capturar prints de vídeos usando mplayer

Como extrair um print de um arquivo de vídeo

Busca Reversa no Mongo Shell

Solução para tamanho da fonte das legendas no Totem

Apache2 - Forçando redirecionamento do site para o www

Leitura recomendada

Ubuntu: kernel atualizado com bootsplash

Memória de 4GB só mostra 3.3GB no Red Hat e CentOS 5

Atualizando o kernel nos Ubuntu Like sem trauma... mesmo!

Erro ao instalar VirtualBox no BackTrack 5 - DKMS

Bibliotecas para o kernel

  

Comentários
[1] Comentário enviado por maurixnovatrento em 22/07/2020 - 11:38h


Excelente. Vou usar essa dica.

___________________________________
Conhecimento não se Leva para o Túmulo.

[2] Comentário enviado por maurixnovatrento em 22/07/2020 - 11:41h


Só vou mudar o nome para usbrestart.


___________________________________
Conhecimento não se Leva para o Túmulo.

[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B

[4] Comentário enviado por fabio em 22/07/2020 - 21:11h


[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B



De repente tu consegue fazer isso tratando a saída do comando usb-devices, vem a primeira linha que começa com Bus e a terceira linha que possui o Vendor.

Encontrou o Vendor desejado, basta montar o caminho do device com: /dev/bus/usb/0XX/0YY

onde XX e YY é o conteúdo de Bus e Prnt da primeira linha.


[5] Comentário enviado por maurixnovatrento em 22/07/2020 - 22:50h


[3] Comentário enviado por jbtozetti em 22/07/2020 - 16:40h

Boa tarde

Não rxiste uma forma de restartar pelo ID do vendor e product?

Digo isso pois o o ID do Bus e Prnt variam de um computador pra outro e colocar esse comando dentro de um script pra ser rodado remotamente fica difícil

ficando no vendor e product eu "chumbo" ele no script e já era :B



seria uma boa. Mas que nem tá, não precisa melhor.

[6] Comentário enviado por maurixnovatrento em 02/08/2020 - 12:58h


Olha que interessante, hoje que eu fui verificar esse negócio e adivinha:

dpkg -S usbreset
usbutils: /usr/bin/usbreset

O meu já tinha e é muito eficiente.

___________________________________
Conhecimento não se Leva para o Túmulo.

[7] Comentário enviado por fabio em 03/08/2020 - 02:06h

Bacana! Aqui no Debian 10 não há esse pacote no repositório. A menos que esteja com outro nome.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts