Forum: PC-Programmierung Richtiges FTDI Gerät finden unter Linux.


von Gustl B. (-gb-)


Lesenswert?

Hallo,

also ich habe hier einen FT232H auf dem Modul "UM232H" und einen FT232R. 
Beide hängen am gleichen Rechner und sollen nun in einem C Programm 
geöffnet werden.

Unter Windows verwende ich die D2XX Funktion auf alle gefundenen Geräte 
an

FT_GetDeviceInfoDetail

und die meldet mir dann z .B. die Description als String zurück oder 
auch die Seriennummer. Und dann weiß ich dass z. B. Gerät 1 auf 
Description "UM232H" und kann das passend öffen

ftStatus = FT_Open(1, &FT232H_ftHandle);

und alles ist gut.

Unter Linux (Ubuntu) meldet

FT_GetDeviceInfoDetail

nichts sinnvolles zurück. Also weder Description noch Seriennummer.
Aber gut, ich kenne ja die Seriennummer, die habe ich mit FT_Prog 
gesetzt "12345678" und wird unter Linux auch mit lsusb -v korrekt 
angezeigt.

Jetzt könnte man doch

ftStatus = 
FT_OpenEx("12345678",FT_OPEN_BY_SERIAL_NUMBER,&FT232H_ftHandle);

verwenden und alles ist gut. Aber nein, geht nicht wieso auch immer. 
Auch

ftStatus = FT_OpenEx("UM232H",FT_OPEN_BY_DESCRIPTION,&FT232H_ftHandle);

geht nicht.

Wieso ist das so? Und wie finde ich mit C heraus welches Gerät welches 
ist?

Vielen Dank!

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

Gustl B. schrieb:
> Und wie finde ich mit C heraus welches Gerät welches
> ist?

ich verwende dafür UDEV. Da kann man auch darauf reagieren, wenn ein 
Gerät neu erkannt wird.

Über UDEV bekommt man auch die Seriennummer raus.

von Jim M. (turboj)


Lesenswert?

Gustl B. schrieb:
> Unter Linux (Ubuntu) meldet
>
> FT_GetDeviceInfoDetail
>
> nichts sinnvolles zurück.

Mal mit "sudo ..." aufrufen, das könnte Root Rechte benötigen.

Falls das dann funktioniert kann man via UDEV Regel auch die 
Zugriffsrechte auf das USB Device ändern.

von Gustl B. (-gb-)


Lesenswert?

Also als root lasse ich das sowieso laufen, klar. Wenn nur ein Gerät 
angeschlossen ist, also z. B. der UM232H als Gerät 0 dann kann ich den 
auch prima unter Linux mit

ftStatus = FT_Open(0, &FT232H_ftHandle);

öffnen und davon lesen. Ich möchte ein Programm schreiben dass ohne dass 
ich am Linux was basteln muss von selber die Geräte findet und richtig 
zuordnet. Unter Windows funktioniert das auch.

von Peter II (Gast)


Lesenswert?

Gustl B. schrieb:
> Ich möchte ein Programm schreiben dass ohne dass
> ich am Linux was basteln muss von selber die Geräte findet und richtig
> zuordnet. Unter Windows funktioniert das auch.

dann verwende doch udev, dafür ist das da.

von Gustl B. (-gb-)


Lesenswert?

Das kenne ich noch nicht, kann man das aus C heraus ansprechen? Muss man 
da irgendwas im Linux einstellen?

Edit:
Was würde mir udev denn liefern? Also wie kann ich dann das FTDI Gerät 
öffnen? Das geht doch dann wieder mit dem D2XX von FTDI.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Gustl B. schrieb:
> Das kenne ich noch nicht, kann man das aus C heraus ansprechen?
ja, ist ein Framework was auch eine libudev anbietet

> Muss man da irgendwas im Linux einstellen?
kann ich nicht pauschal sagen, auf einen linuxsystemen war es immer 
vorhanden.

Leider muss man sich die Doku in Internet zusammensuchen.

http://www.signal11.us/oss/udev/
ftp://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/api-index-fu 
ll.html

von Peter II (Gast)


Lesenswert?

Gustl B. schrieb:
> Was würde mir udev denn liefern? Also wie kann ich dann das FTDI Gerät
> öffnen? Das geht doch dann wieder mit dem D2XX von FTDI.

die Frage UDEV welche Geräte vorhanden sind die ein tty  anbieten, dann 
bekommst du eine Liste der Geräte. Diese kann man durchgehen und kann 
die Eigenschaften abfragen. Dann bekommst du auch den Gerätenamen wie du 
es Ansprechen kannst.

von Gustl B. (-gb-)


Lesenswert?

Wenn ich das richtig sehe dann liefert mir udev doch auch nur die Werte 
die mir auch lsusb -v liefert. Aber wie öffne ich das FTDI Gerät wenn 
ich z. B. die Seriennummer schon kenne? Das ist es ja was nicht 
funktioniert. Ich kenne die Details des Gerätes aber kann es nicht 
öffnen.

von Peter II (Gast)


Lesenswert?

Gustl B. schrieb:
> Wenn ich das richtig sehe dann liefert mir udev doch auch nur die Werte
> die mir auch lsusb -v liefert. Aber wie öffne ich das FTDI Gerät wenn
> ich z. B. die Seriennummer schon kenne?

