Forum: PC-Programmierung FTDI USB Programmierung mit C unter Linux


von Marc S. (lun27)


Lesenswert?

Hallo,

ich habe mich vor Kurzem auch mal gewagt in die Welt der Mikrocontroller 
einzutauchen und bin demnach noch ein ziemlicher Grünschnabel. Ich hatte 
mir ein kleines Experimentierset gekauft, das mir bei diesem Weg helfen 
sollte. Allerdings ist dieses Set vollkommen auf MS Windows ausgelegt 
und die zugehörigen Source Codes wurden auch noch in VB geschrieben. Nun 
möchte ich das ganze aber unter Linux in C programmieren. Also habe ich 
versucht die ersten Beispielprogramme umzuschreiben, habe mir von FTDI 
die Linux-Samples angesehen und mich an die Referenzen des FTDI D2XX 
Programmer's Guide gehalten. Der D2XX Treiber für den FT232R ist 
natürlich auch installiert. Das Gerät wird also unter Linux erkannt und 
mein erster Programmierversuch funktioniert auch teilweise schon, leider 
aber nicht vollständig und nun weiß ich nicht weiter. Vielleicht könnt 
ihr mir da ja etwas unter die Arme greifen. Hier erstmal der Quelltext:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include "ftd2xx.h"
4
5
int main() {
6
   FT_STATUS ftStatus;
7
   DWORD numDevs = 0; // first device
8
   char Buffer[64]; // more than enough room
9
10
   ftStatus = FT_ListDevices(&numDevs, NULL, FT_LIST_NUMBER_ONLY);
11
   if (ftStatus == FT_OK) {
12
      printf("Number of connected FTDI devices: %ld\n", numDevs);
13
   }
14
   else {
15
      printf("Error: FT_ListDevices(%ld)\n", ftStatus);
16
      return 1;
17
   }
18
19
   ftStatus = FT_ListDevices((PVOID)devIndex, Buffer, FT_LIST_BY_INDEX | FT_OPEN_BY_SERIAL_NUMBER);
20
   if (ftStatus == FT_OK) {
21
      printf("Serialnumber: %s\n", Buffer);
22
   }
23
   else {
24
      printf("Error: FT_ListDevices(%ld)\n", ftStatus);
25
   }
26
27
   char *BufPtrs[3]; // pointer to array of 3 pointers
28
   char Buffer1[64]; // buffer for description of first device
29
   char Buffer2[64]; // buffer for description of second device
30
31
   BufPtrs[0] = Buffer1;
32
   BufPtrs[1] = Buffer2;
33
   BufPtrs[2] = NULL;
34
35
   ftStatus = FT_ListDevices(BufPtrs, &numDevs, FT_LIST_ALL | FT_OPEN_BY_DESCRIPTION);
36
   if (ftStatus == FT_OK) {
37
      printf("OK\n");
38
   }
39
   else {
40
      printf("Error: FT_ListDevices(%ld)\n", ftStatus);
41
   }
42
43
   return 0;
44
}

Ist nichts spektakuläres, aber ein Anfang. In dem Quelltext befinden 
sich 3 Statusabfragen. Alleine die erste Abfrage, wie viele Geräte 
angeschlossen sind, funktioniert. Die letzten beiden geben immer einen 
Fehler aus, wo ftStatus den Wert 18 hat. Ich habe schon überall nach 
error codes gesucht, aber ich bin einfach nicht fündig geworden. Wäre 
schön, wenn ihr mir da in irgendeiner Weise helfen könntet.

Grüße, Marc

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

FT_STATUS ist wie folgt definiert:

FT_STATUS (DWORD)

FT_OK = 0
FT_INVALID_HANDLE = 1
FT_DEVICE_NOT_FOUND = 2
FT_DEVICE_NOT_OPENED = 3
FT_IO_ERROR = 4
FT_INSUFFICIENT_RESOURCES = 5
FT_INVALID_PARAMETER = 6
FT_INVALID_BAUD_RATE = 7
FT_DEVICE_NOT_OPENED_FOR_ERASE = 8
FT_DEVICE_NOT_OPENED_FOR_WRITE = 9
FT_FAILED_TO_WRITE_DEVICE = 10
FT_EEPROM_READ_FAILED = 11
FT_EEPROM_WRITE_FAILED = 12
FT_EEPROM_ERASE_FAILED = 13
FT_EEPROM_NOT_PRESENT = 14
FT_EEPROM_NOT_PROGRAMMED = 15
FT_INVALID_ARGS = 16
FT_NOT_SUPPORTED = 17
FT_OTHER_ERROR = 18

Das steht im Programmierhandbuch* auf Seite 96.

