pl2303 bei neueren Kernel - hat sich was geändert?

Welches Modul/Treiber für welche Hardware, Kernel compilieren...
Antworten
Kermit24
Beiträge: 312
Registriert: 29.04.2006 14:44:39

pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von Kermit24 » 22.10.2010 18:33:11

Hallo,
vor 3 Monaten habe ich meinen alten Debian-Server verschrottet und habe seitdem einen neuen am Laufen.
Auf dem alten lief ein selbstgebauter (vanilla) Kernel 2.6.19. Auf den neuen ein recht aktuelles squeeze mit debian eigenen Kernel 2.6.32.
Ich sende Daten an einen Mikrocontroller über ein PL2303 Interface (Handy-Datenkabel). Problem ist, dass das unter den aktuellen Kernel nicht mehr funktionieren will. Vor 3 Monaten lief das Interface noch problemlos auf dem alten Rechner, seitdem habe ich es nicht mehr genutzt.

Das Problem stellt sich folgendermaßen dar: pl2303 wird erkannt und /dev/ttyUSB0 wird erzeugt. Modul pl2303 ist geladen.

Code: Alles auswählen

[5459732.520099] usb 4-1: new full speed USB device using uhci_hcd and address 9
[5459732.670428] usb 4-1: New USB device found, idVendor=067b, idProduct=2303
[5459732.670446] usb 4-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[5459732.670787] usb 4-1: configuration #1 chosen from 1 choice
[5459732.674948] pl2303 4-1:1.0: pl2303 converter detected
[5459732.686862] usb 4-1: pl2303 converter now attached to ttyUSB0
So, mit einem Perlscript habe ich zuerst die Schnittstelle auf 9600 bps eingestellt. Und hier hängt es schon! Das habe ich über folgendes Systemkommando realisiert. Auch wenn ich es direkt auf der Konsole eingebe (selbst als root getestet), bleibt das Programm an dieser Stelle hängen:

stty 9600 ixon -echo < /dev/ttyUSB0

Es gibt keinerlei Rückmeldung und ich kann nur noch mit Ctrl-C abbrechen. Früher hat er das Kommando IIRC auch ohne Rückmeldung angenommen und ich war sofort auf der Konsole zurück.

Mit "stty -F /dev/ttyUSB0 9600" kann ich die Schnittstelle zwar auf 9600bps stellen, was ich mir auch anzeigen kann:

Code: Alles auswählen

stty -a -F /dev/ttyUSB0  
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke
Aber es funktioniert nicht. Ein "echo A > /dev/ttyUSB0" bleibt auch einfach hängen. Das hat früher schon funktioniert, selbst wenn gar kein Controller am PL2303 dran hing.

Ist es vielleicht nur eine Terminaleinstellung? Wird irgendwas zurück erwartet? Wie kann ich einfach ein rohes Zeichen an /dev/ttyUSB0 senden?

Wenn ich statt "stty 9600 ixon -echo < /dev/ttyUSB0" einfach "stty 9600 ixon -echo -F /dev/ttyUSB0" eingebe, wird das Kommando übrigens akzeptiert. Da muss sich wohl irgendwas verändert haben? Trotzdem kann ich kein Zeichen senden.


TIA,
Kermit

PS: Ich habe nun etliche zusätzliche stty Terminaleinstellungen durch. Zudem habe ich ein nagelneues PL2303 Interface ausgepackt (habe einige auf Vorrat). Selbst wenn an der Ausgangsseite des PL2303 nichts angeschlossen ist, müsste er beim Aussenden doch einfach ein Bitbanging an den Ausgangspins geben und das echo-Kommando beenden (echo Zeichen > ./dev/ttyUSB0). Warum tut er das nicht mehr?

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von cosmac » 22.10.2010 20:00:29

hallo!
'stty -a -F /dev/ttyUSB0' hat geschrieben:-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
das ist hier soweit reproduzierbar: mit "-clocal" (wie bei dir) blockieren echo und stty, mit "clocal" funktioniert es.

"stty raw -F /dev/ttyUSB0" ist ja für Verbindungen zu Mikrocontrollern erstmal eine gute Grundlage, aber clocal muss man noch extra einstellen.

Wenn sich da was geändert hat, hab' ich es mal wieder nicht gemerkt. Gefühlsmässig war es eher umgekehrt: früher war der Default "-clocal" und heute "clocal", aber das passt hier ja garnicht.

Edit: ich hätte eher minicom (oder sowas) als den Kernel in Verdacht. Schließlich hast du ein komplett neues System.
Beware of programmers who carry screwdrivers.

Kermit24
Beiträge: 312
Registriert: 29.04.2006 14:44:39

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von Kermit24 » 22.10.2010 21:34:06

Besten Dank! Das war's!

Code: Alles auswählen

[-]clocal
              ignoriere Modemkontrollsignale
