mikrocontroller.net

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


Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Horst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
udev kann dir zB dann /dev/ttyUM232H anlegen.

Autor: Jim M. (turboj)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Axel S. (a-za-z0-9)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gurkenscheiße (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Gustl B. (-gb-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kaj G. (Firma: RUB) (bloody)
Datum:

Bewertung
0 lesenswert
nicht 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/
What platforms are supported?

Linux, OS X, Windows, Windows CE, Android, OpenBSD/NetBSD, Haiku.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.