Forum: PC-Programmierung DLL für Cypress CyUSB Treiber erstellen


von ugly_dugly (Gast)


Lesenswert?

Hallo,

ich beschäftige mich derzeit mit der Anwendungsentwicklung für einen
Cypress CY7C68013A High-Speed USB 2.0 Mikrocontroller. Als Treiber für
diesen Controller möchte ich gerne den CyUSB.sys verwenden, der direkt
von Cypress angeboten wird. Dieser Treiber kommt zusammen mit einer
statischen Library CyAPI.lib sowie einer Header Datei CyAPI.h zu derer
Einbindung in Visual C++.
Zur Programmierung verwende ich eine an Fortran angelehnte
Programmiersprache (IDL), die "nur" in der Lage ist, DLLs
einzubinden.

Nun meine eigentliche Frage: Gibt es eine Möglichkeit, aus der
statischen library CyAPI.lib eine dynamische Library (DLL) zu erzeugen,
die ich anschließend in meiner Programmiersprache einfach einbinden
kann? Wenn ja, kann mir jemand erklären wie man soetwas bewerkstelligt?
Leider sind meine C++ Kenntnisse nicht sonderlich gut.

Danke schonmal im voraus für eure kostbare Zeit, die ihr in eine
Antwort investiert!

von Stefan (Gast)


Lesenswert?

Das könnte gehen, allerdings nicht als "Umformung der LIB in eine
DLL".

Du bist aber nicht allein mit dieser Idee:
http://forum.hardware.fr/hardwarefr/Programmation/creer-partir-librairie-statique-sujet-83307-1.htm
http://forums.ni.com/ni/board/message?board.id=170&message.id=143300

Ein möglicher Weg könnte sein, die LIB statisch an eine zuschreibende
DLL zu binden und über Interfacefunktionen in der DLL zu nutzen.

Zu beachten wäre, dass die Codeseiten einer DLL bei mehreren Aufrufern
pysikalisch auf einen Bereich abgebildet werden, d.h. der Code (und
falls erwünscht auch Daten) geshared werden. Daten würde ich erst mal
nicht sharen, denn das erfordert im Gegensatz zu der statischen
Library, dass die DLL und die dazugebundene LIB reentrant geschrieben
sind.

Eine weitere Falle lauert auf die DLL, wenn du ein Mulithread-Programm
hast. Es kann in dem Fall notwendig sein, entsprechenden Platz für
Daten beim Threadwechsel anzufordern (bei explizitem
Loadlibrary-Aufruf) bzw. vom Linker in der DLL bereitzustellen (beim
imlpiziten Aufruf).

von Stefan (Gast)


Lesenswert?

s/pysikalisch/physikalisch/

von ugly_dugly (Gast)


Lesenswert?

Danke für deine Antwort, die mir schonmal sehr weiterhilft (vor allem
die beiden links), auch wenn ich nicht wirklich alles davon verstanden
habe.

Soweit ich das jetzt glaube zu verstehen, muss ich also ein sog.
"Wrapper" in Form einer *.def Datei erzeugen.
Bei dem französischen Link von oben hat dies ja auch schon jemand
getan. Was mach ich aber anschließend mit dieser *.def Datei in Visual
C++ um mir die DLL erzeugen zu lassen? Das geht irgendwie nicht so
richtig aus diesem Link hervor, da die dann irgendwie zu Visual Basic
abschweifen.

Vielelicht kann mir ja jemand die Vorgehensweise dazu etwas näher
erläutern. Ich hoffe meine Frage ist nicht zu trivial, aber ich bin in
Visual C++ leider nicht all zu konform.

von Stefan (Gast)


Lesenswert?

Nee, du musst schon noch Code selbst schreiben.

Im Prinzip musst du für jede Funktion aus der stat. Library eine
Wrapperfunktion schreiben, die vom Hauptprogramm aufgerufen wird, die
Parameter an die stat. Libraryfunktion übergibt und den Rückgabewert an
das Hauptprogramm übergibt.

