2004-03-23 10:08:43

by Christof

[permalink] [raw]
Subject: synchronous serial port communication (16550A)

Hello,

I have a possible problem with the 8250 serial port driver in linux (2.6.2).
I communicate with a graphic controller with LCD-Display via ttyS0. This
controller has a small buffer: 20 bytes. When the buffer is full it
asserts the CTS line. When it can receive data again, the CTS line is
cleared.
My software checks the CTS line each time before sending a byte. If it
is asserted, it waits until its cleared and goes on. When data is sent
although CTS is asserted, the graphic controller will be confused and
garbage will appear on the LCD screen.

To make the story short: I see a lot of garbage on the LCD.
It looks like output would be buffered and all data would be sent at
once without giving me the possibility to check if everything's
allright. Sometimes I can send >400 Bytes and ioctl says that CTS is not
asserted, altough it certainly is. What I need is totally synchronous
I/O. I want all bytes to be sent physically before I check for CTS, but
I can't find a possibility to actually achieve this. I tried to hack the
driver not to use the FIFO (My Linux box has a 16550A UART) and to set
the size of the circ buffer to 1, but nothing helped.
I compiled my software for cygwin for my Windows-machine and it worked,
the only thing is that I don't know what UART is build in, but i suppose
that it also has a FIFO since it is a quite new machine. (The FIFO is
also enabled in windows too).

Do you have any idea what I could do?

Thanks in advance and sorry for the messy english =)

Regards,
Christof Krueger



2004-03-23 10:31:33

by Russell King

[permalink] [raw]
Subject: Re: synchronous serial port communication (16550A)

On Tue, Mar 23, 2004 at 11:09:33AM +0100, Christof wrote:
> To make the story short: I see a lot of garbage on the LCD.
> It looks like output would be buffered and all data would be sent at
> once without giving me the possibility to check if everything's
> allright. Sometimes I can send >400 Bytes and ioctl says that CTS is not
> asserted, altough it certainly is.

It probably isn't, at the time you check it. When you write a byte,
the call will generally return immediately because it'll be placed in
a buffer. Transmission has only just started, and you then go and check
the CTS line. Repeat multiple times on a slow enough baud rate, and
you'll end up queueing a lot of bytes.

You could write a byte, wait for it to complete by calling ioctl(TCSETSW)
without changing any parameters, and then read the CTS status.

--
Russell King
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/
2.6 Serial core

2004-03-23 10:49:35

by Miquel van Smoorenburg

[permalink] [raw]
Subject: Re: synchronous serial port communication (16550A)

In article <[email protected]>,
Christof <[email protected]> wrote:
>I have a possible problem with the 8250 serial port driver in linux (2.6.2).
>I communicate with a graphic controller with LCD-Display via ttyS0. This
>controller has a small buffer: 20 bytes. When the buffer is full it
>asserts the CTS line. When it can receive data again, the CTS line is
>cleared.
>My software checks the CTS line each time before sending a byte. If it
>is asserted, it waits until its cleared and goes on. When data is sent
>although CTS is asserted, the graphic controller will be confused and
>garbage will appear on the LCD screen.

Why don't you simply turn on hardware flow control (i.e. enable
CRTSCTS with tcsetattr() or even stty) ?

Mike.
--
Netu, v qba'g yvxr gur cynvagrkg :)

2004-03-23 11:31:23

by Christof

[permalink] [raw]
Subject: Re: synchronous serial port communication (16550A)

Miquel van Smoorenburg wrote:
> Why don't you simply turn on hardware flow control (i.e. enable
> CRTSCTS with tcsetattr() or even stty) ?
>
> Mike.

RTS has a special meaning with this lcd-controller, so I don't want that
it is set without my implicit will.

2004-03-23 11:33:03

by Christof

[permalink] [raw]
Subject: Re: synchronous serial port communication (16550A)

Russell King wrote:
> You could write a byte, wait for it to complete by calling ioctl(TCSETSW)
> without changing any parameters, and then read the CTS status.
I'm away for 2 days now, so I will try it when I will be back home.
Thank you!

--
Regards,
Christof Krueger

2004-03-24 00:47:09

by Peter Chubb

[permalink] [raw]
Subject: Re: synchronous serial port communication (16550A)

>>>>> "Christof" == Christof <[email protected]> writes:

Christof> Miquel van Smoorenburg wrote:
>> Why don't you simply turn on hardware flow control (i.e. enable
>> CRTSCTS with tcsetattr() or even stty) ?
>>
>> Mike.

Christof> RTS has a special meaning with this lcd-controller, so I
Christof> don't want that it is set without my implicit will. - To

Then wire it to something other than CTS at the host
end.


--
Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au
The technical we do immediately, the political takes *forever*