Befehle zum „Simulieren“ des Entfernens und erneuten Einsteckens eines USB-Peripheriegeräts?


8

Ich benutze Bewegung auf einem Raspberry Pi und manchmal hängt der Kamera-Feed. Die Kamera ist physisch montiert, und es ist etwas umständlich, das Kabel zu entfernen und wieder einzuführen. Deshalb habe ich mich gefragt:

Gibt es eine Möglichkeit, den gleichen Effekt programmgesteuert zu erzielen?


Hallo - Könnten Sie bitte eine Antwort akzeptieren: D wie es scheint, haben einige Antworten hier vielen Menschen in Ihrer Situation geholfen. Sie fragen sich, ob es Ihnen auch geholfen hat?
Piotr Kula

Antworten:


8

Gute Frage und gute Idee. Shuckle schlägt einen Code vor, der den USB-Bus für das Gerät zurücksetzt, wodurch einige Probleme behoben werden können. Siehe offizielles Forum:

http://www.raspberrypi.org/phpBB3/viewtopic.php?p=219980#p219980

Ich zitiere seinen C-Code, den ich noch nicht getestet habe:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>

void main(int argc, char **argv)
{
    const char *filename;
    int fd;

    if (argc < 2) {
        printf("Give USB device name as parameter\n");
        exit(1);
    }
    filename = argv[1];
    fd = open(filename, O_WRONLY);
    if (fd == -1) {
        perror("USB device open failed");
        exit(2);
    }
    if (ioctl(fd, USBDEVFS_RESET, 0) == -1) {
        perror("USBDEVFS_RESET device ioctl failed");
        exit(3);
    }
    close(fd);
}

Sie verwenden diesen Code dann, indem Sie im Grunde sagen:

usbreset /dev/bus/usb/001/004

Sie könnten die Busnummern von lsusb erhalten:

$ lsusb
...
Bus 001 Device 004: ID 046d:092f Logitech, Inc. QuickCam Express Plus
Bus 001 Device 006: ID 046d:0825 Logitech, Inc. Webcam C270

Jetzt bin ich neugierig, ob das ein Problem mit dem alten Express Plus beheben würde. Das werde ich bald versuchen!


Vielen Dank für eine tolle Antwort, ich werde es sicher testen! Lassen Sie uns wissen, ob Ihr Express Plus-Problem dadurch behoben wird. :-)
Christian Neverdal

Mein Problem wurde dadurch nicht behoben , aber der oben angegebene Code scheint den Bus zurückzusetzen und zu verhindern, dass die Kamera in einem defekten Zustand hängen bleibt. Außerdem verbessern Firmware-Updates weiterhin die USB-Leistung für diese fragwürdigen Kameras. ** Linux psychic 3.6.11+ # 414 PREEMPT Do 18. April 02:00:59 BST 2013 armv6l GNU / Linux **
Tai Viinikka

5

Sie können USB-Geräte mit sysfs verschwinden lassen. Ich habe dies mit einem Logitech Unifying USB-Empfänger getestet. Obwohl lsusbdas Gerät aufgelistet ist, wurden Tastendrücke nicht verarbeitet, als das Gerät mit dieser Methode entfernt wurde.

  1. Ermitteln Sie mithilfe Ihres USB-Geräts die ID dmesg. Zum Beispiel erhalte ich nach dem Anschließen des USB-Empfängers folgende 1-1.2ID:

    usb 1-1.2: new full-speed USB device number 4 using dwc_otg
    usb 1-1.2: New USB device found, idVendor=046d, idProduct=c52b
    usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    usb 1-1.2: Product: USB Receiver
    usb 1-1.2: Manufacturer: Logitech
    
  2. Entfernen Sie das Gerät und setzen Sie es erneut ein:

    sudo sh -c 'echo 1-1.2 > /sys/bus/usb/drivers/usb/unbind'
    sudo sh -c 'echo 1-1.2 > /sys/bus/usb/drivers/usb/bind'
    
  3. Profitieren!

Sie können auch Erfolg haben, indem Sie Unbind schreiben und den Treiber für Ihren Kameratreiber binden. Verwenden Sie ls -l /dev/bus/[DRIVER]/devices, um den Treiber zu bestimmen.

(Inspiriert von einer Antwort auf Unix.SE )


4

Im Geiste des Teilens habe ich den usbresetin Tais Antwort oben angegebenen Code geändert , um Parameter zu akzeptieren, die Sie lsusb(zusätzlich) erhalten. Auf diese Weise kann es bequem von aufgerufen werden

DEVNUMS=`lsusb | grep -i webcam | tr -d : | awk '{print $2, $4;}'`
/home/xyz/cam/usbreset $DEVNUMS

was sich zum Beispiel in verwandelt

/home/xyz/cam/usbreset 001 018

Der Code ist am Ende.

Ich habe festgestellt, dass der Pi USB-Webcam-Treiber häufig abgestürzt ist, aber dies ist eine Möglichkeit, ihn wiederherzustellen. Es war am einfachsten, die ausführbare Datei su root zu machen.

void main(int argc, char **argv)
{
    char devicename[1024];
    const char *filename = devicename;
    int fd;

    if ( 2 > argc || 3 < argc ) {
        printf("Give USB device name as parameter\n");
        exit(1);
    }

    if ( 2 == argc ) 
        filename = argv[1];
    else
        sprintf( devicename, "/dev/bus/usb/%s/%s", argv[1], argv[2] );

    printf( "Resetting USB device '%s'\n", filename );

    fd = open(filename, O_WRONLY);
    if (fd == -1) {
        perror("USB device open failed");
        exit(2);
    }
    if (ioctl(fd, USBDEVFS_RESET, 0) == -1) {
        // Don't care!  It usually does, when we need to reset it.
        //perror("USBDEVFS_RESET device ioctl failed");
        //exit(3);
    }
    close(fd);
}

1

Sie könnten versuchen, das USB-Laufwerk zu deinstallieren und zu montieren?

$ sudo mount /dev/sda1 /path/to/usb
$ sudo umount /path/to/usb

In der ersten Zeile wird / path / to / usb zum Mount-Punkt des USB-Ports bei / dev / sda1 (Sie müssen jedes Mal überprüfen, an welchen Port er angeschlossen ist, wenn Sie ihn anschließen).

In der zweiten Zeile wird die Bereitstellung des Ports über den Alias ​​aufgehoben


1
Ich denke, das OP bedeutet physisch montiert, und es ist daher schwierig, den Netzstecker zu ziehen. :)
Tai Viinikka

Ja, physisch montiert. (Und es ist übrigens kein USB-Laufwerk, es ist eine Kamera.)
Christian Neverdal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.