Also in etwa (obacht: C++ Laie!!!)

CCyUSBConfig my_CCyUSBDevice_GetUSBConfig(CCyUSBDevice my_CCyUSBDevice,
int index)
{
   return my_CCyUSBDevice.GetUSBConfig(index);
}

als Wrapper für die Libraryfunktion

CCyUSBDevice::GetUSBConfig(index)

Aufwändig wird dies dadurch, dass du eine C++ Library hast und du
ausser den Funktionen (Methoden) auch das Anlegen/Zerstören der Objekte
berücksichtigen musst.

Im Prinzip stellt deine DLL ein eigenständiges USB Steuerprogramm dar,
das über die Wrapperfunktionen ein Interface nach aussen hat.

Das ist definitiv kein Projekt für einen Abend.

von DerDan (Gast)


Lesenswert?

Hallo,

ich beschäftige mich auch gerade damit, für diesen Cypress Bausteine 
eine DLL zu kodieren, allerdings in Delphi.

darin will ich den CyUSB Treiber ansprechen. also den CyAPI weglassen, 
da sonst folgende Konstruktion hätte:

CyUsb <- CyApi <- CyPas <- Applikation

ich will aber

CyUsb <- CyPas <- Applikation


Bin ich da der Einzige oder gibts noch andere die an dieser Baustelle 
arbeiten?


mfg


derDan

von Svenski (Gast)


Lesenswert?

Nein! Du bist nicht der einzige!

Ich brüte derzeit gleichermaßen auch an einer solchen Wrapper-DLL für 
Delphi, nur binde ich die CyApi.lib mit ein.

Bisher bekomme ich einen Zugriff auf das Davice und lasse mir erstmal 
Vendor- und Product-ID anzeigen.

Der Zugriff auf die Read/Write-Funktionen des EP0 bereitet mir jetzt 
Probleme.
Ich bekomme eine Zugriffsverletzung beim USB-Device-Request, vermutlich 
gibt es ein Problem wenn die Lib-Funktion auf meinen Delphi-Buffer 
zugreift. Bin kein Informatiker, daher tue ich mir beim debuggen schwer, 
zumal ich net in die lib sehen kann.

Wie komme ich da am besten weiter bzw. hat jemand nen guten Rat auf 
Lager?

von RoyW (Gast)


Lesenswert?

Hallo,
ich bin gerade auf diesen Beitrag gestossen und habe zur Zeit das 
gleiche Problem.
Ich möchte auch per Delphi irgendwie auf den CY7C68013A zugreifen 
können.
Habt ihre dort schon eine Lösung gefunden , oder etwas angearbeitet wo 
man die Struktur erkennen kann ?
Das wäre echt super ...

Gruß

Roy

von Stefan (Gast)


Lesenswert?


von RoyW (Gast)


Lesenswert?

Das sieht ja vom Prinzip her nicht schlecht aus.
Doch wenn ich das richtig verstehe kann man damit nur Daten vom Parallen 
bzw. i2c Port lesen bzw. schreiben.
Was ich suche ist ein Bulk Transfer ....
Hast du schon was an der oben beschriebenen Wrapper dll gemacht ?

von Stefan (Gast)


Lesenswert?

Mais non! Isch 'abe gar kein Cypress ;-)

von RoyW (Gast)


Lesenswert?

oh, ich dachte.
Schade ...

von Svenski (Gast)


Lesenswert?

DLL ist schön, aber es geht doch auch ohne!

Unter Delphi kann man auch auf Treiber wie z.B. EzUsb.sys von Cypress 
zugreifen. Habs probiert und es geht!

von DerDan (Gast)


Lesenswert?

Hallo,

ich hab schon eine Portion der Funktionen für delphi erstellt. Ich kann 
schon einen FPGA über den Cypress Chip konfigurieren. Die daten werden 
dabei über den EP0 an den Cypress geschickt und dann seriell auf die 
JTAG Pins. Dazu muss natürlich die richtige SW im Cypress stehen, die 
ich über eine Download Funktion hineinlade.

