Como reiniciar um dispositivo USB sem desconectar o cabo

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

[ Hits: 6.269 ]

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

Listando o tamanho de todos os arquivos e diretórios ocultos da HOME

Como montar um bucket Amazon S3 no Linux

Como personalizar o thumbnail de seu site no Facebook

iptables - Como apagar uma regra NAT

O comando tail

Leitura recomendada

Ubuntu 8.04 não instala: Solução

Compilando kernel com genkernel

Compilar kernel 2.6.31 no Debian Lenny

Carregando o "config" para recompilar o kernel

Instalando o Slackware 11 com kernel 2.6.18

  

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