OK, FT_OTHER_ERROR ist als Fehlercode nicht wirklich hilfreich, aber 
definiert ist der Wert immerhin schon.


*) 
http://ftdichip.com/Documents/ProgramGuides/D2XX_Programmer%27s_Guide(FT_000071).pdf

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Hi Marc,

vielleicht solltest Dir mal die libftdi als Vergleich ansehen.

lg,
Michael

von Marc S. (lun27)


Lesenswert?

Hallo ihr beiden,

danke für eure Antworten. Den Fehlercode zu haben ist auf alle Fälle 
schon mal sehr schön. Jetzt heißt es nur noch rausbekommen, was der 
ominöse "OTHER_ERROR" sein könnte.

Das mit der libftdi habe ich allerdings nicht so recht verstanden. 
Welche Quelltext-Datei oder Dokumentation müsste ich mir da ansehen? 
Bisher habe ich immer die Linux-Samples mit den 
Dokumentations-Beispielen verglichen und diese dann nochmal mit dem aus 
dem Experimentierset mitgelieferten VB-Quellcode. Soweit ich den VB-Code 
richtig verstehe und die FTDI-Doku keine Fehler beinhaltet, müsste ich 
eigentlich alles richtig gemacht haben. Vielleicht nicht wirklich 
sinnvoll programmiert, aber immer noch richtig. Darum verstehe ich auch 
den Fehlercode nicht. Aber es scheint ja wieder irgend ein 
Ausnahmefehler zu sein. Ich werde mal den FTDI-Support anschreiben und 
schaun, ob der eine Idee bezüglich seines "OTHER_ERROR" Fehlercodes hat. 
:)

Trotzdem danke Jungs! Das erleichtert auf alle Fälle schon mal, denn ich 
dachte eigentlich, dass ich irgendwelche Typ-Fehler bzw. Pointer-Fehler 
gemacht hätte.

Grüße, Marc

von Holger (Gast)


Angehängte Dateien:

Lesenswert?

Diese Doku hat mit bei meinem FT245BM Teil gut geholfen.
Gruss Holger.

von Marc S. (lun27)


Lesenswert?

