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.
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
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:
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.