AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 645
Accepted
cmcginty
cmcginty
Asked: 2010-08-02 11:46:45 +0800 CST2010-08-02 11:46:45 +0800 CST 2010-08-02 11:46:45 +0800 CST

Como você redefine um dispositivo USB a partir da linha de comando?

  • 772

É 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 posso dizer, não há módulos do kernel sendo carregados para a câmera. O único que parece relacionado é usbhid.

command-line usb
  • 18 18 respostas
  • 571347 Views

18 respostas

  • Voted
  1. Best Answer
    Li Lo
    2010-08-02T18:27:03+08:002010-08-02T18:27:03+08:00

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

    Execute os seguintes comandos no terminal:

    1. Compile o programa:

      $ cc usbreset.c -o usbreset
      
    2. Obtenha o Bus and Device ID do dispositivo USB que você deseja redefinir:

      $ lsusb  
      Bus 002 Device 003: ID 0fe9:9010 DVICO  
      
    3. Torne nosso programa compilado executável:

      $ chmod +x usbreset
      
    4. Execute o programa com privilégio sudo; faça a substituição necessária para <Bus>e <Device>ids conforme encontrado executando o lsusbcomando:

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

    Fonte do programa acima: http://marc.info/?l=linux-usb&m=121459435621262&w=2

    • 163
  2. ssokolow
    2011-09-13T22:56:24+08:002011-09-13T22:56:24+08:00

    Eu 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: (Não são necessários aplicativos externos)

    sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
    sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"
    

    Esse é o real que eu uso para redefinir meu Kinect, já que 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 sysfs.

    O seu obviamente não seria, 1-4.6mas você pode extrair esse caminho do dispositivo do seu log do kernel ( dmesg) ou pode usar algo como lsusbobter os IDs do fornecedor e do produto e, em seguida, usar um comando rápido como este para listar como os caminhos se relacionam com diferentes fornecedores /pares de ID do produto:

    for X in /sys/bus/usb/devices/*; do 
        echo "$X"
        cat "$X/idVendor" 2>/dev/null 
        cat "$X/idProduct" 2>/dev/null
        echo
    done
    
    • 93
  3. Tamás Tapsonyi
    2013-05-05T03:02:04+08:002013-05-05T03:02:04+08:00

    Isso irá redefinir todas as portas conectadas USB1/2/3[1]:

    for i in /sys/bus/pci/drivers/[uoex]hci_hcd/*:*; do
      [ -e "$i" ] || continue
      echo "${i##*/}" > "${i%/*}/unbind"
      echo "${i##*/}" > "${i%/*}/bind"
    done
    

    Acredito que isso resolverá seu problema. Se você não quiser redefinir todos os terminais USB, você pode usar o ID de dispositivo apropriado de/sys/bus/pci/drivers/ehci_hcd


    Notas: [1]: os *hci_hcddrivers do kernel normalmente controlam as portas USB. ohci_hcde uhci_hcdsão para portas USB1.1, ehci_hcdsão para portas USB2 e xhci_hcdsão para portas USB3. (consulte https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )

    • 78
  4. mcarans
    2017-12-22T02:15:26+08:002017-12-22T02:15:26+08:00

    I've created a Python script that simplifies the whole process based on answers here.

    Save the script below as reset_usb.py or clone this repo.

    Usage:

    python reset_usb.py help  # Show this help
    sudo python reset_usb.py list  # List all USB devices
    sudo python reset_usb.py path /dev/bus/usb/XXX/YYY  # Reset USB device using path /dev/bus/usb/XXX/YYY
    sudo python reset_usb.py search "search terms"  # Search for USB device using the search terms within the search string returned by list and reset matching device
    sudo python reset_usb.py listpci  # List all PCI USB devices
    sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X  # Reset PCI USB device using path /sys/bus/pci/drivers/.../XXXX:XX:XX.X
    sudo python reset_usb.py searchpci "search terms"  # Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device
    

    Script:

    #!/usr/bin/env python
    import os
    import sys
    from subprocess import Popen, PIPE
    import fcntl
    
    instructions = '''
    Usage: python reset_usb.py help : Show this help
           sudo python reset_usb.py list : List all USB devices
           sudo python reset_usb.py path /dev/bus/usb/XXX/YYY : Reset USB device using path /dev/bus/usb/XXX/YYY
           sudo python reset_usb.py search "search terms" : Search for USB device using the search terms within the search string returned by list and reset matching device
           sudo python reset_usb.py listpci : List all PCI USB devices
           sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X : Reset PCI USB device using path
           sudo python reset_usb.py searchpci "search terms" : Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device       
           '''
    
    
    if len(sys.argv) < 2:
        print(instructions)
        sys.exit(0)
    
    option = sys.argv[1].lower()
    if 'help' in option:
        print(instructions)
        sys.exit(0)
    
    
    def create_pci_list():
        pci_usb_list = list()
        try:
            lspci_out = Popen('lspci -Dvmm', shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8')
            pci_devices = lspci_out.split('%s%s' % (os.linesep, os.linesep))
            for pci_device in pci_devices:
                device_dict = dict()
                categories = pci_device.split(os.linesep)
                for category in categories:
                    key, value = category.split('\t')
                    device_dict[key[:-1]] = value.strip()
                if 'USB' not in device_dict['Class']:
                    continue
                for root, dirs, files in os.walk('/sys/bus/pci/drivers/'):
                    slot = device_dict['Slot']
                    if slot in dirs:
                        device_dict['path'] = os.path.join(root, slot)
                        break
                pci_usb_list.append(device_dict)
        except Exception as ex:
            print('Failed to list pci devices! Error: %s' % ex)
            sys.exit(-1)
        return pci_usb_list
    
    
    def create_usb_list():
        device_list = list()
        try:
            lsusb_out = Popen('lsusb -v', shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8')
            usb_devices = lsusb_out.split('%s%s' % (os.linesep, os.linesep))
            for device_categories in usb_devices:
                if not device_categories:
                    continue
                categories = device_categories.split(os.linesep)
                device_stuff = categories[0].strip().split()
                bus = device_stuff[1]
                device = device_stuff[3][:-1]
                device_dict = {'bus': bus, 'device': device}
                device_info = ' '.join(device_stuff[6:])
                device_dict['description'] = device_info
                for category in categories:
                    if not category:
                        continue
                    categoryinfo = category.strip().split()
                    if categoryinfo[0] == 'iManufacturer':
                        manufacturer_info = ' '.join(categoryinfo[2:])
                        device_dict['manufacturer'] = manufacturer_info
                    if categoryinfo[0] == 'iProduct':
                        device_info = ' '.join(categoryinfo[2:])
                        device_dict['device'] = device_info
                path = '/dev/bus/usb/%s/%s' % (bus, device)
                device_dict['path'] = path
    
                device_list.append(device_dict)
        except Exception as ex:
            print('Failed to list usb devices! Error: %s' % ex)
            sys.exit(-1)
        return device_list
    
    
    if 'listpci' in option:
        pci_usb_list = create_pci_list()
        for device in pci_usb_list:
            print('path=%s' % device['path'])
            print('    manufacturer=%s' % device['SVendor'])
            print('    device=%s' % device['SDevice'])
            print('    search string=%s %s' % (device['SVendor'], device['SDevice']))
        sys.exit(0)
    
    if 'list' in option:
        usb_list = create_usb_list()
        for device in usb_list:
            print('path=%s' % device['path'])
            print('    description=%s' % device['description'])
            print('    manufacturer=%s' % device['manufacturer'])
            print('    device=%s' % device['device'])
            print('    search string=%s %s %s' % (device['description'], device['manufacturer'], device['device']))
        sys.exit(0)
    
    if len(sys.argv) < 3:
        print(instructions)
        sys.exit(0)
    
    option2 = sys.argv[2]
    
    print('Resetting device: %s' % option2)
    
    
    # echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind;echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind
    def reset_pci_usb_device(dev_path):
        folder, slot = os.path.split(dev_path)
        try:
            fp = open(os.path.join(folder, 'unbind'), 'wt')
            fp.write(slot)
            fp.close()
            fp = open(os.path.join(folder, 'bind'), 'wt')
            fp.write(slot)
            fp.close()
            print('Successfully reset %s' % dev_path)
            sys.exit(0)
        except Exception as ex:
            print('Failed to reset device! Error: %s' % ex)
            sys.exit(-1)
    
    
    if 'pathpci' in option:
        reset_pci_usb_device(option2)
    
    
    if 'searchpci' in option:
        pci_usb_list = create_pci_list()
        for device in pci_usb_list:
            text = '%s %s' % (device['SVendor'], device['SDevice'])
            if option2 in text:
                reset_pci_usb_device(device['path'])
        print('Failed to find device!')
        sys.exit(-1)
    
    
    def reset_usb_device(dev_path):
        USBDEVFS_RESET = 21780
        try:
            f = open(dev_path, 'w', os.O_WRONLY)
            fcntl.ioctl(f, USBDEVFS_RESET, 0)
            print('Successfully reset %s' % dev_path)
            sys.exit(0)
        except Exception as ex:
            print('Failed to reset device! Error: %s' % ex)
            sys.exit(-1)
    
    
    if 'path' in option:
        reset_usb_device(option2)
    
    
    if 'search' in option:
        usb_list = create_usb_list()
        for device in usb_list:
            text = '%s %s %s' % (device['description'], device['manufacturer'], device['device'])
            if option2 in text:
                reset_usb_device(device['path'])
        print('Failed to find device!')
        sys.exit(-1)
    
    • 16
  5. Peter
    2015-03-03T12:38:44+08:002015-03-03T12:38:44+08:00

    Eu precisava automatizar isso em um script python, então adaptei a resposta extremamente útil do LiLo para o seguinte:

    #!/usr/bin/env python
    import os
    import sys
    from subprocess import Popen, PIPE
    import fcntl
    driver = sys.argv[-1]
    print "resetting driver:", driver
    USBDEVFS_RESET= 21780
    
    try:
        lsusb_out = Popen("lsusb | grep -i %s"%driver, shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().split()
        bus = lsusb_out[1]
        device = lsusb_out[3][:-1]
        f = open("/dev/bus/usb/%s/%s"%(bus, device), 'w', os.O_WRONLY)
        fcntl.ioctl(f, USBDEVFS_RESET, 0)
    except Exception, msg:
        print "failed to reset device:", msg
    

    No meu caso, era o driver cp210x (que eu poderia dizer de lsmod | grep usbserial), então você poderia salvar o trecho acima como reset_usb.py e depois fazer isso:

    sudo python reset_usb.py cp210x
    

    Isso também pode ser útil se você ainda não tiver a configuração do compilador AC em seu sistema, mas tiver o python.

    • 11
  6. panticz
    2021-08-02T12:03:20+08:002021-08-02T12:03:20+08:00

    Since the APT package usbutils provides the usbreset binary you can just reset the USB device by:

    usbreset ${USB_ID}
    
    e.g.
    usbreset 0d8c:0102
    
    • 6
  7. Ulrich-Lorenz Schlüter
    2016-01-10T02:18:26+08:002016-01-10T02:18:26+08:00

    Estou usando uma espécie de marreta recarregando os módulos. Este é o meu script usb_reset.sh:

    #!/bin/bash
    
    # USB drivers
    rmmod xhci_pci
    rmmod ehci_pci
    
    # uncomment if you have firewire
    #rmmod ohci_pci
    
    modprobe xhci_pci
    modprobe ehci_pci
    
    # uncomment if you have firewire
    #modprobe ohci_pci
    

    E este é o meu arquivo de serviço systemd /usr/lib/systemd/system/usbreset.service que executa usb_reset.sh depois que meu gerenciador de exibição foi iniciado:

    [Unit]
    Description=usbreset Service
    After=gdm.service
    Wants=gdm.service
    
    [Service]
    Type=oneshot
    ExecStart=/path/to/usb_reset.sh
    
    • 6
  8. chandank
    2014-11-25T11:34:38+08:002014-11-25T11:34:38+08:00

    A maneira mais rápida de redefinir será redefinir o próprio controlador USB. Fazer isso forçará o udev a cancelar o registro do dispositivo na desconexão e o registro estará de volta assim que você habilitá-lo.

    echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
    echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind
    echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
    echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
    

    Isso deve funcionar para a maioria dos ambientes de PC. No entanto, se você estiver usando algum hardware personalizado, poderá simplesmente percorrer os nomes dos dispositivos. Com este método você não precisa descobrir o nome do dispositivo por lsusb. Você também pode incorporar em um script automatizado.

    • 6
  9. mviereck
    2016-09-01T05:19:31+08:002016-09-01T05:19:31+08:00

    Como o caso especial da questão é um problema de comunicação do gphoto2 com uma câmera em USB, existe uma opção no gphoto2 para redefinir sua conexão USB:

    gphoto2 --reset
    

    Talvez essa opção não existisse em 2010 quando a pergunta foi feita.

    • 5
  10. Raghu
    2016-09-08T03:42:05+08:002016-09-08T03:42:05+08:00

    Eu fiz 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:

    $ lsusb
    
    Bus 002 Device 004: ID 046d:c312 Logitech, Inc. DeLuxe 250 Keyboard
    

    Nesta string 004 é o número do dispositivo

    import os
    import argparse
    import subprocess
    
    path='/sys/bus/usb/devices/'
    
    def runbash(cmd):
        p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        out = p.stdout.read().strip()
        return out
    
    def reset_device(dev_num):
        sub_dirs = []
        for root, dirs, files in os.walk(path):
                for name in dirs:
                        sub_dirs.append(os.path.join(root, name))
    
        dev_found = 0
        for sub_dir in sub_dirs:
                if True == os.path.isfile(sub_dir+'/devnum'):
                        fd = open(sub_dir+'/devnum','r')
                        line = fd.readline()
                        if int(dev_num) == int(line):
                                print ('Your device is at: '+sub_dir)
                                dev_found = 1
                                break
    
                        fd.close()
    
        if dev_found == 1:
                reset_file = sub_dir+'/authorized'
                runbash('echo 0 > '+reset_file) 
                runbash('echo 1 > '+reset_file) 
                print ('Device reset successful')
    
        else:
                print ("No such device")
    
    def main():
        parser = argparse.ArgumentParser()
        parser.add_argument('-d', '--devnum', dest='devnum')
        args = parser.parse_args()
    
        if args.devnum is None:
                print('Usage:usb_reset.py -d <device_number> \nThe device    number can be obtained from lsusb command result')
                return
    
        reset_device(args.devnum)
    
    if __name__=='__main__':
        main()
    
    • 5

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como adicionar um diretório ao PATH?

    • 17 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Marko Smith

    Como faço para obter a temperatura da CPU?

    • 21 respostas
  • Marko Smith

    Como posso adicionar um usuário como um novo sudoer usando a linha de comando?

    • 7 respostas
  • Marko Smith

    Alterar permissões e propriedade da pasta

    • 9 respostas
  • Marko Smith

    Como você reinicia o Apache?

    • 13 respostas
  • Marko Smith

    Como posso desinstalar o software?

    • 11 respostas
  • Marko Smith

    Como os PPAs podem ser removidos?

    • 26 respostas
  • Martin Hope
    justingrif Como adicionar um diretório ao PATH? 2009-07-23 12:42:23 +0800 CST
  • Martin Hope
    NES Como habilitar ou desabilitar serviços? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    Olivier Lalonde Como manter os processos em execução após encerrar a sessão ssh? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B Como posso adicionar um usuário como um novo sudoer usando a linha de comando? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans Como removo versões antigas do kernel para limpar o menu de inicialização? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve