Forum: PC-Programmierung FTDI und plattformunabhängige Programmierung


von Gastino G. (gastino)


Lesenswert?

Ich bin gerade auf der Suche nach einer plattformunabhängigen Lösung zum 
Zugriff auf FTDI-Geräte von PC-Software unter Linux und Windows.

Eine Möglichkeit ist ja der Zugriff über virtuelle COM-Ports, aber ich 
suche nach einer Lösung für den direkten Zugriff (D2XX).

Bekannt ist mir die D2XX-Lösung unter Windows, die auf der FTDI-Webseite 
angebotene Linux-Lösung aus dem Jahr 2008 riecht mit ihrer WinTypes.h 
(da gibt es schon kollidierende Definitionen für DWORD und UDWORD in der 
sqltypes.h meines wxWidgets-Projekts) und der vorkompilierten Library 
riecht schon sehr stark nach massiven Problemen bei der Nutzung auf 
verschiedenen Linux-Maschinen.

Der Zugriff über die libftdi 
(http://www.intra2net.com/en/developer/libftdi/) scheint keine unter 
Windows nutzbare Lösung zu sein. Abgesehen stellt sich  bei der Lib so 
nebenbei die Frage, wie ich mir alle FTDI-Geräte am PC auflisten kann 
(vergleichbar zu FT_CreateDeviceInfoList und FT_GetDeviceInfoList der 
D2XX-Lib), denn die Funktion "ftdi_usb_find_all" erwartet Vendor- und 
Produkt-ID, nach der sie suchen soll (weiß ich aber nicht, kann ganz 
verschieden sein).

Nun ja, zurück zur eigentlichen Frage:
Gibt es noch andere Möglichkeiten, ohne für die jeweilige Plattform den 
Zugriff auf die FTDI-Geräte neu implementieren zu müssen?

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

grundsätzlich sind Linux und Windows gerade inm Treiberbereich viel zu 
verschieden. Du könntest dir höchstens für eigene Zwecke eine ganz 
eigene abstrakte Klasse schreiben, aber schon beim open musst du wohl 
Windows und Linux Code völlig getrennt schreiben. Und dir eine eigene 
Namensstategie ausdenken, denn wenn deine Schnittstellen einheitlich 
COM2 usw. heissen, wirst du im Linux-Lager gelyncht. Deshalb auch nur 
für eigene Zwecke - sowas für die Allgemeinheit zu schreiben grenzt an 
Selbstmord, daher denke ich auch, wirst du nichts Fertiges finden.

Gruss Reinhard

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Eine möglichkeit wäre per JNI eine Java abstraktionsschicht zu 
definieren und für das jeweilige Zielsystem eine passende DLL/SO zu 
stricken.
Hatte ich auch mal angedacht nur magels FTDI bisher noch nicht 
umgesetzt.
Jetzt hab ich zwar prinzipiell ein Versuchskaninchen rumliegen aber 
momentan nicht so sher viel Zeit.. ;)

von Christian R. (supachris)


Lesenswert?

Man könnte auch die LibUSB bemühen, ist allerdings dann etwas 
aufwendiger. Aber die LibUSB Funktionen sind unter Linux und Windows 
nahezu gleich. Allerdings müsste man dazu in Erfahrung bringen, in 
welche Endpoints was zu schreiben ist, damit man die gleichen Funktionen 
erhält, wie bei der FTDI Lib.

von Gastino G. (gastino)


Lesenswert?

