mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-27 05:21:08 +01:00
1109 lines
43 KiB
Plaintext
1109 lines
43 KiB
Plaintext
<!-- $Id$ -->
|
|
<!-- The FreeBSD Documentation Project -->
|
|
|
|
<!--
|
|
<!DOCTYPE linuxdoc PUBLIC "-//FreeBSD//DTD linuxdoc//EN" [
|
|
|
|
<!ENTITY % authors SYSTEM "authors.sgml">
|
|
%authors;
|
|
|
|
]>
|
|
-->
|
|
<sect2><heading>The UART: What it is and how it works<label id="uart"></heading>
|
|
|
|
<p><em>Copyright © 1996 &a.uhclem;, All Rights Reserved.<newline>
|
|
13 January 1996.</em>
|
|
|
|
<!-- Version 1(2) 13-Jan-96 -->
|
|
|
|
The Universal Asynchronous Receiver/Transmitter (UART) controller
|
|
is the key component of the serial communications subsystem of a
|
|
computer. The UART takes bytes of data and transmits the individual
|
|
bits in a sequential fashion. At the destination, a second UART
|
|
re-assembles the bits into complete bytes.
|
|
|
|
Serial transmission is commonly used with modems and for
|
|
non-networked communication between computers, terminals
|
|
and other devices.
|
|
|
|
There are two primary forms of serial transmission: Synchronous and
|
|
Asynchronous. Depending on the modes that are supported by the
|
|
hardware, the name of the communication sub-system will usually
|
|
include a "A" if it supports Asynchronous communications, and a
|
|
"S" if it supports Synchronous communications. Both forms are
|
|
described below.
|
|
|
|
Some common acronyms are:
|
|
<quote>UART Universal Asynchronous Receiver/Transmitter</quote>
|
|
<quote>USART Universal Synchronous-Asynchronous Receiver/Transmitter</quote>
|
|
|
|
|
|
<sect3><heading>Synchronous Serial Transmission</heading>
|
|
|
|
<p>Synchronous serial transmission requires that the sender and
|
|
receiver share a clock with one another, or that the sender provide
|
|
a strobe or other timing signal so that the receiver knows when to
|
|
"read" the next bit of the data. In most forms of serial
|
|
Synchronous communication, if there is no data available at a given
|
|
instant to transmit, a fill character must be sent instead so that
|
|
data is always being transmitted. Synchronous communication is
|
|
usually more efficient because only data bits are transmitted
|
|
between sender and receiver, and synchronous communication can be
|
|
more more costly if extra wiring and circuits are required to
|
|
share a clock signal between the sender and receiver.
|
|
|
|
A form of Synchronous transmission is used with printers and
|
|
fixed disk devices in that the data is sent on one set of wires
|
|
while a clock or strobe is sent on a different wire. Printers and
|
|
fixed disk devices are not normally serial devices because most
|
|
fixed disk interface standards send an entire word of data for each
|
|
clock or strobe signal by using a separate wire for each bit of the
|
|
word. In the PC industry, these are known as Parallel devices.
|
|
|
|
The standard serial communications hardware in the PC does not
|
|
support Synchronous operations. This mode is described here for
|
|
comparison purposes only.
|
|
|
|
|
|
<sect3><heading>Asynchronous Serial Transmission</heading>
|
|
|
|
<p>Asynchronous transmission allows data to be transmitted without
|
|
the sender having to send a clock signal to the receiver. Instead,
|
|
the sender and receiver must agree on timing parameters in advance
|
|
and special bits are added to each word which are used to
|
|
synchronize the sending and receiving units.
|
|
|
|
When a word is given to the UART for Asynchronous transmissions,
|
|
a bit called the "Start Bit" is added to the beginning of each word
|
|
that is to be transmitted. The Start Bit is used to alert the
|
|
receiver that a word of data is about to be sent, and to force the
|
|
clock in the receiver into synchronization with the clock in the
|
|
transmitter. These two clocks must be accurate enough to not
|
|
have the frequency drift by more than 10% during the transmission
|
|
of the remaining bits in the word. (This requirement was set in
|
|
the days of mechanical teleprinters and is easily met by modern
|
|
electronic equipment.)
|
|
|
|
After the Start Bit, the individual bits of the word of data are
|
|
sent, with the Least Significant Bit (LSB) being sent first. Each
|
|
bit in the transmission is transmitted for exactly the same
|
|
amount of time as all of the other bits, and the receiver "looks"
|
|
at the wire at approximately halfway through the period assigned
|
|
to each bit to determine if the bit is a "1" or a "0". For example,
|
|
if it takes two seconds to send each bit, the receiver will examine
|
|
the signal to determine if it is a "1" or a "0" after one second
|
|
has passed, then it will wait two seconds and then examine the value
|
|
of the next bit, and so on.
|
|
|
|
The sender does not know when the receiver has "looked" at the
|
|
value of the bit. The sender only knows when the clock says to
|
|
begin transmitting the next bit of the word.
|
|
|
|
When the entire data word has been sent, the transmitter may add
|
|
a Parity Bit that the transmitter generates. The Parity Bit may
|
|
be used by the receiver to perform simple error checking. Then at
|
|
least one Stop Bit is sent by the transmitter.
|
|
|
|
When the receiver has received all of the bits in the data word,
|
|
it may check for the Parity Bits (both sender and receiver must
|
|
agree on whether a Parity Bit is to be used), and then the receiver
|
|
looks for a Stop Bit. If the Stop Bit does not appear when it is
|
|
supposed to, the UART considers the entire word to be garbled and
|
|
will report a Framing Error to the host processor when the data
|
|
word is read. The usual cause of a Framing Error is that the sender
|
|
and receiver clocks were not running at the same speed, or that
|
|
the signal was interrupted.
|
|
|
|
Regardless of whether the data was received correctly or not, the
|
|
UART automatically discards the Start, Parity and Stop bits. If the
|
|
sender and receiver are configured identically, these bits are not
|
|
passed to the host.
|
|
|
|
If another word is ready for transmission, the Start Bit for the new
|
|
word can be sent as soon as the Stop Bit for the previous
|
|
word has been sent.
|
|
|
|
Because asynchronous data is "self synchronizing", if there is no
|
|
data to transmit, the transmission line can be idle.
|
|
|
|
|
|
<sect3><heading>Other UART Functions</heading>
|
|
|
|
<p>In addition to the basic job of converting data from parallel to
|
|
serial for transmission and from serial to parallel on reception,
|
|
a UART will usually provide additional circuits for signals that
|
|
can be used to indicate the state of the transmission media, and
|
|
to regulate the flow of data in the event that the remote device
|
|
is not prepared to accept more data. For example, when the
|
|
device connected to the UART is a modem, the modem may report the
|
|
presence of a carrier on the phone line while the computer may be
|
|
able to instruct the modem to reset itself or to not take calls
|
|
by asserting or deasserting one more more of these extra signals.
|
|
The function of each of these additional signals is defined in
|
|
the EIA RS232-C standard.
|
|
|
|
|
|
<sect3><heading>The RS232-C and V.24 Standards</heading>
|
|
|
|
<p>In most computer systems, the UART is connected to circuitry that
|
|
generates signals that comply with the EIA RS232-C specification.
|
|
There is also a CCITT standard named V.24 that mirrors the
|
|
specifications included in RS232-C.
|
|
|
|
<sect4><heading>RS232-C Bit Assignments (Marks and Spaces)</heading>
|
|
|
|
<p>In RS232-C, a value of "1" is called a "Mark" and a value of "0"
|
|
is called a "Space". When a communication line is idle, the line
|
|
is said to be "Marking", or transmitting continuous "1" values.
|
|
|
|
The Start bit always has a value of "0" (a Space). The Stop Bit
|
|
always has a value of "1" (a Mark). This means that there will
|
|
always be a Mark (1) to Space (0) transition on the line at the
|
|
start of every word, even when multiple word are
|
|
transmitted back to back. This guarantees that sender and
|
|
receiver can resynchronize their clocks regardless of the content
|
|
of the data bits that are being transmitted.
|
|
|
|
The idle time between Stop and Start bits does not have
|
|
to be an exact multiple (including zero) of the bit rate of the
|
|
communication link, but most UARTs are designed this way for
|
|
simplicity.
|
|
|
|
In RS232-C, the "Marking" signal (a "1") is represented by a voltage
|
|
between -2 VDC and -12 VDC, and a "Spacing" signal (a "0") is
|
|
represented by a voltage between 0 and +12 VDC. The transmitter
|
|
is supposed to send +12 VDC or -12 VDC, and the receiver is supposed
|
|
to allow for some voltage loss in long cables. Some transmitters
|
|
in low power devices (like portable computers) sometimes use only
|
|
+5 VDC and -5 VDC, but these values are still acceptable to a
|
|
RS232-C receiver, provided that the cable lengths are short.
|
|
|
|
|
|
<sect4><heading>RS232-C Break Signal</heading>
|
|
|
|
<p>RS232-C also specifies a signal called a "Break", which is caused
|
|
by sending continuous Spacing values (no Start or Stop bits). When
|
|
there is no electricity present on the data circuit, the line is
|
|
considered to be sending "Break".
|
|
|
|
The "Break" signal must be of a duration longer than the time
|
|
it takes to send a complete byte plus Start, Stop and Parity bits.
|
|
Most UARTs can distinguish between a Framing Error and a
|
|
Break, but if the UART cannot do this, the Framing Error detection
|
|
can be used to identify Breaks.
|
|
|
|
In the days of teleprinters, when numerous printers around the
|
|
country were wired in series (such as news services), any unit
|
|
could cause a "Break" by temporarily opening the entire circuit
|
|
so that no current flowed. This was used to allow a location with
|
|
urgent news to interrupt some other location that was currently
|
|
sending information.
|
|
|
|
In modern systems there are two types of Break signals. If the
|
|
Break is longer than 1.6 seconds, it is considered a "Modem Break",
|
|
and some modems can be programmed to terminate the conversation and
|
|
go on-hook or enter the modems' command mode when the modem detects
|
|
this signal. If the Break is smaller than 1.6 seconds, it signifies
|
|
a Data Break and it is up to the remote computer to respond to
|
|
this signal. Sometimes this form of Break is used as an Attention
|
|
or Interrupt signal and sometimes is accepted as a substitute for
|
|
the ASCII CONTROL-C character.
|
|
|
|
Marks and Spaces are also equivalent to "Holes" and "No Holes"
|
|
in paper tape systems.
|
|
|
|
Note that Breaks cannot be generated from paper tape or from any
|
|
other byte value, since bytes are always sent with Start and Stop
|
|
bit. The UART is usually capable of generating the continuous
|
|
Spacing signal in response to a special command from the host
|
|
processor.
|
|
|
|
<sect4><heading>RS232-C DTE and DCE Devices</heading>
|
|
|
|
<p>The RS232-C specification defines two types of equipment: the Data
|
|
Terminal Equipment (DTE) and the Data Carrier Equipment (DCE).
|
|
Usually, the DTE device is the terminal (or computer), and the DCE
|
|
is a modem. Across the phone line at the other end of a
|
|
conversation, the receiving modem is also a DCE device and the
|
|
computer that is connected to that modem is a DTE device. The DCE
|
|
device receives signals on the pins that the DTE device transmits on,
|
|
and vice versa.
|
|
|
|
When two devices that are both DTE or both DCE must be connected
|
|
together without a modem or a similar media translater between them,
|
|
a NULL modem must be used. The NULL modem electrically re-arranges
|
|
the cabling so that the transmitter output is connected to the
|
|
receiver input on the other device, and vice versa. Similar
|
|
translations are performed on all of the control signals so that
|
|
each device will see what it thinks are DCE (or DTE) signals from
|
|
the other device.
|
|
|
|
The number of signals generated by the DTE and DCE devices are
|
|
not symmetrical. The DTE device generates fewer signals for
|
|
the DCE device than the DTE device receives from the DCE.
|
|
|
|
<sect4><heading>RS232-C Pin Assignments</heading>
|
|
|
|
<p>The EIA RS232-C specification (and the ITU equivalent, V.24) calls
|
|
for a twenty-five pin connector (usually a DB25) and defines the
|
|
purpose of most of the pins in that connector.
|
|
|
|
In the IBM Personal Computer and similar systems, a subset of
|
|
RS232-C signals are provided via nine pin connectors (DB9).
|
|
The signals that are not included on the PC connector deal mainly
|
|
with synchronous operation, and this transmission mode is not
|
|
supported by the UART that IBM selected for use in the IBM PC.
|
|
|
|
Depending on the computer manufacturer, a DB25, a DB9, or
|
|
both types of connector may be used for RS232-C communications.
|
|
(The IBM PC also uses a DB25 connector for the parallel printer
|
|
interface which causes some confusion.)
|
|
|
|
Below is a table of the RS232-C signal assignments in the DB25
|
|
and DB9 connectors.
|
|
|
|
<verb>
|
|
DB25 DB9 EIA CCITT Common Signal Description
|
|
RS232-C IBM PC Circuit Circuit Name Source
|
|
Pin Pin Symbol Symbol
|
|
|
|
1 - AA 101 PG/FG --- Frame/Protective Ground
|
|
2 3 BA 103 TD DTE Transmit Data
|
|
3 2 BB 104 RD DCE Receive Data
|
|
4 7 CA 105 RTS DTE Request to Send
|
|
5 8 CB 106 CTS DCE Clear to Send
|
|
6 6 CC 107 DSR DCE Data Set Ready
|
|
7 5 AV 102 SG/GND --- Signal Ground
|
|
8 1 CF 109 DCD/CD DCE Data Carrier Detect
|
|
9 - - - - - Reserved for Test
|
|
10 - - - - - Reserved for Test
|
|
11 - - - - - Unassigned
|
|
12 - CI 122 SRLSD DCE Sec. Recv. Line Signal Detector
|
|
13 - SCB 121 SCTS DCE Secondary Clear To Send
|
|
14 - SBA 118 STD DTE Secondary Transmit Data
|
|
15 - DB 114 TSET DCE Trans. Sig. Element Timing
|
|
16 - SBB 119 SRD DCE Secondary Received Data
|
|
17 - DD 115 RSET DCE Receiver Signal Element Timing
|
|
18 - - 141 LOOP DTE Local Loopback
|
|
19 - SCA 120 SRS DTE Secondary Request to Send
|
|
20 4 CD 108.2 DTR DTE Data Terminal Ready
|
|
21 - - - RDL DTE Remote Digital Loopback
|
|
22 9 CE 125 RI DCE Ring Indicator
|
|
23 - CH 111 DSRS DTE Data Signal Rate Selector
|
|
24 - DA 113 TSET DTE Trans. Sig. Element Timing
|
|
25 - - 142 - DCE Test Mode
|
|
</verb>
|
|
|
|
|
|
<sect3><heading>Bits, Baud and Symbols</heading>
|
|
|
|
<p>Baud is a measurement of transmission speed in asynchronous
|
|
communication. Because of advances in modem communication
|
|
technology, this term is frequently misused when describing
|
|
the data rates in newer devices.
|
|
|
|
Traditionally, a Baud Rate represents the number of bits that are
|
|
actually being sent over the media, not the amount of data
|
|
that is actually moved from one DTE device to the other. The
|
|
Baud count includes the overhead bits Start, Stop and Parity
|
|
that are generated by the sending UART and removed by the
|
|
receiving UART. This means that seven-bit words of data
|
|
actually take 10 bits to be completely transmitted.
|
|
Therefore, a modem capable of moving 300 bits per second from one
|
|
place to another can normally only move 30 7-bit words if
|
|
Parity is used and one Start and Stop bit are present.
|
|
|
|
If 8-bit data words are used and Parity bits are also used, the
|
|
data rate falls to 27.27 words per second, because it now
|
|
takes 11 bits to send the eight-bit words, and the modem still
|
|
only sends 300 bits per second.
|
|
|
|
The formula for converting bytes per second into a baud rate
|
|
and vice versa was simple until error-correcting modems
|
|
came along. These modems receive the serial stream of bits
|
|
from the UART in the host computer (even when internal modems
|
|
are used the data is still frequently serialized) and converts
|
|
the bits back into bytes. These bytes are then combined into
|
|
packets and sent over the phone line using a Synchronous
|
|
transmission method. This means that the Stop, Start, and Parity
|
|
bits added by the UART in the DTE (the computer) were removed by
|
|
the modem before transmission by the sending modem. When these
|
|
bytes are received by the remote modem, the remote modem adds
|
|
Start, Stop and Parity bits to the words, converts them to a
|
|
serial format and then sends them to the receiving UART in the remote
|
|
computer, who then strips the Start, Stop and Parity bits.
|
|
|
|
The reason all these extra conversions are done is so that the
|
|
two modems can perform error correction, which means that the
|
|
receiving modem is able to ask the sending modem to resend a
|
|
block of data that was not received with the correct checksum.
|
|
This checking is handled by the modems, and the DTE devices are
|
|
usually unaware that the process is occurring.
|
|
|
|
By striping the Start, Stop and Parity bits, the additional bits of
|
|
data that the two modems must share between themselves to perform
|
|
error-correction are mostly concealed from the effective
|
|
transmission rate seen by the sending and receiving DTE equipment.
|
|
For example, if a modem sends ten 7-bit words to another modem
|
|
without including the Start, Stop and Parity bits, the sending
|
|
modem will be able to add 30 bits of its own information that
|
|
the receiving modem can use to do error-correction without
|
|
impacting the transmission speed of the real data.
|
|
|
|
The use of the term Baud is further confused by modems that perform
|
|
compression. A single 8-bit word passed over the telephone
|
|
line might represent a dozen words that were transmitted to
|
|
the sending modem. The receiving modem will expand the data back
|
|
to its original content and pass that data to the receiving DTE.
|
|
|
|
Modern modems also include buffers that allow the rate that
|
|
bits move across the phone line (DCE to DCE) to be a different speed
|
|
than the speed that the bits move between the DTE and DCE on both
|
|
ends of the conversation. Normally the speed between the DTE and
|
|
DCE is higher than the DCE to DCE speed because of the use of
|
|
compression by the modems.
|
|
|
|
Because the number of bits needed to describe a byte varied
|
|
during the trip between the two machines plus the differing
|
|
bits-per-seconds speeds that are used present on the DTE-DCE and
|
|
DCE-DCE links, the usage of the term Baud to describe the
|
|
overall communication speed causes problems and can misrepresent
|
|
the true transmission speed. So Bits Per Second (bps) is the correct
|
|
term to use to describe the transmission rate seen at the
|
|
DCE to DCE interface and Baud or Bits Per Second are acceptable
|
|
terms to use when a connection is made between two systems with a
|
|
wired connection, or if a modem is in use that is not performing
|
|
error-correction or compression.
|
|
|
|
Modern high speed modems (2400, 9600, 14,400, and 19,200bps) in
|
|
reality still operate at or below 2400 baud, or more accurately,
|
|
2400 Symbols per second. High speed modem are able to encode more
|
|
bits of data into each Symbol using a technique called Constellation
|
|
Stuffing, which is why the effective bits per second rate of the
|
|
modem is higher, but the modem continues to operate within the
|
|
limited audio bandwidth that the telephone system provides.
|
|
Modems operating at 28,800 and higher speeds have variable Symbol
|
|
rates, but the technique is the same.
|
|
|
|
<sect3><heading>The IBM Personal Computer UART</heading>
|
|
|
|
<p>Starting with the original IBM Personal Computer, IBM selected
|
|
the National Semiconductor INS8250 UART for use in the IBM PC
|
|
Parallel/Serial Adapter. Subsequent generations of compatible
|
|
computers from IBM and other vendors continued to use the INS8250
|
|
or improved versions of the National Semiconductor UART family.
|
|
|
|
|
|
<sect4><heading>National Semiconductor UART Family Tree</heading>
|
|
|
|
<p>There have been several versions and subsequent generations of
|
|
the INS8250 UART. Each major version is described below.
|
|
|
|
<verb>
|
|
INS8250 -> INS8250B
|
|
\
|
|
\
|
|
\-> INS8250A -> INS82C50A
|
|
\
|
|
\
|
|
\-> NS16450 -> NS16C450
|
|
\
|
|
\
|
|
\-> NS16550 -> NS16550A -> PC16550D
|
|
</verb>
|
|
|
|
<descrip>
|
|
<tag>INS8250</tag>This part was used in the original IBM PC and
|
|
IBM PC/XT. The original name for this part was the INS8250 ACE
|
|
(Asynchronous Communications Element) and it is made from NMOS
|
|
technology.
|
|
|
|
The 8250 uses eight I/O ports and has a one-byte send and
|
|
a one-byte receive buffer. This original UART has several
|
|
race conditions and other flaws. The original IBM BIOS
|
|
includes code to work around these flaws, but this made
|
|
the BIOS dependent on the flaws being present, so subsequent
|
|
parts like the 8250A, 16450 or 16550 could not be used in
|
|
the original IBM PC or IBM PC/XT.
|
|
|
|
<tag>INS8250-B</tag>This is the slower speed of the INS8250 made
|
|
from NMOS technology. It contains the same problems as the original
|
|
INS8250.
|
|
|
|
<tag>INS8250A</tag>An improved version of the INS8250 using XMOS
|
|
technology with various functional flaws corrected. The INS8250A
|
|
was used initially in PC clone computers by vendors who used
|
|
"clean" BIOS designs. Because of the corrections in the chip, this
|
|
part could not be used with a BIOS compatible with the INS8250
|
|
or INS8250B.
|
|
|
|
<tag>INS82C50A</tag>This is a CMOS version (low power consumption)
|
|
of the INS8250A and has similar functional characteristics.
|
|
|
|
<tag>NS16450</tag>Same as NS8250A with improvements so it can be
|
|
used with faster CPU bus designs. IBM used this part in the IBM AT
|
|
and updated the IBM BIOS to no longer rely on the bugs in the
|
|
INS8250.
|
|
|
|
<tag>NS16C450</tag>This is a CMOS version (low power consumption)
|
|
of the NS16450.
|
|
|
|
<tag>NS16550</tag>Same as NS16450 with a 16-byte send and receive
|
|
buffer but the buffer design was flawed and could not be reliably
|
|
be used.
|
|
|
|
<tag>NS16550A</tag>Same as NS16550 with the buffer flaws corrected.
|
|
The 16550A and its successors have become the most popular UART
|
|
design in the PC industry, mainly due it its ability to reliably
|
|
handle higher data rates on operating systems with sluggish interrupt
|
|
response times.
|
|
|
|
<tag>NS16C552</tag>This component consists of two NS16C550A CMOS
|
|
UARTs in a single package.
|
|
|
|
<tag>PC16550D</tag>Same as NS16550A with subtle flaws corrected. This
|
|
is revision D of the 16550 family and is the latest design available
|
|
from National Semiconductor.
|
|
</descrip>
|
|
|
|
<sect4><heading>The NS16550AF and the PC16550D are the same thing</heading>
|
|
|
|
<p>National reorganized their part numbering system a few years ago,
|
|
and the NS16550AFN no longer exists by that name. (If you
|
|
have a NS16550AFN, look at the date code on the part, which is a
|
|
four digit number that usually starts with a nine. The first two
|
|
digits of the number are the year, and the last two digits are the
|
|
week in that year when the part was packaged. If you have a
|
|
NS16550AFN, it is probably a few years old.)
|
|
|
|
The new numbers are like PC16550DV, with minor differences in the
|
|
suffix letters depending on the package material and its shape.
|
|
(A description of the numbering system can be found below.)
|
|
|
|
It is important to understand that in some stores, you may pay
|
|
$15(US) for a NS16550AFN made in 1990 and in the next bin are the
|
|
new PC16550DN parts with minor fixes that National has made since the
|
|
AFN part was in production, the PC16550DN was probably made in the
|
|
past six months and it costs half (as low as $5(US) in volume) as
|
|
much as the NS16550AFN because they are readily available.
|
|
|
|
As the supply of NS16550AFN chips continues to shrink, the price will
|
|
probably continue to increase until more people discover and accept
|
|
that the PC16550DN really has the same function as the old part
|
|
number.
|
|
|
|
<sect4><heading>National Semiconductor Part Numbering System</heading>
|
|
|
|
<p>The older NS<em>nnnnnrqp</em> part numbers are now of the
|
|
format PC<em>nnnnnrgp</em>.
|
|
|
|
The "<em>r</em>" is the revision field. The current revision of
|
|
the 16550 from National Semiconductor is "D".
|
|
|
|
The "<em>p</em>" is the package-type field. The types are:
|
|
<verb> "F" QFP (quad flat pack) L lead type
|
|
"N" DIP (dual inline package) through hole straight lead type
|
|
"V" LPCC (lead plastic chip carrier) J lead type</verb>
|
|
|
|
The "<em>g</em>" is the product grade field. If an "I" precedes
|
|
the package-type letter, it indicates an "industrial" grade part,
|
|
which has higher specs than a standard part but not as high as
|
|
Military Specification (Milspec) component. This is an optional field.
|
|
|
|
So what we used to call a NS16550AFN (DIP Package) is now called a
|
|
PC16550DN or PC16550DIN.
|
|
|
|
|
|
<sect3><heading>Other Vendors and Similar UARTs</heading>
|
|
|
|
<p>Over the years, the 8250, 8250A, 16450 and 16550 have been licensed
|
|
or copied by other chip vendors. In the case of the 8250, 8250A
|
|
and 16450, the exact circuit (the "megacell") was licensed to many
|
|
vendors, including Western Digital and Intel. Other vendors
|
|
reverse-engineered the part or produced emulations that had similar
|
|
behavior.
|
|
|
|
In internal modems, the modem designer will frequently emulate the
|
|
8250A/16450 with the modem microprocessor, and the emulated UART will
|
|
frequently have a hidden buffer consisting of several hundred bytes.
|
|
Because of the size of the buffer, these emulations can be as
|
|
reliable as a 16550A in their ability to handle high speed data.
|
|
However, most operating systems will still report that
|
|
the UART is only a 8250A or 16450, and may not make effective use
|
|
of the extra buffering present in the emulated UART unless special
|
|
drivers are used.
|
|
|
|
Some modem makers are driven by market forces to abandon a design
|
|
that has hundreds of bytes of buffer and instead use a 16550A UART
|
|
so that the product will compare favorably in market comparisons
|
|
even though the effective performance may be lowered by this action.
|
|
|
|
A common misconception is that all parts with "16550A" written on
|
|
them are identical in performance. There are differences, and in
|
|
some cases, outright flaws in most of these 16550A clones.
|
|
|
|
When the NS16550 was developed, the National Semiconductor obtained
|
|
several patents on the design and they also limited licensing, making
|
|
it harder for other vendors to provide a chip with similar features.
|
|
Because of the patents, reverse-engineered designs and emulations
|
|
had to avoid infringing the claims covered by the patents.
|
|
Subsequently, these copies almost never perform exactly the same as
|
|
the NS16550A or PC16550D, which are the parts most computer and
|
|
modem makers want to buy but are sometimes unwilling to pay the
|
|
price required to get the genuine part.
|
|
|
|
Some of the differences in the clone 16550A parts are unimportant,
|
|
while others can prevent the device from being used at all with a
|
|
given operating system or driver. These differences may show up
|
|
when using other drivers, or when particular combinations of events
|
|
occur that were not well tested or considered in the Windows driver.
|
|
This is because most modem vendors and 16550-clone makers use the
|
|
Microsoft drivers from Windows for Workgroups 3.11 and the Microsoft
|
|
MSD utility as the primary tests for compatibility with the
|
|
NS16550A. This over-simplistic criteria means that if a different
|
|
operating system is used, problems could appear due to subtle
|
|
differences between the clones and genuine components.
|
|
|
|
National Semiconductor has made available a program named COMTEST
|
|
that performs compatibility tests independent of any OS drivers.
|
|
It should be remembered that the purpose of this type of program is
|
|
to demonstrate the flaws in the products of the competition, so the
|
|
program will report major as well as extremely subtle differences in
|
|
behavior in the part being tested.
|
|
|
|
In a series of tests performed by the author of this document in
|
|
1994, components made by National Semiconductor, TI, StarTech, and
|
|
CMD as well as megacells and emulations embedded in internal modems
|
|
were tested with COMTEST. A difference count for some of these
|
|
components is listed below. Because these tests were performed in
|
|
1994, they may not reflect the current performance of the given
|
|
product from a vendor.
|
|
|
|
It should be noted that COMTEST normally aborts when an excessive
|
|
number or certain types of problems have been detected. As part of
|
|
this testing, COMTEST was modified so that it would not abort no
|
|
matter how many differences were encountered.
|
|
|
|
|
|
<verb>Vendor Part number Errors aka "differences" reported
|
|
National (PC16550DV) 0 *
|
|
|
|
National (NS16550AFN) 0
|
|
|
|
National (NS16C552V) 0 *
|
|
|
|
TI (TL16550AFN) 3
|
|
|
|
CMD (16C550PE) 19
|
|
|
|
StarTech (ST16C550J) 23
|
|
|
|
Rockwell reference modem
|
|
with internal 16550 or an
|
|
emulation (RC144DPi/C3000-25) 117
|
|
|
|
Sierra modem with an internal
|
|
16550 (SC11951/SC11351) 91</verb>
|
|
|
|
<p>It is important to understand that a simple count of differences
|
|
from COMTEST does not reveal a lot about what differences are
|
|
important and which are not. For example, about half of the
|
|
differences reported in the two modems listed above that have
|
|
internal UARTs were caused by the clone UARTs not supporting
|
|
five- and six-bit character modes. The real 16550, 16450, and
|
|
8250 UARTs all support these modes and COMTEST checks the
|
|
functionality of these modes so over fifty differences are
|
|
reported. However, almost no modern modem supports five- or
|
|
six-bit characters, particularly those with error-correction
|
|
and compression capabilities. This means that the differences
|
|
related to five- and six-bit character modes can be discounted.
|
|
|
|
Many of the differences COMTEST reports have to do with timing. In
|
|
many of the clone designs, when the host reads from one port, the
|
|
status bits in some other port may not update in the same amount
|
|
of time (some faster, some slower) as a <em>real</em> NS16550AFN
|
|
and COMTEST looks for these differences. This means that the number
|
|
of differences can be misleading in that one device may only have
|
|
one or two differences but they are extremely serious, and some
|
|
other device that updates the status registers faster or slower
|
|
than the reference part (that would probably never affect the
|
|
operation of a properly written driver) could have dozens of
|
|
differences reported.
|
|
|
|
* To date, the author of this document has not found any non-National
|
|
parts that report zero differences using the COMTEST program. It
|
|
should also be noted that National has had five versions of the
|
|
16550 over the years and the newest parts behave a bit differently
|
|
than the classic NS16550AFN that is considered the benchmark for
|
|
functionality. COMTEST appears to turn a blind eye to the
|
|
differences within the National product line and reports no errors
|
|
on the National parts (except for the original 16550) even when
|
|
there are official erratas that describe bugs in the A, B and C
|
|
revisions of the parts, so this bias in COMTEST must be taken into
|
|
account.
|
|
|
|
COMTEST can be used as a screening tool to alert the administrator
|
|
to the presence of potentially incompatible components
|
|
that might cause problems or have to be handled as a special case.
|
|
|
|
If you run COMTEST on a 16550 that is in a modem or a modem is
|
|
attached to the serial port, you need to first issue a ATE0&W
|
|
command to the modem so that the modem will not echo any of the test
|
|
characters. If you forget to do this, COMTEST will report at least
|
|
this one difference:
|
|
<quote>Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61</quote>
|
|
|
|
|
|
<sect3><heading>8250/16450/16550 Registers</heading>
|
|
|
|
<p>The 8250/16450/16550 UART occupies eight contiguous I/O port
|
|
addresses. In the IBM PC, there are two defined locations for
|
|
these eight ports and they are known collectively as COM1 and COM2.
|
|
The makers of PC-clones and add-on cards have created two additional
|
|
areas known as COM3 and COM4, but these extra COM ports conflict
|
|
with other hardware on some systems. The most common conflict is
|
|
with video adapters that provide IBM 8514 emulation.
|
|
|
|
<verb>
|
|
COM1 is located from 0x3f8 to 0x3ff and normally uses IRQ 4
|
|
COM2 is located from 0x2f8 to 0x2ff and normally uses IRQ 3
|
|
COM3 is located from 0x3e8 to 0x3ef and has no standardized IRQ
|
|
COM4 is located from 0x2e8 to 0x2ef and has no standardized IRQ
|
|
</verb>
|
|
<p>A description of the I/O ports of the 8250/16450/16550 UART is
|
|
provided below.
|
|
|
|
<verb>
|
|
I/O Access Description
|
|
Port Allowed
|
|
|
|
+0x00 write Transmit Holding Register (THR)
|
|
(DLAB==0) Information written to this port are treated
|
|
as data words and will be transmitted by the
|
|
UART.
|
|
|
|
+0x00 read Receive Buffer Register (RBR)
|
|
(DLAB==0) Any data words received by the UART from the
|
|
serial link are accessed by the host by
|
|
reading this port.
|
|
|
|
|
|
+0x00 write/read Divisor Latch LSB (DLL)
|
|
(DLAB==1) This value will be divided from the master
|
|
input clock (in the IBM PC, the master
|
|
clock is 1.8432MHz) and the resulting clock
|
|
will determine the baud rate of the UART.
|
|
This register holds bits 0 thru 7 of the
|
|
divisor.
|
|
|
|
|
|
+0x01 write/read Divisor Latch MSB (DLH)
|
|
(DLAB==1) This value will be divided from the master
|
|
input clock (in the IBM PC, the master
|
|
clock is 1.8432MHz) and the resulting clock
|
|
will determine the baud rate of the UART.
|
|
This register holds bits 8 thru 15 of the
|
|
divisor.
|
|
|
|
|
|
+0x01 write/read Interrupt Enable Register (IER)
|
|
(DLAB==0) The 8250/16450/16550 UART classifies events into
|
|
one of four categories. Each category can be
|
|
configured to generate an interrupt when any of
|
|
the events occurs. The 8250/16450/16550 UART
|
|
generates a single external interrupt signal
|
|
regardless of how many events in the enabled
|
|
categories have occurred. It is up to the host
|
|
processor to respond to the interrupt and then
|
|
poll the enabled interrupt categories (usually
|
|
all categories have interrupts enabled) to
|
|
determine the true cause(s) of the interrupt.
|
|
|
|
Bit 7 Reserved, always 0.
|
|
|
|
Bit 6 Reserved, always 0.
|
|
|
|
Bit 5 Reserved, always 0.
|
|
|
|
Bit 4 Reserved, always 0.
|
|
|
|
Bit 3 Enable Modem Status Interrupt (EDSSI)
|
|
Setting this bit to "1" allows the UART
|
|
to generate an interrupt when a
|
|
change occurs on one or more of the
|
|
status lines.
|
|
|
|
Bit 2 Enable Receiver Line Status
|
|
Interrupt (ELSI)
|
|
Setting this bit to "1" causes the UART
|
|
to generate an interrupt when the
|
|
an error (or a BREAK signal) has been
|
|
detected in the incoming data.
|
|
|
|
Bit 1 Enable Transmitter Holding Register
|
|
Empty Interrupt (ETBEI)
|
|
Setting this bit to "1" causes the UART
|
|
to generate an interrupt when the
|
|
UART has room for one or more
|
|
additional characters that are to
|
|
be transmitted.
|
|
|
|
Bit 0 Enable Received Data Available
|
|
Interrupt (ERBFI)
|
|
Setting this bit to "1" causes the UART
|
|
to generate an interrupt when the UART
|
|
has received enough characters to exceed
|
|
the trigger level of the FIFO, or the
|
|
FIFO timer has expired (stale data), or
|
|
a single character has been received
|
|
when the FIFO is disabled.
|
|
|
|
|
|
+0x02 write FIFO Control Register (FCR)
|
|
(This port does not exist on the 8250 and 16450
|
|
UART.)
|
|
|
|
Bit 7 Receiver Trigger Bit #1
|
|
Bit 6 Receiver Trigger Bit #0
|
|
These two bits control at what point the
|
|
receiver is to generate an interrupt when
|
|
the FIFO is active.
|
|
|
|
7 6 How many words are received
|
|
before an interrupt is generated.
|
|
0 0 1
|
|
|
|
0 1 4
|
|
|
|
1 0 8
|
|
|
|
1 1 14
|
|
|
|
Bit 5 Reserved, always 0.
|
|
|
|
Bit 4 Reserved, always 0.
|
|
|
|
Bit 3 DMA Mode Select
|
|
If Bit 0 is set to "1" (FIFOs enabled),
|
|
setting this bit changes the operation
|
|
of the -RXRDY and -TXRDY signals from
|
|
Mode 0 to Mode 1.
|
|
|
|
Bit 2 Transmit FIFO Reset
|
|
When a "1" is written to this bit,
|
|
the contents of the FIFO are discarded.
|
|
Any word currently being transmitted
|
|
will be sent intact. This function is
|
|
useful in aborting transfers.
|
|
|
|
Bit 1 Receiver FIFO Reset
|
|
When a "1" is written to this bit,
|
|
the contents of the FIFO are discarded.
|
|
Any word currently being assembled
|
|
in the shift register will be received
|
|
intact.
|
|
|
|
Bit 0 16550 FIFO Enable
|
|
When set, both the transmit and receive
|
|
FIFOs are enabled. Any contents in the
|
|
holding register, shift registers or
|
|
FIFOs are lost when FIFOs are enabled or
|
|
disabled.
|
|
|
|
|
|
+0x02 read Interrupt Identification Register (IIR)
|
|
|
|
Bit 7 FIFOs enabled.
|
|
On the 8250/16450 UART, this bit is zero.
|
|
|
|
Bit 6 FIFOs enabled.
|
|
On the 8250/16450 UART, this bit is zero.
|
|
|
|
Bit 5 Reserved, always 0.
|
|
|
|
Bit 4 Reserved, always 0.
|
|
|
|
Bit 3 Interrupt ID Bit #2
|
|
On the 8250/16450 UART, this bit is zero.
|
|
Bit 2 Interrupt ID Bit #1
|
|
Bit 1 Interrupt ID Bit #0
|
|
These three bits combine to report
|
|
the category of event that caused the
|
|
interrupt that is in progress. These
|
|
categories have priorities, so if
|
|
multiple categories of events occur at
|
|
the same time, the UART will report the
|
|
more important events first and the host
|
|
must resolve the events in the order they
|
|
are reported. All events that caused the
|
|
current interrupt must be resolved before
|
|
any new interrupts will be generated.
|
|
(This is a limitation of the PC
|
|
architecture.)
|
|
|
|
2 1 0 Priority Description
|
|
|
|
0 1 1 First Receiver Error
|
|
(OE, PE, BI or FE)
|
|
|
|
0 1 0 Second Received Data
|
|
Available
|
|
|
|
1 1 0 Second Trigger level
|
|
identification
|
|
(Stale data in
|
|
receive buffer)
|
|
|
|
0 0 1 Third Transmitter has
|
|
room for more
|
|
words (THRE)
|
|
|
|
0 0 0 Fourth Modem Status
|
|
Change (-CTS,
|
|
-DSR, -RI, or
|
|
-DCD)
|
|
|
|
Bit 0 Interrupt Pending Bit
|
|
If this bit is set to "0", then at least
|
|
one interrupt is pending.
|
|
|
|
|
|
+0x03 write/read Line Control Register (LCR)
|
|
|
|
Bit 7 Divisor Latch Access Bit (DLAB)
|
|
When set, access to the data
|
|
transmit/receive register (THR/RBR) and
|
|
the Interrupt Enable Register (IER) is
|
|
disabled. Any access to these ports is
|
|
now redirected to the Divisor Latch
|
|
Registers. Setting this bit, loading
|
|
the Divisor Registers, and clearing
|
|
DLAB should be done with interrupts
|
|
disabled.
|
|
|
|
Bit 6 Set Break
|
|
When set to "1", the transmitter begins
|
|
to transmit continuous Spacing until
|
|
this bit is set to "0". This overrides
|
|
any bits of characters that are being
|
|
transmitted.
|
|
|
|
Bit 5 Stick Parity
|
|
When parity is enabled, setting this
|
|
bit causes parity to always be "1" or
|
|
"0", based on the value of Bit 4.
|
|
|
|
Bit 4 Even Parity Select (EPS)
|
|
When parity is enabled and Bit 5 is "0",
|
|
setting this bit causes even parity
|
|
to be transmitted and expected.
|
|
Otherwise, odd parity is used.
|
|
|
|
Bit 3 Parity Enable (PEN)
|
|
When set to "1", a parity bit is
|
|
inserted between the last bit of the
|
|
data and the Stop Bit. The UART will
|
|
also expect parity to be present in
|
|
the received data.
|
|
|
|
Bit 2 Number of Stop Bits (STB)
|
|
If set to "1" and using 5-bit data words,
|
|
1.5 Stop Bits are transmitted and
|
|
expected in each data word. For 6, 7
|
|
and 8-bit data words, 2 Stop Bits are
|
|
transmitted and expected. When this bit
|
|
is set to "0", one Stop Bit is used on
|
|
each data word.
|
|
|
|
Bit 1 Word Length Select Bit #1 (WLSB1)
|
|
Bit 0 Word Length Select Bit #0 (WLSB0)
|
|
Together these bits specify the number
|
|
of bits in each data word.
|
|
|
|
1 0 Word Length
|
|
|
|
0 0 5 Data Bits
|
|
0 1 6 Data Bits
|
|
1 0 7 Data Bits
|
|
1 1 8 Data Bits
|
|
|
|
|
|
+0x04 write/read Modem Control Register (MCR)
|
|
|
|
Bit 7 Reserved, always 0.
|
|
|
|
Bit 6 Reserved, always 0.
|
|
|
|
Bit 5 Reserved, always 0.
|
|
|
|
Bit 4 Loop-Back Enable
|
|
When set to "1", the UART transmitter
|
|
and receiver are internally connected
|
|
together to allow diagnostic operations.
|
|
In addition, the UART modem control
|
|
outputs are connected to the UART modem
|
|
control inputs. CTS is connected to RTS,
|
|
DTR is connected to DSR, OUT1 is
|
|
connected to RI, and OUT 2 is connected
|
|
to DCD.
|
|
|
|
Bit 3 OUT 2
|
|
An auxiliary output that the host
|
|
processor may set high or low.
|
|
In the IBM PC serial adapter (and most
|
|
clones), OUT 2 is used to tri-state
|
|
(disable) the interrupt signal from the
|
|
8250/16450/16550 UART.
|
|
|
|
Bit 2 OUT 1
|
|
An auxiliary output that the host
|
|
processor may set high or low.
|
|
This output is not used on the IBM PC
|
|
serial adapter.
|
|
|
|
Bit 1 Request to Send (RTS)
|
|
When set to "1", the output of the UART
|
|
-RTS line is Low (Active).
|
|
|
|
Bit 0 Data Terminal Ready (DTR)
|
|
When set to "1", the output of the UART
|
|
-DTR line is Low (Active).
|
|
|
|
|
|
+0x05 write/read Line Status Register (LSR)
|
|
|
|
Bit 7 Error in Receiver FIFO
|
|
On the 8250/16450 UART, this bit is zero.
|
|
This bit is set to "1" when any of
|
|
the bytes in the FIFO have one or more
|
|
of the following error conditions: PE,
|
|
FE, or BI.
|
|
|
|
Bit 6 Transmitter Empty (TEMT)
|
|
When set to "1", there are no words
|
|
remaining in the transmit FIFO or the
|
|
transmit shift register. The
|
|
transmitter is completely idle.
|
|
|
|
Bit 5 Transmitter Holding Register Empty (THRE)
|
|
When set to "1", the FIFO (or holding
|
|
register) now has room for at least one
|
|
additional word to transmit. The
|
|
transmitter may still be transmitting
|
|
when this bit is set to "1".
|
|
|
|
Bit 4 Break Interrupt (BI)
|
|
The receiver has detected a Break signal.
|
|
|
|
Bit 3 Framing Error (FE)
|
|
A Start Bit was detected but the Stop
|
|
Bit did not appear at the expected time.
|
|
The received word is probably garbled.
|
|
|
|
Bit 2 Parity Error (PE)
|
|
The parity bit was incorrect for the
|
|
word received.
|
|
|
|
Bit 1 Overrun Error (OE)
|
|
A new word was received and there
|
|
was no room in the receive buffer. The
|
|
newly-arrived word in the shift
|
|
register is discarded. On 8250/16450
|
|
UARTs, the word in the holding
|
|
register is discarded and the newly-
|
|
arrived word is put in the holding
|
|
register.
|
|
|
|
Bit 0 Data Ready (DR)
|
|
One or more words are in the
|
|
receive FIFO that the host may read.
|
|
A word must be completely received
|
|
and moved from the shift register into
|
|
the FIFO (or holding register for
|
|
8250/16450 designs) before this bit is
|
|
set.
|
|
|
|
|
|
+0x06 write/read Modem Status Register (MSR)
|
|
|
|
Bit 7 Data Carrier Detect (DCD)
|
|
Reflects the state of the DCD line
|
|
on the UART.
|
|
|
|
Bit 6 Ring Indicator (RI)
|
|
Reflects the state of the RI line on
|
|
the UART.
|
|
|
|
Bit 5 Data Set Ready (DSR)
|
|
Reflects the state of the DSR line on
|
|
the UART.
|
|
|
|
Bit 4 Clear To Send (CTS)
|
|
Reflects the state of the CTS line on
|
|
the UART.
|
|
|
|
Bit 3 Delta Data Carrier Detect (DDCD)
|
|
Set to "1" if the -DCD line has changed
|
|
state one more more times since the last
|
|
time the MSR was read by the host.
|
|
|
|
Bit 2 Trailing Edge Ring Indicator (TERI)
|
|
Set to "1" if the -RI line has had a
|
|
low to high transition since the last
|
|
time the MSR was read by the host.
|
|
|
|
Bit 1 Delta Data Set Ready (DDSR)
|
|
Set to "1" if the -DSR line has changed
|
|
state one more more times since the last
|
|
time the MSR was read by the host.
|
|
|
|
Bit 0 Delta Clear To Send (DCTS)
|
|
Set to "1" if the -CTS line has changed
|
|
state one more more times since the last
|
|
time the MSR was read by the host.
|
|
|
|
|
|
+0x07 write/read Scratch Register (SCR)
|
|
This register performs no function in the
|
|
UART. Any value can be written by the host to
|
|
this location and read by the host later on.
|
|
</verb>
|
|
|
|
<sect3><heading>Beyond the 16550A UART</heading>
|
|
|
|
<p>Although National Semiconductor has not offered any components
|
|
compatible with the 16550 that provide additional features,
|
|
various other vendors have. Some of these components are described
|
|
below. It should be understood that to effectively utilize these
|
|
improvements, drivers may have to be provided by the chip vendor
|
|
since most of the popular operating systems do not support features
|
|
beyond those provided by the 16550.
|
|
|
|
<descrip>
|
|
<tag>ST16650</tag>By default this part is similar to the NS16550A, but an
|
|
extended 32-byte send and receive buffer can be optionally
|
|
enabled. Made by Startech.
|
|
|
|
<tag>TIL16660</tag>By default this part behaves similar to the NS16550A,
|
|
but an extended 64-byte send and receive buffer can be
|
|
optionally enabled. Made by Texas Instruments.
|
|
|
|
<tag>Hayes ESP</tag>This proprietary plug-in card contains a 2048-byte
|
|
send and receive buffer, and supports data rates
|
|
to 230.4Kbit/sec. Made by Hayes.
|
|
</descrip>
|
|
|
|
<p>In addition to these "dumb" UARTs, many vendors produce
|
|
intelligent serial communication boards. This type of design
|
|
usually provides a microprocessor that interfaces with several
|
|
UARTs, processes and buffers the data, and then alerts the main
|
|
PC processor when necessary. Because the UARTs are not directly
|
|
accessed by the PC processor in this type of communication system,
|
|
it is not necessary for the vendor to use UARTs that are compatible
|
|
with the 8250, 16450, or the 16550 UART. This leaves the
|
|
designer free to components that may have better performance
|
|
characteristics.
|
|
|
|
<!-- 601131 ? -->
|
|
|