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
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?
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.
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
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"?
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?
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
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.
Hallo nochmal, danke für die Hilfen, ich hab´s jetzt anders gelöst.
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)
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.
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
Ich bin´s nochmal, das mit den Startaddressen hat sich geklärt
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
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?
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 |
Danke, außer den Seriennumern will ich nichts machen
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
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...
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.