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
Ich tippe mal: ftdi_sio (Kernelmodul) kriegt den FT232 abgenommen, da sich jetzt libftdi darum kümmert. Wäre also voll o.k.
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.
> 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.
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
Hast du simple.c von intra2net probiert?
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.
Dann sind es wohl die Zugriffsrechte. Schau mal in die udev-Konfig oder probiere die Programme mit sudo.
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...
> 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.
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...
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?
"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
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.
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
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.
Sorry, nochmal wie oben aber: Mode=0666
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.
Achso, auch usbfs muss mit devmode=0666 gemountet sein. Sollte aber alles für root keine Rolle spielen.
Kommt nichts, und wird nichts gesendet. Auch nicht als root. Jetzt bin ich am Ende meines Lateins...
Hat noch jemand eine Idee?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.