Das muss früher dann wohl anders gewesen sein. Und ich war schon dabei mir den alten Kernel runterzuladen und pl2303.c zu vergleichen. Dann habe ich es aber selbst noch irgendwie hinbekommen, indem ich folgendes probiert habe (über eine Websuchmaschine gefunden):

Code: Alles auswählen

stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
Die Parameter habe ich dann mühsam einzeln zurückgesetzt, aber keiner davon war es. Offensichtlich muss sich das clocal-Flag bei Eingabe automatisch mit geändert haben!
Ohne Deinen Tipp, wäre ich wohl jetzt noch am suchen, woran das liegt! Tausend Dank noch mal!

Achja, minicom hatte ich noch gar nicht installiert! habe es eben erst installiert, weil ich gehofft habe, dass es funktionieren würde, wenn ich /dev/ttyUSB0 einmal mit minicom initialisiere. Das Flag war also definitiv vorher schon gesetzt (bzw. nicht gesetzt sprich -clocal)

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von Danielx » 24.10.2010 19:11:18

Kermit24 hat geschrieben:Das muss früher dann wohl anders gewesen sein.
Ja, da haben sich ziemlich viele Standardeinstellungen des pl2302-Moduls geändert.

Unter Lenny sind die Standardeinstellungen:

Code: Alles auswählen

speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Unter Squeeze sind die Standardeinstellungen:

Code: Alles auswählen

speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke
Und wenn man diese vergleicht, stellt man fest, dass sich diese Standardeinstellungen des pl2303 Kernel-Moduls verändert haben:

Unter Lenny:

Code: Alles auswählen

speed 9600 baud
eof = ^D
clocal
icrnl
ixon
opost
onlcr
isig
icanon
iexten
echo
echoe
echok
echoctl
echoke
Jetzt unter Squeeze:

Code: Alles auswählen

speed 115200 baud
eof = ^A
-clocal
-icrnl
-ixon
-opost
-onlcr
-isig
-icanon
-iexten
-echo
-echoe
-echok
-echoctl
-echoke
Kermit24 hat geschrieben:Ein "echo A > /dev/ttyUSB0" bleibt auch einfach hängen.
Nach aktivieren von clocal

Code: Alles auswählen

stty clocal -F /dev/ttyUSB0
geht das bei mir auch wieder.

Gruß,
Daniel

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von cosmac » 24.10.2010 23:40:35

im (ab dem) Kernel 2.6.27 ist der ganze serielle Kram wohl mal gründlich aufgeräumt worden, und anscheinend hat der pl2303-Treiber bis dahin seine eigenen Defaults benutzt:
http://lkml.org/lkml/2008/10/10/126
http://lkml.org/lkml/2008/10/10/152

So würden meine Erinnerungen auch besser zur Realität passen: ganz früher gab's keinen pl2303 und der Default war "-clocal", pl2303 hat dann "clocal" benutzt und seit dem o.g. Patch hält er sich auch an den alten Default "-clocal". Trau' keiner Einstellung, die du nicht selber gefälscht hast ;)
Beware of programmers who carry screwdrivers.

Boxster
Beiträge: 8
Registriert: 16.02.2011 07:34:16

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von Boxster » 10.03.2011 10:27:23

Hallo,

ich bin auch genau an der Stelle auf die Schnauze gefallen... :lol:

Ich habe eine Wetterstation angeschlossen und seit kurzem (vermutlich dem letzten Update?) konnte sie nicht mehr angesprochen werden.
Siehe hierzu: http://debianforum.de/forum/viewtopic.php?f=13&t=127696

Nachdem ich clocal gesetzt habe, funktioniert wieder alles wie gehabt.

Wie kann ich den Parameter clocal wieder als Standard definieren? Geht das über einen Kernel-Parameter? Ich sollte auch die Baudrate auf 19200 setzen, kann ich das in einem Zug machen? Von Hand jedes Mal neu setzen ist bissle mühsam...

Danke & viele Grüße

Boxster

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: pl2303 bei neueren Kernel - hat sich was geändert?

Beitrag von cosmac » 10.03.2011 21:01:07

Boxster hat geschrieben:Wie kann ich den Parameter clocal wieder als Standard definieren? Geht das über einen Kernel-Parameter? Ich sollte auch die Baudrate auf 19200 setzen, kann ich das in einem Zug machen?
Kernel-Parameter kenne ich dafür keine. Die Befehle, die du jetzt von Hand eingibst, müssen genau so automatisch eingegeben werden. Du kannst sie einfach in die Datei /etc/rc.local vor dem "exit" einfügen, dann werden sie bei jedem Systemstart ausgeführt. Da dort beliebig viele Befehle stehen können, ist es auch egal, ob die Baudrate in einem Zug gesetzt werden kann.

Wenn du vor allem Linux lernen willst, kannst du stattdessen ein init-Script schreiben. /etc/init.d/skeleton ist eine Vorlage für den Zweck. Die Wirkung ist aber genau die gleiche wie mit rc.local.
Beware of programmers who carry screwdrivers.

Antworten