libusb device wiederfinden nach reset

Gast #2752535
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
Gast #2753419
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.
#2753602
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
}
Gast #2753608
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren