Forum: PC Hard- und Software LIBFTDI "device disconnected" - Kein brltty-Problem - Serial-Converter ft232bm


von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Hallo zusammen,

auf den ersten Blick mag das Problem ein "alt-bekanntes" sein.
Jedoch ist es das wohl nicht.

Ich versuche mit der libftdi in C einen FT232BM anzusprechen.
Die Lib gibt mir einige Grundlegende Funktionen hierfür.
U.A. ftdi_usb_open(&ftdic, 0x0403, 0x6001).

Das Problem: Sobald ich diesen Befehl ausführe bekomme ich in der syslog 
folgendes:

[ 4029.583531] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now 
disconnected from ttyUSB0
[ 4029.584526] ftdi_sio 5-2:1.0: device disconnected

Und dann ist logischerweise das Device nicht mehr ansprechbar.

brltty habe ich schon deinstalliert - das ist nicht das Problem.

Hat jemand einen Tipp?

Gruß,
 Tobias

von Gast (Gast)


Lesenswert?

Ich tippe mal: ftdi_sio (Kernelmodul) kriegt den
FT232 abgenommen, da sich jetzt libftdi darum
kümmert. Wäre also voll o.k.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Das wäre auch kein Problem, wenn ich wenigstens Daten senden oder 
empfangen könnte.
Jedoch kommen weder Daten am PC an, noch am µC sobald der ftdi_sio 
disconnected ist.

von Gast (Gast)


Lesenswert?

> Das wäre auch kein Problem, wenn ich wenigstens Daten senden oder
> empfangen könnte.

Das musst du dann mit den Funktionen der libftdi tun, das Device
als Gerät existiert dann halt nicht mehr.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Bevor wir hier weiter im Nebel stochern - ein wenig code...
1
struct ftdi_context ftdic;
2
  unsigned char buff[10] = "reset mcu\n";
3
  int ret;
4
  
5
  if(ftdi_init(&ftdic) != 0)
6
    printf("couldn't allocate read buffer: %s\n",ftdi_get_error_string(&ftdic));
7
  if(ftdi_usb_open(&ftdic,0x0403,0x6001) != 0)
8
    printf("Couldn't open USB: %s\n",ftdi_get_error_string(&ftdic));
9
  if(ftdi_set_baudrate(&ftdic,57600) != 0)
10
    printf("Couldn't set Baudrate: %s\n",ftdi_get_error_string(&ftdic));
11
  if(ftdi_set_line_property(&ftdic,BITS_8,STOP_BIT_1,NONE) != 0)
12
    printf("Setting line property failed : %s\n",ftdi_get_error_string(&ftdic));
13
  
14
  ret = ftdi_write_data_async(&ftdic,buff,10);
15
  if(ret > 0)
16
    printf("Number of written bytes: %d\n",ret);
17
  
18
  if(ftdi_usb_close(&ftdic) != 0)
19
    printf("Couldn't close USB: %s\n",ftdi_get_error_string(&ftdic));
20
  ftdi_deinit(&ftdic);

Ich sende "reset mcu\n". Der µC sollte diesen String erkennen und eine 
Funktion aufrufen. Alle Zeichen die am UART eingehen werden zusätzlich 
auf einem LCD ausgegeben. Mit dem "serial port terminal" geht das auch. 
Ich möchte aber meine eigene Applikation dafür haben.

Am ftdi sind auch RX/TX-Leds die den Datenverkehr anzeigen.
Die Empfangs-Led leuchtet kurz einmal auf, wenn ich das Programm das 
erste mal starte, beim zweiten Start sagt die auch nichts mehr.

Gruß,
 Tobias

von Gast (Gast)


Lesenswert?

Hast du simple.c von intra2net probiert?

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Habe ich, selbes Problem...
interessanter Weise ist dieses Problem erst im Laufe eines Abends 
entstanden.
Irgendwo ist etwas "verstellt" wie es scheint.

die simple.c lief nämlich zu Anfang noch.

von Gast (Gast)


Lesenswert?

