2017-06-20 7 views
0

Ich habe ein Linux-System mit mehreren USB-Sticks angeschlossen, als/dev/sda1,/dev/sdb1, etc. Ich muss eine dieser aus meinem Programm auswerfen - so etwas wie EjectDrive("/dev/sdb1"); Ich muss dann möglicherweise programmgesteuert Setzen Sie das Laufwerk erneut ein.Wie entferne ich ein Flash-Laufwerk programmatisch anhand seines Knotennamens?

Ich weiß, ich kann dies von der Befehlszeile aus tun, wenn ich den USB-Bus, Port und Gerätenummer kenne. z.B. echo '2-1.3' > /sys/bus/usb/drivers/usb/unbind und dann echo '2-1.3' > /sys/bus/usb/drivers/usb/bind

Ich bin mir nicht sicher, wie das von C++ zu tun, und 100% sicher sein, dass ich den richtigen Bus, Port und Gerät für das angegebene Laufwerk verwenden.

Dies ist eine eingebettete Plattform mit BusyBox v1.22.1, also ist udev nicht für mich verfügbar, und lsusb gibt minimale Informationen zurück.

+0

Es gibt Slways das 'eject' Programm .. –

+0

So ist es. Aber ich muss (muss) es auch programmatisch neu einfügen, so dass nur die Hälfte meines Problems gelöst wird. Ich werde die Frage bearbeiten, um das klarzustellen. Vielen Dank. – IndefatibableGoodForm

+0

Haben Sie Man-Seiten erkundet? Was ist der Befehl, um die USB-Laufwerke im System aufzulisten? (Verwenden Sie Google) Also, woher kennen Sie den Bus, Port, Gerät? Wie findest du heraus, wenn du es nicht weißt? (Hinweis - Google "Wie liste ich alle USB-Geräte?) Vielleicht können Sie mehr Forschung ... gibt es andere Ressourcen für diese Fragen, aber keine davon sind C++ –

Antwort

1

Ja, es kann mit libusb (folgen this link für libusb Verwendung mit C++) getan werden. Nun ein paar Dinge zu beachten -

1 - Was ist die Geräteadresse? (Sie können dies mit libusb API erhalten)

libusb_get_device_list (libusb_context *ctx, libusb_device ***list) 
libusb_get_device_address (libusb_device *dev) 
libusb_get_port_number (libusb_device *dev) 

2 - Ist das Gerät an den Root-Hub-Port oder an einen Hub angeschlossen?

libusb_get_parent (libusb_device *dev) 

3 (Dies kann durch Lese der übergeordnete Vorrichtung der/dev/sdb1 oder sda1 erfolgen) - Wenn sein mit einer Nabe verbunden, ist dann eine Steuer Übertragung auf „clear“ PORT_POWER Merkmal dieses Ports. Dadurch wird der Port deaktiviert und das Gerät wird getrennt. Sie können die PORT_POWER-Funktion einstellen, um den Port einzuschalten, und das Gerät wird erneut verbunden. Denken Sie daran, dass Sie kein Trennereignis erhalten, das der Spezifikation entspricht. (EHCI oder XHCI)

int libusb_control_transfer ( libusb_device_handle * dev_handle, 
uint8_t  bmRequestType, 
uint8_t  bRequest, 
uint16_t wValue, 
uint16_t wIndex, 
unsigned char *  data, 
uint16_t wLength, 
unsigned int timeout 
) 

4 - Wenn das Gerät mit dem Root-Hub-Port direkt verbunden ist, prüfen Sie bitte, ob Libusb Clearing-Root-Hub-Anschluss Netz unterstützt. Da bin ich mir nicht sicher. Dies hängt auch vom Host-Controller-Treiber-Stack ab.

Bitte folgen Sie dem oben genannten Link zum Beispiel der Verwendung dieser APIs.

+1

Dies könnte eine gute Antwort sein, wenn es die tatsächliche erwähnt" libusb'-APIs, die verwendet werden könnten Ein minimales Code-Snippet (auch wenn es nur bei einem bestimmten hw/sw-Setup verifiziert wurde), das ein USB-Gerät anhand seines Geräteknotennamens identifiziert und es "auswirft", fehlt In dieser Antwort: – TheCodeArtist

+0

@TheCodeArtist Vielen Dank für den Vorschlag, die APIs wurden hinzugefügt. – Shaibal

Verwandte Themen