Die Transfers über die anderen Endpoints scheint zu funktionieren. Ich 
kann die Bulkloop Demo von Cypress reinladen und die Daten hin und her 
schicken.

Ich hänge an dem Punkt an dem der FPGA die Daten liefert und über den 
Cypress an den PC schicken kann.


ist halt alles ein haufen Arbeit.


mfg

von royw (Gast)


Lesenswert?

@Svenski

Wie hast du das gemacht ?
Kannst du mir da source code für geben ??
Das wäre super

thx schon mal

Roy

von Svenski (Gast)


Lesenswert?

Die Quellen sind etwas umfangreich geworden. Muß selbst mal sehen, ist 
schon wieder ne weile her:
Hab dazu das Header-File mit nem Tool nach Delphi portiert, hier und da 
waren dann noch Anpassungen nötig, egal. Aufwendiger ist da schon die 
Portierung ainiger Beispielfunktionen von Cypress, besser ist es schon 
das selbst zu programmieren.

Die Zauberfunktion ist "DeviceIoControl", zu finden in der Delphi SDK. 
Um Zugriff auf Treiberfunktionen zu bekommen wird mit "CreateFile 
('\\.\Ezusb-0', .....);" ein Handle auf das Device geholt. Gesendet und 
empfangen wird dann mit Hilfe eigener Threads und DeviceIOControl.

DerDan hat verdammt recht: Ist alles ein riesen Haufen Arbeit!

@DerDan: CyUsb <- CyPas <- Applikation    --> so mach ich das auch

Das sind drei Baustellen auf einmal, lässt man das FPGA mal aussen vor!

von Frank (Gast)


Lesenswert?

Über diese Cypress geschichten hab ich nur mal am Rande gelesen. Gibt es 
einen Grund, warum es der Treiber vom Hersteller sein muss? Ich habe 
ganz brauchbare Erfahrungen mit der libUSB gemacht. Vielleicht gibts 
dafür ja schon was fertiges.

von alex (Gast)


Lesenswert?

Man muss unterscheiden welches OS mit der USB zusammenarbeiten soll:

es gibt da
http://www.thesycon.de/deu/usbio_de.shtml
http://libusb.sourceforge.net/download.html
http://javax-usb.org/
http://www.sun.com/download/products.xml?id=411be89d
Müller, Markus und Ehmer, Christian : „USB für Alle I“ in: Elektor 
Ausgabe 10/02, Elektor Verlag,
Müller, Markus und Ehmer, Christian : „USB für Alle II“ in: Elektor 
Ausgabe 11/02, Elektor Verlag,

Programmbeispiel einer Wrapper-Klasse:
public class JNIWrapper {
static {
System.loadLibrary("USBDRV");
}
public JNIWrapper() {
}
private native void open_method();
private native void close_method();
private native int readRam_method(int adresse);
private native void writeRamBytes_method(int startadresse,int 
numberofbytes, byte[]
bytes);
public void open()
{
open_method();
}
public void close()
{
close_method();
}
public int readRam(int adresse)
{
return readRam_method(adresse);
}
public void writeRamBytes(int startadresse,int numberofbytes, byte[] 
bytes)
{
writeRamBytes_method(startadresse,numberofbytes,bytes);
}
public void reset() {
byte eins[] = { (byte)1 };
writeRamBytes_method (0x7f92, 1, eins);
}
public void prg_start() {
byte _null[] = { (byte)0 };
writeRamBytes_method (0x7f92, 1, _null);
}
}
Ich bin speziell auf der Suche nach einer Möglichkeit mit Java unter 
Windows XP mir die übertragenden Daten anzuschauen. Wenn jemand eine 
Lösung gefunden hat bitte mich kontaktieren

von kai (Gast)


Lesenswert?

isch doch ein Cypress 7c68013, und warum Bulk wenns schon alles gibt ?
oder fehlt was ?

mfg
kai

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.