Dann sind es wohl die Zugriffsrechte. Schau mal in
die udev-Konfig oder probiere die Programme mit sudo.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Wenn ich den FTDI anstecke kommt in der syslog folgendes:
1
Nov 24 19:59:39 notebook kernel: [11514.800365] usb 5-2: new full speed USB device using uhci_hcd and address 14
2
Nov 24 19:59:39 notebook kernel: [11514.981283] usb 5-2: configuration #1 chosen from 1 choice
3
Nov 24 19:59:39 notebook kernel: [11514.982770] ftdi_sio 5-2:1.0: FTDI USB Serial Device converter detected
4
Nov 24 19:59:39 notebook kernel: [11514.983077] ftdi_sio: Detected FT232BM
5
Nov 24 19:59:39 notebook kernel: [11514.983466] usb 5-2: FTDI USB Serial Device converter now attached to ttyUSB0


Wenn ich das simple.c - Programm starte (auch als Sudo), dann kommte 
das:
1
Nov 24 20:00:11 notebook kernel: [11546.365254] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
2
Nov 24 20:00:11 notebook kernel: [11546.365545] ftdi_sio 5-2:1.0: device disconnected

Und ich kann mir nicht erklären wieso...

von Gast (Gast)


Lesenswert?

> Und ich kann mir nicht erklären wieso...

Die libftdi ist so freundlich, den Kerneltreiber für dich
zu entladen, da sie das Device selbst übernimmt. Sonst
gäbe es Probleme, weil beide Treiber sich für zuständig
halten. Mit anderen Treibern (z.B. von FTDI) bleibt
es dem Nutzer selbst überlassen ftdi_sio zu entfernen.

Brauchst du eigentlich libftdi? Einen UART kann man einfacher
über eben ftdi_sio und termios ansteuern.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Naja, was heißt "brauchen". Wenn es möglich ist, dann wäre es schon 
schön, wenn ich mit der libftdi arbeiten könnte, da diese Lib einige 
Vorteile bietet. z.B. die volle Geschwindigkeit...

Ok, wenn die libftdi den ftdi_sio aus dem Kernel schmeißt, dann ist das 
wohl so Absicht.
Aber wieso kann ich dann als root und mit geänderten Zugriffsrechten mit 
udev-Regel keine Daten senden oder Empfangen?

Das ist mir nicht klar. Zumal die simple.c schon einmal lief (gestern 
nachmittag). Und dann plötzlich nicht mehr...

von Gast (Gast)


Lesenswert?

Da gibt es mehrere Möglichkeiten:

Die Installation der libftdi wurde durch einen hilfreichen
Prozess beim Booten entfernt. Prüfen mit
"sudo ldconfig -v |grep libftd*"

Der ftdi_sio stört doch noch. Mit rmmod nach Anstecken des
FT232 erledigen.

Sagt /var/log/messages nichts zusätzliches?

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

"sudo ldconfig -v |grep libftd*"
--------------------------------
libftdi.so.1 -> libftdi.so.1.14.0


ftdi_sio habe ich schon mehrfach zum testen mit rmmod entfernt.


/var/log/messages liefert im Grunde selbiges wie syslog...
1
Nov 24 20:45:04 tjohn-notebook kernel: [14239.576158] usb 5-2: new full speed USB device using uhci_hcd and address 20
2
Nov 24 20:45:04 tjohn-notebook kernel: [14239.753605] usb 5-2: configuration #1 chosen from 1 choice
3
Nov 24 20:45:04 tjohn-notebook kernel: [14239.846146] usbserial: USB Serial support registered for FTDI USB Serial Device
4
Nov 24 20:45:04 tjohn-notebook kernel: [14239.846847] ftdi_sio 5-2:1.0: FTDI USB Serial Device converter detected
5
Nov 24 20:45:04 tjohn-notebook kernel: [14239.847587] ftdi_sio: Detected FT232BM
6
Nov 24 20:45:04 tjohn-notebook kernel: [14239.847923] usb 5-2: FTDI USB Serial Device converter now attached to ttyUSB0
7
Nov 24 20:45:04 tjohn-notebook kernel: [14239.848230] usbcore: registered new interface driver ftdi_sio
8
Nov 24 20:45:04 tjohn-notebook kernel: [14239.848235] ftdi_sio: v1.4.3:USB FTDI Serial Converters Driver
1
Nov 24 20:45:20 tjohn-notebook kernel: [14255.594094] usbcore: deregistering interface driver ftdi_sio
2
Nov 24 20:45:20 tjohn-notebook kernel: [14255.594546] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
3
Nov 24 20:45:20 tjohn-notebook kernel: [14255.594576] ftdi_sio 5-2:1.0: device disconnected
4
Nov 24 20:45:20 tjohn-notebook kernel: [14255.595768] usbserial: USB Serial deregistering driver FTDI USB Serial Device

Irgendwie werde ich nicht schlau aus der Sache, dass ich bereits gestern 
Nachmittag ein testprogramm am Laufen hatte... verzweifel

von Gast (Gast)


Lesenswert?

Langsam werde ich auch ratlos.

Schau mal in /proc/bus/usb/devices. Dort findest du
den FT232 und eine Angabe zum verwendeten Treiber.
Nach dem Entfernen von ftdi_sio sollte das [none]
sein. Wenn du simple.c mit einer Endlosschleife
am Ende laufen lässt, solltest du da den zuständigen
Treiber finden.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Der folgende Block ist bei allen 3 Tests gleich.
1
T:  Bus=05 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
2
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
3
P:  Vendor=0403 ProdID=6001 Rev= 4.00
4
S:  Manufacturer=FTDI
5
S:  Product=USB <-> Serial
6
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 90mA
7
I: Individuell - je nach Treiber
8
E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
9
E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms

Hier wurde ftdi_sio geladen. simple.c wurde nicht gestartet
1
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
wie man sieht, ist der Treiber ftdi_sio geladen.

Beim nächsten Test wurde ftdi_sio nicht geladen. simple.c nicht 
gestartet
1
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
Hier sieht man: Driver "none". Wie es sein soll.

Beim letzten Test habe ich ftdi_sio nicht geladen und simple.c ist in 
der endlosschleife.
1
I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbfs
Hier wurde der Treiber usbfs geladen. Auch wie es sein soll.



Vielleicht ist es ja doch ein Rechte-Problem.
Wie kann ich das überprüfen und eventuell anpassen?

Gruß,
 Tobias

von Gast (Gast)


Lesenswert?

Das sieht wirklich korrekt aus. Wenn es ein
Rechteproblem wäre, sollten die Programme mit sudo
funktionieren. Ich habe ganz plump die permissions
in /etc/udev/rules.d/40-permission.rules unter
Subsystem=usb_device auf 06660 gestellt.

von Gast (Gast)


Lesenswert?

Sorry, nochmal wie oben aber: Mode=0666

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Genau das habe ich vor 2 min auch gemacht. Mal testen...
MODE="0666", GROUP="dialout"

in der Gruppe dialout bin ich. Zusätzlich auch in plugdev, in der man 
eigentlich immer ist.

von Gast (Gast)


Lesenswert?

Achso, auch usbfs muss mit devmode=0666 gemountet sein.
Sollte aber alles für root keine Rolle spielen.

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Kommt nichts, und wird nichts gesendet. Auch nicht als root.
Jetzt bin ich am Ende meines Lateins...

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Hat noch jemand eine Idee?

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Könnte das Problem wohl daran liegen, dass ich RTS/CTS und DTR/DSR 
völlig unbeschaltet gelassen habe?
Irgendwo habe ich gelesen, dass der FT232 nichts macht wenn RTS/CTS 
nicht korrekt beschaltet ist.

Kann ich RTS/CTS einfach "kurzschließen" um einen Hardware-Handshake zu 
"vorzugaukeln" ?

Besten Gruß,
 Tobias

von Tobias J. (tobiasjohn) Benutzerseite


Lesenswert?

Tatsächlich funktioniert es wenn ich RTS und CTS zusammenschließe.
Die Daten werden gesendet und vom µC korrekt verarbeitet.

Jetzt soll der µC etwas zurücksenden. Das senden geht auch (das zeigt 
mir eine LED am ft232bm).
Leider kann ich mit ftdi_read_data die Daten nicht einlesen. Es werden 
immer 0 Byte empfangen....

hat dazu jemand eine Idee?

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.