du listest dir alle Geräte auf uns geht die Liste durch, fragst die 
Seriennumer ab und vergleichst sie. Wenn die passenden gefunden öffnest 
du sie.

von Gustl B. (-gb-)


Lesenswert?

AHHHHHHHH verdammt, ich hab das Problem behoben:

Ich muss zuerst mit

rmmod ftdi_sio

den standardmäßig geladenen Treiber entfernen. Oh weia ...

Das funktioniert jetzt:

ftStatus = 
FT_OpenEx("12345678",FT_OPEN_BY_SERIAL_NUMBER,&FT232H_ftHandle);

Trotzdem vielen Dank!

von Horst (Gast)


Lesenswert?

udev kann dir zB dann /dev/ttyUM232H anlegen.

von Jim M. (turboj)


Lesenswert?

Gustl B. schrieb:
> AHHHHHHHH verdammt, ich hab das Problem behoben:
>
> Ich muss zuerst mit
>
> rmmod ftdi_sio
>
> den standardmäßig geladenen Treiber entfernen. Oh weia ...

Auch dafür könnte man UDEV einsetzen: Mit einer UDEV Regel kann man IMHO 
verhindern das sich ftdi_sio das USB Device greift.

von Gustl B. (-gb-)


Lesenswert?

Das stimmt, aber ich will möglichst nichts an dem Linux konfigurieren 
müssen.

Jetzt läuft auch alles, nur es ist eine Ecke langsamer als unter 
Windows. Mit den gleichen Einstellungen für

T_SetUSBParameters
FT_SetLatencyTimer

und auch gleicher Blockgröße die gelesen werden soll.

von Axel S. (a-za-z0-9)


Lesenswert?

Gustl B. schrieb:
> AHHHHHHHH verdammt, ich hab das Problem behoben:

Jein

> Ich muss zuerst mit
> rmmod ftdi_sio
> den standardmäßig geladenen Treiber entfernen. Oh weia ...

Ich glaube, dein Problem sitzt tiefer. Du verwendest da irgendeine 
ranzige Library von FTDI, stimmts? Das macht man unter Linux nicht. 
Schon gar nicht, wenn es sich um einen simplen CDC handelt. Da freut man 
sich, daß das Kernelmodul die Details kapselt und daß man den seriellen 
Port genauso wie jeden anderen als character device ansprechen kann.

Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder 
direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser) 
man nimmt libusb dafür. Das geht dann auch plattformübergreifend.

von Peter II (Gast)


Lesenswert?

Axel S. schrieb:
> Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder
> direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser)
> man nimmt libusb dafür. Das geht dann auch plattformübergreifend.

Windows und BSD kennen kein LibUSB - damit ist plattformübergreifend 
etwas übertrieben.

von Gurkenscheiße (Gast)


Lesenswert?

Gustl B. schrieb:
> Das stimmt, aber ich will möglichst nichts an dem Linux konfigurieren
> müssen.

Jede Anwendung soll also seine eigene Gurkenscheiße mixen? Ist das 
wirklich zielführend, anstatt einen Mechanismus für alle Anwendungen 
zu nutzen?

von Gustl B. (-gb-)


Lesenswert?

Axel S. schrieb:
> Ich glaube, dein Problem sitzt tiefer. Du verwendest da irgendeine
> ranzige Library von FTDI, stimmts?

Ja natürlich weil ich der Auffassung bin, dass der Hersteller seine 
Hardware am besten kennt und die besten Treiber bietet.

Axel S. schrieb:
> Das macht man unter Linux nicht.
> Schon gar nicht, wenn es sich um einen simplen CDC handelt.

Das ist denn ein CDC und wieso macht man das nicht?

Axel S. schrieb:
> Details vom USB-Layer wie Vendor oder Seriennummer greift man entweder
> direkt aus dem sysfs ab (/sys/bus/usb/devices/*/serial) oder (besser)
> man nimmt libusb dafür. Das geht dann auch plattformübergreifend.

Das ist kein USB Serial. Ich nutze den Synchronen FIFO Modus.

Gurkenscheiße schrieb:
> Jede Anwendung soll also seine eigene Gurkenscheiße mixen?

Was willst Du damit genau fragen?
Wenn der Hersteller eine Lib mitliefert und die für mehrere 
Betriebsysteme anbietet, dann wäre es wünschenswert wenn die trotzdem 
immer gleich anzusprechen ist. Und ja, das ist sie auch einigermaßen, 
aber eben nicht ganz.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Gustl B. schrieb:
> weil ich der Auffassung bin, dass der Hersteller seine
> Hardware am besten kennt und die besten Treiber bietet.
Verabschiede dich von dem Gedanken :)

Richtig würde es heißen:
"...dass der Hersteller seine Hardware am besten kennen sollte..." <- 
dass ist aber nur sehr selten der Fall. Selbiges gilt auch und gerade 
für Software.

Peter II schrieb:
> Windows und BSD kennen kein LibUSB
Keine Ahnung in welchem Jahr du stehen geblieben bist...
http://libusb.info/
1
What platforms are supported?
2
3
Linux, OS X, Windows, Windows CE, Android, OpenBSD/NetBSD, Haiku.

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.