Return to BSD News archive
X-Mailer: CrossPoint v3.02
Message-ID: <5ShJnqRLVPB@pro-042.proline.gun.de>
References: <1994Jul4.130216.19263@bruce.cs.monash.edu.au>
X-Gateway: ZCONNECT KY key.gun.de [DUUCP BETA vom 07.07.1994]
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
From: d.vanheukelum@proline.gun.de (Dietmar van Heukelum)
Subject: Re: SIO/COM driver 16550A limitations?
Date: 12 Jul 1994 14:11:00 +0200
Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!bunyip.cc.uq.oz.au!munnari.oz.au!spool.mu.edu!howland.reston.ans.net!xlink.net!rz.uni-karlsruhe.de!subnet.sub.net!flatlin!flyer.GUN.de!teralon!easix!key.gun.de!proline.gun.de!d.vanheukelum
Newsgroups: comp.os.386bsd.questions
Distribution: world
Lines: 97
From article by maurice@bruce.cs.monash.edu.au (Maurice Castro):
m>> The man pages for SIO and COM both allude to problems with cheap
m>> clone 16550A serial boards (which I have). What is the failure
m>> mode for these? When I do: "cat </dev/tty00" on a stock system,
m>> the consoles freeze (no keystrokes do anything), and it appears
m>> that the system goes dead (I don't actually know what the CPU
m>> is doing, since I have no bus analyzer).
m>>
m>
m>Before concluding that your serial card is at fault use kermit to
m>try and set the line. If your system does not quickly respond
m>try the following:
m>
m> /bin/stty -f /dev/tty00 clocal
m>
m>Then try to use kermit to verify the presence of a serial device.
m>If kermit responds quickly to the set line command add the line to your
m>/etc/rc.local file to ensure the convenient operation of the serial port
m>each time you boot.
m>
m> Maurice
m>
As far as cheap 16550 clones are concerned, the problem with my Texas
Instrument version was that it wasn't recognized at bootup because of a
lacking interrupt. I corrected it with the following patch to sio.c:
*** /sys/i386/isa/sio.c.orig Thu May 12 08:13:34 1994
--- /sys/i386/isa/sio.c Fri May 13 07:31:10 1994
***************
*** 362,368 ****
--- 362,381 ----
* o an output interrupt is generated and its vector is correct.
* o the interrupt goes away when the IIR in the UART is read.
*/
+ /*
+ * The following three lines are neccessary on some versions of the
+ * 16550 chip, especially the Texas Instrument version TI16550AN
+ * doesn't work without setting the baud rate first.
+ * The effect is that the chip doesn't generate the TXRDY interrupt
+ * without it. The same may apply to other versions of the chip.
+ * And it won't harm any other, I think.
+ * Dietmar van Heukelum, 53840 Troisdorf, Germany
+ */
+ outb(iobase + com_cfcr, CFCR_DLAB|CFCR_8BITS);
+ outb(iobase + com_dlbl, 3); /* The value is unimportant */
+ outb(iobase + com_dlbh, 0);
outb(iobase + com_cfcr, CFCR_8BITS); /* ensure IER is addressed */
+ outb(iobase + com_fifo, 0); /* ensure fifo is really off */
outb(iobase + com_mcr, MCR_IENABLE); /* open gate early */
As you can probably see, I'm still using FreeBSD V1.0.2 because I haven't
got any later version yet :-(.
But nevertheless the same may apply to V1.1.5.
But still kermit didn't work on my system even with the "stty -f /dev/
tty00 clocal" stuff ("device not configured" error).
The following quick and dirty lines did the job. Running the little piece
of code during startup made everything work.
#include <unistd.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/termios.h>
struct termios term;
main()
{
int tty;
tty=open("/dev/tty01", O_RDWR|O_NONBLOCK);
if (ioctl(tty, TIOCMSBIDIR, 1) < 0) goto out;
if (ioctl(tty, TIOCGETA, &term) < 0) goto out;
term.c_ispeed = B57600;
term.c_ospeed = B57600;
if (ioctl(tty, TIOCSETA, &term) < 0)
{
out:
printf("Setting failed!\n");
close(tty);
exit(1);
}
close(tty);
exit(0);
}
Hope that helps:-).
Regards, Dietmar
## CrossPoint v3.02 ##