Como redefinir um dispositivo de memória flash USB específico?

1

Às vezes, preciso desconectar e conectar um dispositivo de memória flash USB para corrigir um problema.

Existe uma maneira de fazer isso no software?

    
por unfa 20.09.2018 / 10:47

2 respostas

1

Salve o seguinte como usbreset.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;
}

Os seguintes comandos são executados no terminal:

Compile o programa:

$ cc usbreset.c -o usbreset

Obtenha o ID do barramento e do dispositivo do dispositivo USB que você deseja redefinir:

$ lsusb  
Bus 002 Device 003: ID 0fe9:9010 DVICO 

Faça o nosso executável do programa compilado:

$ chmod +x usbreset

Execute o programa com privilégio sudo; faça a substituição necessária dos <Bus> e <Device> ids encontrados, executando o comando lsusb :

$ sudo ./usbreset /dev/bus/usb/002/003  

Fonte: link

    
por 20.09.2018 / 11:33
0

Eu fiz um script para isso. Basta alimentá-lo com o nome do nó do dispositivo em / dev / e ele fará o que você deseja. Salve o código abaixo em um script e use-o como sudo ./reset-drive.sh sdb . Ele é feito para que apenas funcione para dispositivos USB de classe de armazenamento em massa, para que não afete mais nada (discos rígidos, mouses USB, teclados) - o que o torna mais seguro. Você pode dizer para redefinir o seu disco rígido - não vai funcionar.

#!/bin/bash
drive="$1" # expects input like "sda" "sdc" etc.

cd /sys/bus/usb/drivers/usb-storage

for i in *; do
  if [[ $(udevadm info -q path -n "/dev/$drive" | grep -c "$i") == "1" ]]; then
    echo $i > unbind
    echo $i > bind
  fi
done

Como isso funciona?

Vá para o diretório que contém informações de porta sobre dispositivos na classe Armazenamento em massa USB:

cd /sys/bus/usb/drivers/usb-storage

Agora avalie todos os dispositivos listados para encontrar um que corresponda ao nó de dispositivo fornecido.

for i in *; do
  if [[ $(udevadm info -q path -n "/dev/$drive" | grep -c "$i") == "1" ]]; 
then

Uma vez encontrado, alimente o nome do caminho da porta USB correspondente aos arquivos unbind e bind que são usados para emitir comandos de porta:

echo $i > unbind
echo $i > bind

PS: Esta solução foi baseada no seguinte artigo: link

    
por 20.09.2018 / 10:47

Tags