@Michael G.
Also ich habe jetzt nochmal gelesen und gesucht. Du meinst sicherlich 
die libFTDI von Thomas Jarosch 
(http://www.intra2net.com/en/developer/libftdi/index.php). Habe ich 
momentan noch keine Kopf für, aber werde ich mir noch ansehen.

@Holger
Diese Doku ist der Grund, dass ich überhaupt schon so "weit" bin.

Ich habe nun den FTDI Support kontaktiert, aber bisher kam noch keine 
Antwort. Unter Windows mit den VB-Beispielcodes läuft übrigens alles 
wunderbar. Ich habe so langsam das Gefühl, dass es an dem d2xx Treiber 
für Linux liegt. Ich habe zwar genau die Installationsanweisungen zur 
Installation des Treibers befolgt, aber ob er auch 100%ig funktioniert, 
das kann ich nicht wirklich beweisen. Dass er mir bei dem obigen 
Quelltext ein USB Gerät erkennt, das kann ja schon funktionieren, nur 
weil das Gerät angeschlossen ist, was aber nicht heißt, dass auch der 
Treiber für das Gerät funktioniert und verwendet werden kann. Liege ich 
damit halbwegs richtig? Kann mir denn jemand sagen wie ich unter Linux 
eindeutig überprüfen kann, ob dieser d2xx Treiber auch wirklich 
installiert wurde? Ich verwende die Linux Distribution Ubuntu 9.04 
(Jaunty Jackalope).

von Marc S. (lun27)


Lesenswert?

Also einen kleinen Nachweis habe ich gefunden, den Linux mir bzgl. 
meines FTDI USB Gerätes präsentiert.
Ich habe im Terminal einfach mal den Befehl "lsusb" verwendet und bekam 
eine Auflistung aller USB-Anschlüsse und deren angeschlossene Geräte. 
Darunter befand sich dann auch folgende Zeile:

Bus 002 Device 003: ID 0403:6001 Future Technology Devices 
International, Ltd FT232 USB-Serial (UART) IC

Aber reicht das schon als Beweis, dass der Treiber richtig installiert 
wurde? Da fällt mir eine, eigentlich ist das ja eine blöde Frage, weil 
ohne den Treiber könnte ich ja nicht die FT_ Funktionen ausführen. Hm, 
weiß wirklich nicht mehr weiter.
Habe auch mal versucht mit FT_Open das gerät zu öffnen, aber dann bekomm 
ich den Fehlercode 3, was so viel heißen soll, dass das Gerät sich nicht 
öffnen lässt. Wer hätte es gedacht...

Hat nicht noch jemand irgend eine Idee?

von Marc S. (lun27)


Lesenswert?

Soo, noch etwas...

In der Readme bezüglich der Installation des d2xx Treibers unter Linux 
steht folgendes:

Other problems will be related to the ftdi_sio driver loading -
1.you must unload this driver (and usbserial) if it is attached to your 
device ("rmmod ftdi_sio" and "rmmod usbserial"as root user).
2.Your PID/VID has not been included in the distribution.A PID of 0x6006 
and VID of
0x0403 should work as a temporary workaround.

Zugegebenermaßen kann ich weder mit der ersten noch mit der zweiten 
Fehlerursache etwas anfangen. Den zweiten Punkt verstehe ich gar nicht 
und bei Punkt 1 habe ich das so verstanden, dass sich "ftdi_sio" (der 
eigentliche Treiber oder?) mit "usbserial" (in Linux standardmäßig 
integriert?) beißt. Darum soll man sie entfernen, aber warum beide? Ich 
würde das gerne verstehen, denn mit dem Befehl "lsmod" im Terminal habe 
ich beide Module angezeigt bekommen, wobei das usbserial Modul von 
ftdi_sio verwendet wird. Möchte jetzt aber nicht sofort etwas einfach 
entfernen, wenn ich dann gar nicht weiß, was ich da gemacht habe.

Kennt sich damit jemand aus?
Ich wäre euch echt sehr dankbar.

von Guido (Gast)


Lesenswert?

Hallo Marc,

ob der Treiber das Gerät übernommen hat, kannst du unter /proc/bus/usb
nachsehen. Nach meiner Erfahrung wird ftd_sio automatisch removed, wenn
ftd2xx lädt. Das sind aber völlig unterschiedliche Treiber.

Die Treiber erkennen Geräte an der VID/PID-Kombination, die im
EEPROM am FTDI-Chip angegeben ist. Was da steht findest du auch in 
/proc.

Probleme gibt es eigentlich nur durch mangelnde Rechte. Wenn etwas nicht
klappt, immer erst mal mit sudo probieren.

Gruß, Guido

von Andy H. (vinculum) Benutzerseite


Lesenswert?

Möglicherweise hängt auch noch ein anderes Gerät mit FTDI-chip am 
Rechner? Ich habe hier einen Fall, wo der Parallelbetrieb bicht 
funktionert. Beide haben diesselbe PID/VID und können sich natürlich 
nicht einigen, welcher Treiber zu wem gehört-

von Marc S. (lun27)


Lesenswert?

Hallo Guido, hallo Andy,

das klingt alles sehr interessant. Nun kann ich mir langsam das Puzzel 
zusammensetzen, was es mit den ganzen Bezeichnungen auf sich hat. Habe 
mich mal im Verzeichnis proc.. umgeschaut. Das sieht für mich als 
Linux-Anfänger alles sehr hilfreich aus. Leider habe ich nach meinem 
kurzen Rüberschauen noch keinen Treiber zu dem FTDI Gerät gefunden und 
ebenso auch keine PID/VID's. Werde aber gleich noch etwas genauer 
schauen. Habe nur festgestellt, dass die jeweiligen Dateien alle Inhalt 
besitzen, was sich am Icon der Dateien erkennen lässt, aber wenn ich sie 
öffne, dann sind sie meist leer. Egal welche Datei ich im Verzeichnis 
proc.. öffne. Habe es auch schon mit Adminrechten probiert.

So, nun aber zum eigentlichen Thema und zur guten Nachricht. Es lag 
wirklich an den Adminrechten. Nun funktioniert mein kleines Programm 
fehlerfrei. Der Support von FTDI hat nun auch geantwortet und siehe da, 
ich solle es mal mit "sudo" probieren. ;) Hätte ich ja eigentlich auch 
selber drauf kommen können, so oft wie man Adminrechte unter Ubuntu 
braucht. Dass Adminrechte für einen Zugriff auf ein USB Gerät benötigt 
werden, kann ich zwar nicht nachvollziehen, aber soll mir recht sein.

@Guido
Danke dir auf alle Fälle für deine Hilfe! Sie hat mir nun endlich die 
Türen geöffnet. Das ganze hätte ich wohl noch eine halbe Ewigkeit ohne 
Adminrechte ausprobiert. ;)

@Andy
Von einem weiteren FTDI-Gerät ist mir nichts bekannt, aber trotzdem gut 
zu wissen, dass es den Fall mit den gleichen PID/VID's auch geben kann. 
Danke dir dafür.

Grüße, Marc

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.