cgs@umd5.umd.edu (Chris G. Sylvain) (11/19/89)
----------------------cut here---------------------- echo x - uartident.c sed '/^X/s///' > uartident.c << '/' X#include <stdio.h> X X/* X The information for identifying the asyncronous serial I/O chips X was obtained from an article appearing in the July/August 1989 issue X of _Programmer's Journal_. The article was entitled "PC Communications X and Protocols", written by M. Steven Baker. X X The chip part numbers given are for the devices produced by National X Semiconductor. Other part numbers can be cross-referenced from the X Nat'l Semi. part numbers. X X Those with access to the AT(*) Technical Reference manual may X observe numerous 'JMP $+2' in the serial I/O code to generate delays X between a read and write access of the same serial I/O chip register. X X Those with access to the Nat'l Semi. data sheets on the chips may X observe the read-write delays required for the INS8250 and INS8250-B X are approximately 1755 nanoseconds. The INS8250A and INS82C50A (an X improved and debugged(!) version) offers a read-write cycle time of X about 585 nsec. The NS16540 and NS16C540 are faster still, with read- X write cycle times of less than 170 nsec. The NS16550A is an improved X 16540 chip, with the addition of separate 16 character transmit and X receive FIFO buffers, and a still faster read-write cycle. X X In summary: X X The NS16550A supports the highest baud rates (9600 and up) when both X transmit and receive FIFO buffers are enabled. X X The INS8250A, INS82C50A, NS16540, NS16C540, and NS16550A chips are X the fastest serial I/O chips, and do not require 'JMP $+2' (sic) delays X for back-to-back port I/O operations. X X The INS8250, and INS8250-B chips are slower serial I/O chips, and X require delays for back-to-back port I/O operations. X X Additional notes: X X IIR ::= Interrupt Identification Register X IER ::= Interrupt Enable Register X X The scratchpad register can be used to store anything you like, as X it is otherwise unused by the chip. X X X (*) AT is a registered trademark of International Business Machines, Inc. X X-- coded by Chris Sylvain 11/18/89. Use it in good health! X*/ X X#define FIFO 2 X#define NODELAY 1 X#define DELAY 0 X X#define TESTVAL 0xd9 X#define SCRATCH1 0x3ff /* Scratch pad register for COM1 */ X#define SCRATCH2 0x2ff /* -^- register for COM2 */ X#define IIROFFS -5 /* offset from scratchpad to IIR reg */ X#define IEROFFS -6 /* offset from -^- to IER reg */ X Xint uart_id(); Xint onOK; X Xmain() X{ X printf( "\nTesting tty port 1 [COM1:] serial I/O chip:\n" ); X uart_msg( uart_id( SCRATCH1 ) ); X X printf( "\nTesting tty port 2 [COM2:] serial I/O chip:\n" ); X uart_msg( uart_id( SCRATCH2 ) ); X X putchar( '\n' ); X} X Xuart_msg( id ) Xint id; X{ X switch (id) { X case FIFO: X printf( "\nAsync I/O chip is NS16550A. The on-chip FIFOs" ); X printf( " %s been enabled.\n", (onOK ? "have" : "have not") ); X break; X case NODELAY: X printf( "\nAsync I/O chip is either a INS8250A, INS82C50A," ); X printf( " NS16540, or NS16C540.\n" ); X break; X case DELAY: X printf( "\nAsync I/O chip is either a INS8250, or INS8250-B.\n" ); X break; X default: X printf( "\n\uart_msg panic: Unknown chip identity\n" ); X break; X } X} X Xint uart_id( padaddr ) Xint padaddr; X{ X int i; X unsigned char val; X X port_out( padaddr, TESTVAL ); X X /* pause before port_in(), in case of a fast machine with slowest chips */ X for( i = 0; i < 30; i++ ); X X port_in( padaddr, &val ); X X if (val == TESTVAL) { X /* chip might be 16550, try to enable FIFOs by setting bit 0 of IIR */ X X port_in( padaddr+IIROFFS, &val ); X port_out( padaddr+IIROFFS, (val | 0x01) ); X X port_in( padaddr+IEROFFS, &val ); X X /* If both bits 7 and 6 are set in IER, then both FIFOs are enabled */ X /* I'm not certain which bit corresponds to which FIFO. */ X X X if ( ((val & 0xc0) >> 6) == 0x03 ) { X onOK = 1; X return( FIFO ); X } X else if ( (val & 0x80) || (val & 0x40) ) { X X /* both FIFOs didn't get enabled, shut them off */ X X port_in( padaddr+IIROFFS, &val ); X port_out( padaddr+IIROFFS, (val & 0xfe) ); X X onOK = 0; X return( FIFO ); X } X else return( NODELAY ); X } X else return( DELAY ); X} X / ----------------------cut here---------------------- -- --==---==---==-- Toves: They make their nests under sundials; also they live on cheese -- ARPA: cgs@umd5.UMD.EDU BITNET: cgs%umd5@umd2 -- -- UUCP: ..!uunet!umd5.umd.edu!cgs --