Hmm, scheint also so, als hätte ich da nichts übersehen und eine 
halbwegs gleiche Programmierung ist da nicht möglich. Schade, zumindest 
FTDI hätte es ja möglich machen können, über Abstraktionsschichten 
dieselbe Treiberschnittstelle zu bieten. :o(

Na mal sehen, was ich da so treibe. Wahrscheinlich werde ich dann wohl 
die Programmteil, der direkt auf die Treiber zugreift, kapseln. 
Allerdings einfach in C++.

Zur libusb: Inwiefern könnte die mir weiterhelfen? Das hieße ja, den 
FTDI-Treiber nachzuprogrammieren. Allerdings fehlen da doch sicher die 
entsprechenden Informationen von FTDI oder kennt da jemand eine 
entsprechende Application Note?

von Axel J. (axeljaeger)


Lesenswert?

Zumindest der Treiber für MacOS D2XX basiert auf libusb. Der liegt ja 
auch im Quelltext vor. Ich nehme an, unter Linux wird das ganz ähnlich 
sein. Ich bin hier grad dabei, einen Treiber neu zu schreiben, der 
bisher nackt mit libusb auf den FTDI-Chip zugegriffen hat, aber jetzt 
Ärger macht, weil die "alte" libusb 0.17 nicht auf Mac mit 64 bit baut. 
Mein Plan ist, über D2XX etwas zu bekommen, was sowohl für Mac gepflegt 
wird, als auch unter windows geht (da wird mir libusb recht sicher auch 
ärger machen).

Zu der Sache mit DWORD usw: Ich werd den Kram so kapseln, dass diese 
Header jeweils nur in einem einzigen CPP-file eingebunden werden. Sind 
ja Windows-Typen und damit will ich im Hauptprogramm nix zu tun haben.

von Gastino G. (gastino)


Lesenswert?

Ich habe nochmal in das Verzeichnis des libftd2xx-Treibers für Windows 
hineingeschaut. Quellen gibt es da leider keine, aber der basiert auch 
auf der libusb. Befindet sich der Quelltext in der *.dmg-Datei, die auf 
der FTDI-Webseite angeboten wird? Mit der kann ich leider nichts 
anfangen...

Axel Jäger schrieb:
> Zu der Sache mit DWORD usw: Ich werd den Kram so kapseln, dass diese
> Header jeweils nur in einem einzigen CPP-file eingebunden werden. Sind
> ja Windows-Typen und damit will ich im Hauptprogramm nix zu tun haben.

Klingt vernünftig.

von Axel J. (axeljaeger)


Lesenswert?

In dem DMG sind die Sourcen für den Mac-Treiber, weil man den neu 
kompilieren muss, wenn man eigene Vendor/Device-IDs haben will. Unter 
Windows müsstest du dazu ja das inf-file anpassen. Wenn aber der 
Windows-Treiber auch auf libusb basiert, heißt das ja, dass ich, wenn 
ich VID/PID verändere, den neu signieren muss, zumindest für 64 bit. Das 
sind ja keine schönen Neuigkeiten für mich...

Schau mal nach, wie die sich vorstellen, dass man eine angepasste 
Version für andere VID/PID unter Windows machen soll. Da müsste es dann 
entweder die Source geben oder einen anderen nicht minder spannenden 
Ansatz.

von Wolfgang R. (portside)


Lesenswert?

Gastino G. schrieb:
> Ich habe nochmal in das Verzeichnis des libftd2xx-Treibers für Windows
> hineingeschaut. Quellen gibt es da leider keine, aber der basiert auch
> auf der libusb. Befindet sich der Quelltext in der *.dmg-Datei, die auf
> der FTDI-Webseite angeboten wird? Mit der kann ich leider nichts
> anfangen...
>

Für die FTD2XX gibts für keine Plattform Quellcode von FTDI, ist und 
bleibt Black Box.
Wenn man aber auf die wenigen Windows typischen Funktionen für 
Dateizugriff  der Win FT2XX.DLL verzichtet sind die Funktionsaufrufe 
plattformunabhänig.

Zumindest ist es möglich für FTD2XX eine Winelib zu erstellen der 
Windows Programme unter Wine vollen Zugriff auf die FTDI Chips erlaubt 
siehe
http://coolla.freeunix.net/winelib.html

D2XX geht in Linux über libusb Kernelzugriff und in Windows über FTDI 
sys Treiber. MAC???.

Libusb und libusb-win32 sind keine gute Wahl. Die Windows Version hat 
Erweiterungen wie  asynchron IO und basiert auf uralt libusb.

Benutzt man die FTDI D2XX Treiber hat man noch den vorteil dass Win64 
Treiber vorhanden sind.

von Gastino G. (gastino)


Lesenswert?

Wolfgang R. schrieb:

> Zumindest ist es möglich für FTD2XX eine Winelib zu erstellen der
> Windows Programme unter Wine vollen Zugriff auf die FTDI Chips erlaubt
> siehe
> http://coolla.freeunix.net/winelib.html

Ich will ja selber für Windows und Linux (nativ) meine Software mit 
Hilfe von wxWidgets entwickeln (bzw. tue das ja bereits). Hauptplattform 
ist dabei Linux, ein Windows-Programm dann unter Wine laufen zu lassen, 
fällt daher aus. Lieber lasse ich dann die Windows-Version weg, wenn der 
Portierungsaufwand zu groß wird.

> D2XX geht in Linux über libusb Kernelzugriff und in Windows über FTDI
> sys Treiber. MAC???.

D2XX unter Linux macht leider aufgrund des Alters und der 
Wintypes-Schweinereien, die mir prompt um die Ohren geflogen sind, 
keinen guten Eindruck. Mal sehen, ob ich das sauber kapseln kann, damit 
es keine Kollisionen mit bereits definierten Datentypen gibt.

von Wolfgang R. (portside)


Angehängte Dateien:

Lesenswert?

> D2XX unter Linux macht leider aufgrund des Alters und der
> Wintypes-Schweinereien, die mir prompt um die Ohren geflogen sind,
> keinen guten Eindruck. Mal sehen, ob ich das sauber kapseln kann, damit
> es keine Kollisionen mit bereits definierten Datentypen gibt.

Ich habe zum übersetzen und binden der winelib unter Linux den ganzen 
WIN Schwachsinn in ftd2xx.h auskommentiert. Übersetzt ohne Probleme.

von Gastino G. (gastino)


Lesenswert?

Wolfgang R. schrieb:
> Ich habe zum übersetzen und binden der winelib unter Linux den ganzen
> WIN Schwachsinn in ftd2xx.h auskommentiert. Übersetzt ohne Probleme.

Bist Du sicher, dass es da nicht irgendwo still und leise knirscht, weil 
FTDI vielleicht von bestimmten Datentypen ausgeht?

von Wolfgang R. (portside)


Lesenswert?

Die Datentypen der Funktionsaufrufe sind alle in Linux schon definiert. 
Da gibts hier ja nur drei Typen DWORD LPVOID LPDWORD; #include 
<stdarg.h> und gut ist es.
Und die Typen dienen ja nur zu Kontrolle des Programmierers, damit keine 
falschen Typen übergeben werden.

von Gastino G. (gastino)


Lesenswert?

Wolfgang R. schrieb:
> Die Datentypen der Funktionsaufrufe sind alle in Linux schon definiert.
> Da gibts hier ja nur drei Typen DWORD LPVOID LPDWORD; #include
> <stdarg.h> und gut ist es.
> Und die Typen dienen ja nur zu Kontrolle des Programmierers, damit keine
> falschen Typen übergeben werden.

Ganz so einfach ist es ja nicht. Die Datentypen sind in der WinTypes.h 
teilweise unterschiedlich zu den Linux-Typen definiert. Sonst gäbe es ja 
gar kein Problem.
Das kommt damit einer Änderung der Datentypen an den Schnittstellen 
gleich und wir wissen ja nicht wirklich, ob das innerhalb der FTDI-Lib 
dazu führen kann, dass Informationen verloren gehen oder verfälscht 
werden.

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.