Forum: PC-Programmierung libusb device wiederfinden nach reset


von Tastkopf (Gast)


Lesenswert?

Hi,
Mal wieder eine Frage an die libusb leute ;-)

Folgender Ablauf:
1. es sind viele meiner Geräte an einem PC angeschlossen, auf manchen 
läuft grad eine Applikationssoftware, auf manchen der Bootloader
2. ich wähle ein bestimmtes Gerät aus, auf dem eine Applikation läuft, 
vom PC aus (Host software + libusbJava) wird der Befehl den Bootloader 
zu starten gesendet
3. das Gerät resetet sich und meldet sich als Bootloader (andere PID, 
gleiche VID) wieder am Host an.
4. die hostsotware soll genau dieses Gerät wiederfinden aus allen 
angeschlossenen Geräten.  Wie machen ich diesen letzten Punkt?

es gibt die funktion usbdevice.getBus() welche mir die nummer des 
Hostcontroller zurückliefert an dem das Gerät hängt. Damit kann ich 
schonmal eine Teilunterscheidung machen, bleiben allerdings noch 
theoretisch maximal 127 unterschiedliche Geräte die an diesem controller 
hängen könnten.

usbdevice.getFilename scheint mir eine nummer zurückzuliefern welche 
beim suchen der geräte einfach aufitteriert wird. Diese nummer ist 
allerdings nur "konstant" solange keine geräte angeklemmt oder 
abgesteckt werden.

den usbhandle einfach weiterverwenden kann ich nicht, da dieser zerstört 
wird wenn sich das device mit anderem descriptor neu anmeldet, was der 
fall ist da Applikation und Bootloader unterschiedliche PIDs verwenden.

Gibt es noch andere Möglichkeiten?
ich würde es vorziehen nicht jedes device öffnen zu müssen und zu fragen 
ob es das richtige ist.

Grüße
Chris

von Till U. (tuhde)


Lesenswert?

Wenn Du wirklich das selbe Gerät wiederfinden möchtest, mußt Du von 
allen Geräten die SerialNumber im Descriptor lesen und vergleichen.
Das setzt aber voraus, daß Du auch im Bootloader Modus diese 
Seriennummer gesetzt hast. Die Seriennummer ist unabhängig von VID und 
PID.

von Ralf (Gast)


Lesenswert?

Oder alternativ (falls vom Gerät keine Seriennummer unterstützt wird) 
die PortID merken, also an welchem Controller und dessen Kanal das Gerät 
angeschlossen ist und nach dem Bootloaderstart wieder drauf zugreifen. 
Zusätzlich vielleicht noch sicherheitshalber VID/PID vergleichen.

Ralf

von Tastkopf (Gast)


Lesenswert?

Hi,
danke für die schnellen Antworten, ich hab dazu allerdings jeweils noch 
eine Frage.
Die PortID war auch einer meiner ersten Gedankengänge, habe aber keine 
Möglichkeit gefunden diese auszulesen, werde aber aufjedenfall nochmal 
danach schaun.
Die Serialnumber hatte ich erst ausser acht gelassen weil ich dachte sie 
wäre nur 1byte groß, dabei ist das ja nur der index für den string 
descriptor. jetzt die große preisfrage, wie les ich den denn aus? Die 
Variante würde mir am besten gefallen, da sie am wenigsten 
fehleranfällig wäre, vorrausgesetzt ich bekomm es hin das die 
Seriennummern einzigartig sind, aber das sollte ja machbar sein.

von Christian R. (supachris)


Lesenswert?

Tastkopf schrieb:
> Hi,
> danke für die schnellen Antworten, ich hab dazu allerdings jeweils noch
> eine Frage.
> Die PortID war auch einer meiner ersten Gedankengänge, habe aber keine
> Möglichkeit gefunden diese auszulesen, werde aber aufjedenfall nochmal
> danach schaun.
> Die Serialnumber hatte ich erst ausser acht gelassen weil ich dachte sie
> wäre nur 1byte groß, dabei ist das ja nur der index für den string
> descriptor. jetzt die große preisfrage, wie les ich den denn aus? Die
> Variante würde mir am besten gefallen, da sie am wenigsten
> fehleranfällig wäre, vorrausgesetzt ich bekomm es hin das die
> Seriennummern einzigartig sind, aber das sollte ja machbar sein.

Die Serialnummer kannst du direkt aus dem Device Path auslesen, oder 
aber mit LibUSB:
1
if (dev->descriptor.iSerialNumber) {
2
ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));
3
if (ret > 0)
4
printf("- Serial Number: %s\n", string);
5
else
6
printf("- Unable to fetch serial number string\n");
7
}

von Tastkopf (Gast)


Lesenswert?

ok, Seriennummer kann ich auslesen, mich stört allerdings dass ich dafür 
das Device öffnen muss, da die Stringdescriptoren wohl beim Anmeldem am 
Host nicht abgefragt werden.
für die PortID find ich allerdings keine Möglichkeit diese auszulesen. 
Bin alle Funktionen durchgegangen die ich für möglich erachtet habe und 
google will mir auch nicht weiterhelfen.

von Christian R. (supachris)


Lesenswert?

Dann musst du am besten über die Windows SetupAPI gehen, da geht das auf 
jeden Fall ohne Öffnen. Oder über die Registry. Denn die Seriennummer 
wird z.B. auch (ohne Gerät öffnen) im Gerätemanager angezeigt.

von Tastkopf (Gast)


Lesenswert?

ja und wie unterscheid ich sie wenn ich die geräte über die libusb 
ansprechen will? Wenn ich über die Windows SetupAPI rausgefunden habe an 
welchen hubs und ports meine geräte hängen, kann ich sie ja nicht auf 
libusb ebene unterscheiden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.