<!-- $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 &copy; 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
	&dollar;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 &dollar;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&amp;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 ? -->

