Hi,

I'm having problems with the ftdi_sio driver.  My RS-232 software does not
work with the US232B adapter, which is based on the FTDI FT232BM chip.

To investigate the problem, I set up a 300 bps connection to a Digital
VT 420 terminal and enabled XON/XOFF handshaking.

I made three different tests:

Linux 2.4.25 with 16550 serial port driver
Linux 2.4.25 with ftdi_sio v1.3.5
Windows XP with the newest FTDI driver

When I send a block of data to the serial port and try to interrupt it by
pressing ctrl-s on the VT 420, the 16550-based interface will stop after
transmitting N*16 bytes.  The Win32 FTDI driver stops after sending 2 to 4
more bytes.  The ftdi_sio driver doesn't honor the ctrl-s at all!

Furthermore, the process write()ing to ftdi_sio will exit long before
all the data has been transmitted.  When sending to the 16550-based
interface, the process will not exit until everything has been sent.

Could someone please have a look at this?  I'd try to fix it myself,
but I'm not very familiar with the USB protocol stack.

With best regards,

        Marko Mäkelä
        http://www.funet.fi/~msmakela/

More detailed report follows:

I believe that the 16550 driver implements the proper behaviour
specified by POSIX.

These two differences (ftdi_sio not honoring XON/XOFF handshaking, and
allowing write() to return immediately) probably explain why C-Kermit
fails when trying to paste anything longer than 4 or 5 characters at
300 baud.  (C-Kermit invokes write(2) for every character it sends.)

Here are the stty settings, both for /dev/ttyS0 (16550) and /dev/usb/tts/0
(US232B a.k.a. FTDI FT232BM):

$ stty -F /dev/usb/tts/0 sane speed 300 -brkint -imaxbel -echo ixon

More verbosely:

$ stty -F /dev/usb/tts/0 -a
speed 300 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <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
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

When the terminal (Digital VT 420) is connected to /dev/ttyS0, pressing
ctrl-s will pause output at the end of the 16-byte hardware FIFO.  It
looks like if ctrl-s is pressed after K received characters of a
write(2) of N characters, the output will pause after
MAX((K/16+1)*16,N) characters.

Here is a test case:

$ echo 01234567890123456789012345678901234567890123456789 > /dev/ttyS0
The Digital VT 420 terminal will display the following test pattern:
01234567890123456789012345678901234567890123456789

The test can be repeated, pressing ctrl-s and ctrl-q at different points of
output.  The screen output can halt at three positions:

ctrl-s pressed on the VT 420
=> 0123456789012345 (screen output pauses after 16 characters)
ctrl-q ctrl-s
=>                 6789012345678901 (again pause after 32 characters)
ctrl-q ctrl-s
                                   2345678901234567 (pause after 48 chars)
ctrl-q
=>                                                 89\r\n (resumed until end)

If I press ctrl-s at the end of a transmission, it will be ignored by
subsequent echo commands.  Only ctrl-s during a write(2) seems to
count.  (I guess that this is because the file descriptor will be
closed between echo(1) invocations.)

The ftdi_sio (/dev/usb/tts/0) seems to completely ignore ctrl-s
characters sent with the terminal.

I remember reading that the hardware FIFO of the FT232BM is 128 or 384
bytes, much longer than the test string above.  What if I send a longer
string?

perl -e 'for($i=0;$i<40;$i++){printf "%c123456789",$i+32}' > /dev/ttyS0

On the 16550, the write(2) call will block until all 400 characters
have been sent.  If ctrl-s is pressed on the Digital VT420 terminal
and the perl process is terminated with SIGINT (ctrl-c), no further
characters will be sent to the terminal upon receiving ctrl-q.

On the FTDI FT232BM, the write(2) call will complete immediately, and
the characters will be sent after the termination of the perl process.
Pressing ctrl-s on the VT 420 has no effect on the output.  I tested
this with output strings of up to 800 bytes, pressing ctrl-s within
the first few bytes received.  All 800 bytes were always delivered.


-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id%62&alloc_ida84&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to