Desconecte e conecte novamente um dispositivo USB no terminal

6

Durante anos, tenho lidado com esse bug do Ubuntu onde meu mouse congela logo após a inicialização e depois periodicamente congela depois disso. Para corrigi-lo, eu tenho que desconectar fisicamente o transceptor USB para o mouse e conectá-lo de volta. Da minha pesquisa, esse bug acontece com mouses USB sem fio do Windows quando o Linux e Windows reinicializam.

Existe uma maneira que eu possa programaticamente (a partir do terminal) desconectar o transceptor USB em vez de fazê-lo fisicamente? Eu quero conseguir isso no meu script bash de inicialização.

Estou usando o Ubuntu 16.04

Editar : Eu resolvi meu problema, mas isso não se relaciona com a minha pergunta.

No arquivo ...

/etc/laptop-mode/conf.d/runtime-pm.conf

Eu tive que fazer

CONTROL_RUNTIME_AUTOSUSPEND=0

Isso corrige o bug do mouse que eu estava sentindo há anos.

    
por deanresin 15.05.2018 / 03:46

1 resposta

4

Eu escrevi um script para mostrar como eu faria isso:

#!/bin/bash

port="1-1.1" # as shown by lsusb -t: {bus}-{port}(.{subport})

bind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/bind
}

unbind_usb() {
  echo "$1" >/sys/bus/usb/drivers/usb/unbind
}

unbind_usb "$port"
# sleep 1 # enable delay here
bind_usb "$port"

Primeiro, você precisa obter o número de barramento e porta da porta usb em questão. Você pode fazer isso com lsusb e qualquer dispositivo que reconheça na saída de lsusb , eu uso um pendrive Sandisk aqui:

$ lsusb
Bus 001 Device 005: ID 04f2:b39a Chicony Electronics Co., Ltd 
Bus 001 Device 112: ID 8087:07dc Intel Corp. 
Bus 001 Device 019: ID 04d9:1603 Holtek Semiconductor, Inc. Keyboard
Bus 001 Device 018: ID 0424:2504 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 022: ID 0781:5567 SanDisk Corp. Cruzer Blade
Bus 001 Device 002: ID 8087:8000 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/3p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
        |__ Port 1: Dev 22, If 0, Class=Mass Storage, Driver=usb-storage, 480M
        |__ Port 2: Dev 18, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 19, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
            |__ Port 1: Dev 19, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 7: Dev 112, If 0, Class=Wireless, Driver=btusb, 12M
        |__ Port 7: Dev 112, If 1, Class=Wireless, Driver=btusb, 12M
        |__ Port 8: Dev 5, If 1, Class=Video, Driver=uvcvideo, 480M
        |__ Port 8: Dev 5, If 0, Class=Video, Driver=uvcvideo, 480M

Da saída de lsusb , você obtém o número de barramento e dispositivo do dispositivo e, em seguida, pesquisa este dispositivo na saída de lsusb -t para obter o número de barramento e porta (às vezes com subportos). A sintaxe é:

1-2.3 # for Bus 1 Port 2 Subport 3 – strip leading zeroes!

Use isso como port no script. Agora você só precisa torná-lo executável com chmod +x /path/to/script e executá-lo com permissões de root :

sudo /path/to/script

Eu não precisei de um para meu pendrive, mas pode ser necessário adicionar um atraso entre desvincular e vincular novamente. É para isso que o comentário de sleep 1 line é para: você pode testar os valores, por exemplo, sleep 0.5 por meio segundo.

Note que esta abordagem mostra como desabilitar e habilitar novamente uma certa porta USB , se você quiser que um dispositivo específico seja livre e religado novamente, você terá que use a mesma porta USB para isso funcionar. Poderíamos pensar em uma maneira de analisar a saída de lsusb para obter dinamicamente o barramento e o número da porta de um dispositivo específico toda vez que o script for chamado, isso permitiria que você usasse qualquer porta USB, mas acho que seria um exagero aqui.

Sugestões tiradas de este artigo do blog linux.com .

    
por dessert 15.05.2018 / 09:28