Wie kann ich ein USB-Gerät auf Raspberry Pi aus- und wieder einschalten?

7

Mein Netgear WiFi-Stick (mit dem Treiber ath9k_htc) auf meinem Raspberry Pi gerät regelmäßig in einen schlechten Zustand, der zu USB-Lesefehlern in dmesg führt. Dieser Zustand kann nicht durch ein Zurücksetzen des Systems korrigiert werden, sondern erfordert einen vollständigen Aus- und Wiedereinschalten des USB-Geräts, entweder durch Herausziehen und erneutes Einstecken des USB-Sticks oder durch Aus- und Wiedereinschalten des gesamten Computers.

Ich habe gelesen, dass es möglich ist, ein USB-Gerät über einen USB-Hub programmgesteuert aus- und wieder einzuschalten. Daher habe ich dies mit meinem Inland 4 Port USB 2.0 Hub versucht, basierend auf den Informationen in diesem Beitrag:

/programming/1163824/linux-usb-turning-the-power-on-and-off

Die Lichter am USB-WLAN-Stick leuchten jedoch auch nach Eingabe des folgenden Befehls weiter, obwohl das wlan0-Gerät dadurch verschwindet. Ich habe es auf einem Belkin 4-Port Hub mit den gleichen Ergebnissen versucht. Hat jemand irgendwelche Ideen?

echo '1-1.2.3' | tee /sys/bus/usb/drivers/usb/unbind

Details meiner USB-Verbindungen:

pi@fpi-16 ~ $ sudo lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/3p, 480M
        |__ Port 1: Dev 3, If 0, Class=vend., Driver=smsc95xx, 480M
        |__ Port 2: Dev 4, If 0, Class=hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 5, If 0, Class=vend., Driver=rt2800usb, 480M
            |__ Port 3: Dev 6, If 0, Class=vend., Driver=ath9k_htc, 480M
David Young
quelle

Antworten:

1

Wenn Ihr USB-Host-Treiber als Kernelmodul kompiliert ist, können Sie versuchen, ihn zu entladen und neu zu laden. Dies sollte normalerweise auch den USB vollständig ausschalten (ich habe es auf anderen Geräten mit fehlerhafter USB-Hardware gemacht, die elektrisch zurückgesetzt werden müssen, nicht speziell auf dem Rasperry Pi, was mir nicht leid tut). Überprüfen Sie also, ob Sie es als Modul (lsmod) sehen oder als Modul kompilieren und später rmmod (und alle Abhängigkeiten eventuell) und laden Sie es erneut, es sollte den Trick tun.

fede.evol
quelle
0

Hier ist eine App, die genau das kann, was Sie brauchen: https://github.com/codazoda/hub-ctrl.c

Installations- und Gebrauchsanweisungen finden Sie unter README.md.

Es kann einige Versuche und Irrtümer erfordern, um herauszufinden, welcher Hub und Port jedem USB-Port entspricht, was je nach Raspberry Pi-Modell zu variieren scheint.

Das Aus- und Wiedereinschalten kann in einem einzigen Befehl erreicht werden, indem der Befehl ap 0 (Ausschalten) gefolgt von ap 1 (Einschalten) gesendet wird.

Molgar
quelle
0

Voraussetzung: Laden Sie das Usbreset von https://gist.github.com/x2q/5124616 herunter und kompilieren Sie es mit gcc -o usbreset usbreset.c. GCC sollte bereits auf Ihrem Himbeer-Pi sein. Dannchmod +x usbreset

Wenn Sie nur ein USB-Gerät haben, können Sie dieses Gerät zurücksetzen und es funktioniert. Wenn Sie viele USB-Geräte haben, sollten Sie stattdessen den USB-Hub zurücksetzen.

Um die IDs von USB-Geräten zu finden, führen Sie lsusb aus. Sie sollten etwas sehen wie: Bus 001 Gerät 009: ID 152d: 0578 JMicron Technology Corp. / JMicron USA Technology Corp. Bus 001 Gerät 008: ID 1f75: 0621 Innostor Technology Corporation Bus 001 Gerät 007: ID 0424: ec00 Standard Microsystems Corp. SMSC9512 / 9514 Fast Ethernet Adapter Bus 001 Gerät 002: ID 0424: 9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Gerät 001: ID 1d6b: 0002 Linux Foundation 2.0 Root Hub

Der Hub, über den ich schreibe, ist SMC9514 Hub.

Erstellen Sie eine sh-Datei:

#!/bin/bash

USBNAME=0424:9514 #Put here the usb ID
LSUSB=$(lsusb | grep --ignore-case $USBNAME)
FOLD="/dev/bus/usb/"$(echo $LSUSB | cut --delimiter=' ' --fields='2')"/"$(echo $LSUSB | cut --delimiter=' ' --fields='4' | tr --delete ":")
echo $LSUSB
echo $FOLD

sudo ./usbreset $FOLD; #The path where you have the usbreset executable

Und führen Sie es aus: bash usbreset.sh

Sie müssen usbreset.sh schlagen, bevor Sie ein USB-Gerät mounten, das bereits funktioniert. Mein Pi verfügt beispielsweise über eine permanent angeschlossene SSD und zwei Festplatten, die von einer Relaisplatine gespeist werden. Ich muss den Befehl zum Zurücksetzen ausführen, bevor ich die SSD einbinde, sonst funktioniert es nicht.

Es sollte auch für Ihr Gerät funktionieren.

Ich hoffe es hilft.

IonutG
quelle