Forum: PC-Programmierung Usb-Gerät Seriennummer im Gerätemanager anzeigen


von wastl (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem:

Ich benutze einen FX2LP USB Controller von Cypress (genauer: cy7c6813A), 
an dem ein externer EEPROM am I2C-Bus hängt.

Jetzt habe ich ein Programm geschrieben (Visual Studio 2010, C++), mit 
dem man seine eigene Vendor ID (VID) und Product ID (PID) eingeben kann 
und die in den EEPROM übernommen werden. Diese werden dann mit dem C0 
Load auch übernommen und nach anpassen der inf-datei werden VID und PID 
auch im Gerätemanager angezeigt. Ich benutze Windows XP.

Jetzt soll auch noch eine Seriennummer angezeigt werden, die zuvor 
eingegeben wurde. Eingeben und in den EEPROM schreiben funktioniert, 
aber ich habe keine Ahnung, wie ich die Seriennummer im Gerätemanager 
angezeigt bekomme. Deshalb meine Frage(n):

1: Ist das Überhaupt mit vertretbarem Aufwand möglich?
2: Wenn ja, wie geht´s, ich bin so langsam am Verzweifeln?

Vielen Dank schon mal im Vorraus

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sollte im XP-Gerätemanager Teil der sogenannten 
"Geräteinstanzkennung" sein, die im Eigenschaften-Fenster eines 
USB-Gerätes unter "Details" angezeigt wird:

USB\VID_0815&PID_4711\0000167C87704509

(Unter Windows 7 wird das "Geräteinstanzpfad" genannt)


Oder habe ich Dich komplett falsch verstanden?

von wastl (Gast)


Lesenswert?

Richtig,

und ich soll \0000167C... aus dem EEPROM lesen und dann dahin schreiben.

Jetzt kenn ich mich zwar mit C/C++ einigermaßen aus, aber sobald es dann 
an
einen PC geht, bekomme ich Schwierigkeiten.

Ich habe auch versucht den sog. Device Descriptor zu manipulieren aber 
das hat auch nicht funkitoniert.

von Chris (Gast)


Lesenswert?

wastl schrieb:
> Jetzt soll auch noch eine Seriennummer angezeigt werden, die zuvor
> eingegeben wurde. Eingeben und in den EEPROM schreiben funktioniert,
> aber ich habe keine Ahnung, wie ich die Seriennummer im Gerätemanager
> angezeigt bekomme.

Wo Du die im Gerätemanager sehen kannst, weiß ich nicht. Du könntest 
aber z.B. mit USBDeview schauen, ob sie überhaupt übertragen wird. Dort 
wird sie dir auf jeden Fall angezeigt.
http://www.nirsoft.net/utils/usb_devices_view.html

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

wastl schrieb:
> aber ich habe keine Ahnung, wie ich die Seriennummer im Gerätemanager
> angezeigt bekomme.

Wenn Dein USB-Device die Seriennummer als Seriennummer mitteilt, dann 
zeigt der Gerätemanager die Nummer an, so, wie ich das beschrieben habe.


> und ich soll \0000167C... aus dem EEPROM lesen und dann dahin schreiben.

Was meinst Du damit, "dahin schreiben"?

von wastl (Gast)


Lesenswert?

Sie wird nicht übertragen, was durchaus logisch ist, da beim C0 load nur 
die ersten 6 Byte (+Config Byte) übertragen werden.

Ich habe versucht, verschiedene Register des Controllers zu beschreiben 
aber das funktioniert nicht.
Ich verwende die USB2Dll von braintechnology. Daraus nehme ich die 
Funktionen
UsbEEpWriteByte() und
UsbEEpREadByte()

die den internen Speicher beschreiben (sollen). Ist das überhaupt 
richtig?

von wastl (Gast)


Lesenswert?

Mit "dahinschreiben" meine ich, die Seriennummer aus dem EEPROM zu lesen 
(was ja wie gesagt funktioniert) und diese dann anstatt \0000167C.. im 
Gerätemanager anzeigen zu lassen

von Christian R. (supachris)


Lesenswert?

Die Seriennummer im Gerätemanager wird bei der Initialisierung vom Host 
ausgelesen, und zwar über GetStringDescriptor. Das ist bei jedem USB 
Gerät so. Die muss also zum Zeitpunkt der Enumerarion im FX2 an der 
passenden Stelle stehen und die Deskriptoren müssen passen. Zur Laufzeit 
kann man die dann nicht mehr ändern oder wo anders her auslesen, es sei 
denn, man ändert den String Deskriptor und löst ein Renum aus. Wenn die 
von Windows nicht angezeigt wird, steht sie nicht an der richtigen 
Stelle, und/oder der Deskriptor passt nicht. Soweit ich das in 
Erinnerung habe, kann der einfache C0 Load keine SN mit übergeben. Wir 
laden die komplette Firmware aus dem EEPROM, das geht das, da kommt die 
Seriennummer mit in die desc.asm Datei rein. Wenn du nur den C0 Load 
machst und dann per USB Treiber die Firmware nachlädst, muss in der 
nachgeladenen Firmware die Seriennummer drin stehen, damit die beim 
Renum dann vom Host gelesen werden kann.

von wastl (Gast)


Lesenswert?

Hallo nochmal,

danke für die Hilfen, ich hab´s jetzt anders gelöst.

von Christian R. (supachris)


Lesenswert?

Ah, und wie?

von wastl (Gast)


Lesenswert?

Die Seriennummer anzuzeigen wär nur ein nettes Feature gewesen.
Wichtig ist, dass, wenn mehrere Geräte mit dem FX2 Controller (inkl. 
EEPROM) diese per Programm unterscheidbar sind.

Werde jetzt also ein Programm schreiben, das die Anzahl der 
angeschlossenen Geräte erkennt und dann die jeweilige Seriennummer aus 
dem EEPROM liest (steht immer an der selben Addresse)

von Christian R. (supachris)


Lesenswert?

Hm, von hinten durch die Brust ins Auge. Welche Firmware verwendet du 
denn für die Controller? Schreibst du die selber, oder nimmst du die 
fertige von Braintechnology?
Prinzipiell würd ich dir aber dringend raten, nicht den CyUSB Treiber zu 
benutzen. Der macht immer Probleme. Am besten Firmware selber machen 
(auf Basis des BulkLoop Beispiels ganz einfach). Und dann das Ding per 
WinUSB ansprechen. Das geht sehr einfach und vor allem zuverlässig. 
Außerdem ist der WinUSB Treiber schon signiert, kann man also auch 
problemlos unter X64 verwenden, ohne den WHQL Test machen zu müssen.

von wastl (Gast)


Lesenswert?

Hallo Christian,

ich probier gerade den C2 Load aus. Ich bin so weit, dass alles was in 
meinem EEPROM nach C2 steht, auch in den internen Speicher geschrieben 
wird. Allerdings hab ich folgendes NICHT verstanden:

Laut TRM folgt beim C2 load zuerst C2 dann VID/PID/DID dann Config Byte.
So weit so gut. Danach allerdings folgen zwei Byte, die angeben, wie 
groß der nächste Datenblock ist und auf diese zwei Byte folgen wieder 
zwei Byte die Startaddresse des Datenblocks angeben. Jetzt versteh ich 
nicht:

Ist die Startadresse die Adresse, unter der der Datenblock dann im 
internen RAM steht (tut er bei mir nicht) oder liest der Controller dann 
an der EEPROM-Addresse, die in Startaddresse liegt.

Weißt du, wo es Beispiele zum C2 load gibt?
Was ist das BulkLoop-Beispiel? Ich hab nämlich auch schon gemerkt, dass 
der
CyUsb-Treiber Probleme macht.

Schon mal danke im Vorraus

von wastl (Gast)


Lesenswert?

Ich bin´s nochmal,

das mit den Startaddressen hat sich geklärt

von Christian R. (supachris)


Lesenswert?

Kannst ja auch einfach die CyConsole nehmen, um die Firmware in das 
EEPROM zu bekommen. Vorher mit hex2bix in das iic File umwandeln. Alle 
Tools und Beispiele sind in dem Cypress Entwicklerpaket drin: 
http://www.cypress.com/?docID=5975

von wastl (Gast)


Lesenswert?

Mal eine vielleicht dumme Frage: CyConsole = Keil?
Ich verstehe auch nicht, wie ich das Bulkloop Beispiel abändern soll und 
in ein IIC File umwandeln kann (was ist hex2bix ?)

Ich habe mir das Beispiel angeschaut, und so wie ich das verstehe wird 
doch der Device Descriptor verändert, oder?

von Christian R. (supachris)


Lesenswert?

CyConsole ist beim Entwicklerpaket (62MB) dabei. Außerdem im CyUSBSuite 
Paket, ebenfalls auf der Cypress Homepage. Damit kann man einfachen 
Datentransfer zu den CyUSB Treibern machen. Außerdem kann man die 
EEPROMs programmieren. Der Keil Compiler ist auch dabei und der erzeugt 
hex Files. Um die ins EEPROM zu programmieren ist im Cypress Ordner ein 
Tool namens hex2bix, das macht die IIC Files, und da kannst du auch 
angeben, ob C0 Load oder C2 Load, und das Config Byte zum Umschalten auf 
400kHz I2C Takt. BulkLoop ist da auch dabei bei Examples. Das ist 
einfach eine Firmware für den FX2, die alle Daten, die über den OUT 
Endpoint kommen, wieder an den IN Endpoint zurück schickt. Die kann man 
als Ausgangspunkt nehmen.
Frage ist, was außer der Seriennummer willst du denn damit überhaupt 
machen? Die Seriennummer musst du als zuzätzlichen String in der 
dscr.a51 hinzufügen, nach dem Muster der anderen Strings da drin.
zum Beispiel so:
1
StringDscr3:   
2
      db   StringDscr3End-StringDscr3      ;; Descriptor length
3
      db   DSCR_STRING
4
      db   'S',00
5
      db   '0',00
6
      db   '9',00
7
      db   '0',00
8
      db   '0',00
9
      db   '1',00
10
StringDscr3End:

Und oben beim DeviceDescriptor den noch eintragen:
1
...
2
db   1                    ;; Manufacturer string index
3
db   2                    ;; Product string index
4
db   3                    ;; Serial number string index
5
db   1                    ;; Number of configurations

von wastl (Gast)


Lesenswert?

Danke,

außer den Seriennumern will ich nichts machen

von wastl (Gast)


Lesenswert?

Ich nochmal,

folgendes Problem: ich habe das von dem Link oben runtergeladen und 
installiert, und besitze nun folgendes:

Keil uVersion2
EZ-USB Control Panel SX2 IE Master

Keil kann ich öffnen, wenn ich den EZ-USB Control Pane. öffnen will 
erscheint folgendes:

"No Cypress USB device connected. You may plug in or install USB 
Devices."

Und das, obwohl ich den CyUsb Treiber verwende und das Gerät im 
Gerätemanager auch erkannt wird

von Christian R. (supachris)


Lesenswert?

Das EzControl Panel ist für den alten ezusb.sys Treiber. Lade dir mal 
das Paket runter: http://www.cypress.com/?rID=34870 da ist die CyConsole 
und der aktuelle CyUSB Treiber drin.

Und wie, außer Seriennummer willst du nix machen? Zu irgendwas muss der 
FX2 Chips ja in deiner Anwendung da sein, im Normalfall Datentransfer? 
Weil wenn du jetzt die proprietäre usb2.dll von Brain nimmst, kannst du 
die nicht ändern, die rücken ja den Quellcode nicht raus. Du müsstest 
dir dann schon eine eigene Software machen und über die CyAPI drauf 
zugreifen...

von wastl (Gast)


Lesenswert?

Danke nochmal,

ich selbst muss nur das mit der Seriennummer machen, der Baustein an 
sich überträgt auch noch Daten an einen FPGA, aber dieses Programm hat 
schon ein anderer geschrieben.

von Christian R. (supachris)


Lesenswert?

Achso, na wie gesagt, da kommts drauf an, ob ihr die komische 
Frickel-DLL von Brain Technology nehmt, oder die CyAPI, bzw. ob ihr die 
Firmware für den Controller selbst schreibt. Aus deinen Posts hört sich 
das eher so an, als ob ihr das Brain zeug für den Datentransfer nehmt. 
Dann kannst du meines Wissens auch nachträglich keine Seriennummer 
direkt in den USB Device Descriptor einfügen, wweil du keine Quellcodes 
hast.

von wastl (Gast)


Lesenswert?

Ja, das denk ich auch. Ich werd mich jetzt an den Support von Cypress 
wenden und wenn´s dann immer noch nicht funktioniert, werde ich es 
bleiben lassen müssen.

Trotzdem vielen Dank.

von Christian R. (supachris)


Lesenswert?

Ich denke, da müsstest du dich eher an den Support von Brain Technology 
wenden, sofern vorhanden. Cypress beschreibt, wie man die Seriennummer 
passend angibt, das muss aber in der Firmware passieren. Wenn Brain 
Technology das "vergisst", kann Cypress ja nix machen.

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.