linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andy Parkins <andyparkins@gmail.com>
To: linux-serial@vger.kernel.org
Subject: tcdrain / TCSBRK / wait_until_sent delay
Date: Thu, 5 May 2005 16:50:38 +0100	[thread overview]
Message-ID: <200505051650.38471.andyparkins@gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 2513 bytes --]

Hello,

I wonder if anyone can help me with this as a problem?  I'm trying to send 
commands to a device along a two wire RS485 connection.  I'm using an RS232 
to RS485 converter that changes the buffer direction based on RTS.  With that 
in mind I therefore do things like (error detection left out for brevity)

bit = TIOCM_RTS;
ioctl( fd, TIOCMBIS, &bit );
write( fd, "\xaa", 1 );
tcdrain();
ioctl( fd, TIOCMBIC, &bit );

This triggers the other end to send a response that I read back with 
select/read.  However, what I am reading has the front few bytes corrupted.  
Sticking a scope on the TXD and RTS lines of the serial port shows that

      ______________________________________
RTS __|                                    |_____
       _____ ___ ___ ___
TXD ___|   |_| |_| |_| |_________________________
        S 1 0 1 0 1 0 1 0 s
                           <-----delay---->

There is a small delay between RTS going high and the data starting - no 
problem there, however, when the transmission finishes there is a 2 byte 
delay before RTS goes low.  The device I'm talking to has (apparently) a 
response time of 200us; I'm seeing a delay before restoration of RTS of 2ms. 
write() returns immediately - the delay is coming from tcdrain() - but I 
cannot see from where.

With a bit of digging I've found that tcdrain() simply calls ioctl(TCSBRK,1) 
which I guess ends up in

linux/driver/char/tty_io.c:         tty_ioctl() which calls
linux/driver/char/tty_ioctl.c:      tty_wait_until_sent() which calls
linux/driver/serial/serial_core.c:  uart_wait_until_sent()

uart_wait_until_sent() then sits and waits for /at most/ two characters worth 
of timeout for

linux/driver/serial/8250.c: serial8250_tx_empty()

to tell it that it can return.  It appears (in my very newbie eyes) that 
uart_wait_until_sent() checks for tx_empty() every 1/5th of a byte, I would 
think that would be more than enough.  It takes negligible time for 
serial8250_tx_empty() to call serial_in() to read the UART status register.  
I imagine that the msleep_interruptible() call is well tested in Linux.

My question then is where is the time going?  It seems suspicious that 
uart_wait_until_sent() has an overall timeout of two character times - 
exactly the excess I'm seeing.  Am I right to be suspicious?  Have I 
understood any of this?  Is it unreasonable to expect Linux to do a 200us 
turnaround?



Andy
-- 
Dr Andrew Parkins, M Eng (hons), AMIEE


[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

             reply	other threads:[~2005-05-05 15:50 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-05 15:50 Andy Parkins [this message]
2005-05-05 17:51 ` tcdrain / TCSBRK / wait_until_sent delay rich+ml
2005-05-06  8:01   ` Andy Parkins
2005-05-06 19:14     ` rich+ml
2005-05-07  9:35       ` Andy Parkins
2005-05-07 18:09         ` rich+ml
2005-05-09  8:01           ` Andy Parkins
     [not found]             ` <Pine.LNX.4.58.0505090825470.750@deadrat.localdomain>
2005-05-10  7:44               ` Andy Parkins
2005-05-09  8:16         ` Tosoni
2005-05-09  8:59           ` Russell King
2005-05-09 10:03             ` Tosoni
2005-05-09 10:13               ` Russell King
2005-05-09 15:43                 ` Theodore Ts'o
2005-05-07 10:32       ` Gerald Emig
2005-05-09  9:15 ` Christer Weinigel
2005-05-09  9:22   ` Christer Weinigel
2005-05-09 11:05     ` Andy Parkins
2005-05-09 15:53     ` Andy Parkins
2005-05-09 19:45     ` rich+ml

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200505051650.38471.andyparkins@gmail.com \
    --to=andyparkins@gmail.com \
    --cc=linux-serial@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).