home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 1 / HamRadio.cdr / misc / tcpipsrc / 8250.h < prev    next >
C/C++ Source or Header  |  1991-01-07  |  6KB  |  163 lines

  1. /* Various I/O definitions specific to asynch I/O on the IBM PC */
  2. #ifndef    _8250_H
  3. #define    _8250_H
  4.  
  5. #ifndef    _MBUF_H
  6. #include "mbuf.h"
  7. #endif
  8.  
  9. #ifndef    _IFACE_H
  10. #include "iface.h"
  11. #endif
  12.  
  13. extern int Nasy;        /* Actual number of asynch lines */
  14.  
  15. /* Output pseudo-dma control structure */
  16. struct dma {
  17.     char *data;    /* current output pointer */
  18.     unsigned short cnt;    /* byte count remaining */
  19.     char flags;    /* transmitter active */
  20. };
  21.  
  22. /* Read fifo control structure */
  23. struct fifo {
  24.     char *buf;        /* Ring buffer */
  25.     unsigned bufsize;    /* Size of ring buffer */
  26.     char *wp;        /* Write pointer */
  27.     char *rp;        /* Read pointer */
  28.     unsigned short cnt;    /* count of characters in buffer */
  29.     unsigned short hiwat;    /* High water mark */
  30.      long overrun;        /* count of sw fifo buffer overruns */
  31. };
  32.  
  33. /* Asynch controller control block */
  34. struct asy {
  35.     struct iface *iface;
  36.     struct fifo fifo;
  37.     int trigchar;        /* Fifo trigger character */
  38.     char cts_flow_control;
  39.     char rlsd_line_control;    /* RLSD indicates physical layer up/down */
  40.     struct dma dma;
  41.     struct mbuf *sndq;    /* Transmit queue */
  42.     unsigned addr;        /* Base I/O address */
  43.     unsigned vec;        /* Interrupt vector */
  44.     long speed;        /* Line speed */
  45.     long autospeed;        /* Autobaud message speed */
  46.     struct {        /* Previous configuration saved at startup */
  47.         INTERRUPT (*vec)(void);
  48.                 /* Original interrupt vector [cs:pc] */
  49.         char mask;    /* 8259 mask */
  50.         char divh,divl;    /* baud rate divisor */
  51.         char lcr;    /* line control reg */
  52.         char ier;    /* Interrupt enable register */
  53.         char mcr;    /* modem control bits */
  54.     } save;
  55.      char is_16550a;        /* 16550A detected */
  56.      long fifotimeouts;    /* hw fifo character timeout int's */
  57.      long rxints;        /* receive interrupts */
  58.      long txints;        /* transmit interrupts */
  59.     long rxchar;        /* Received characters */
  60.     long overrun;        /* Receiver hardware overrun errors */
  61.     long txchar;        /* Transmitted characters */
  62.     long rxhiwat;        /* High water mark on hardware rx fifo */
  63.     long cts_flow_ints;    /* Count of CTS flow control interrupts */
  64.         long txto;              /* Count of TX interrupt timeouts */
  65. };
  66. extern struct asy Asy[];
  67.  
  68. #define    BAUDCLK    115200L        /* 1.8432 Mhz / 16 */
  69.  
  70. /* 8250 definitions */
  71. /* Control/status register offsets from base address */
  72. #define    THR    0        /* Transmitter holding register */
  73. #define    RBR    0        /* Receiver buffer register */
  74. #define    DLL    0        /* Divisor latch LSB */
  75. #define    DLM    1        /* Divisor latch MSB */
  76. #define    IER    1        /* Interrupt enable register */
  77. #define    IIR    2        /* Interrupt ident register */
  78. #define    FCR    2        /* FIFO control register (16550A only) */
  79. #define    LCR    3        /* Line control register */
  80. #define    MCR    4        /* Modem control register */
  81. #define    LSR    5        /* Line status register */
  82. #define    MSR    6        /* Modem status register */
  83.  
  84. /* 8250 Line Control Register */
  85. #define    LCR_5BITS    0    /* 5 bit words */
  86. #define    LCR_6BITS    1    /* 6 bit words */
  87. #define    LCR_7BITS    2    /* 7 bit words */
  88. #define    LCR_8BITS    3    /* 8 bit words */
  89. #define    LCR_NSB        4    /* Number of stop bits */
  90. #define    LCR_PEN        8    /* Parity enable */
  91. #define    LCR_EPS        0x10    /* Even parity select */
  92. #define    LCR_SP        0x20    /* Stick parity */
  93. #define    LCR_SB        0x40    /* Set break */
  94. #define    LCR_DLAB    0x80    /* Divisor Latch Access Bit */
  95.  
  96. /* 8250 Line Status Register */
  97. #define    LSR_DR    1    /* Data ready */
  98. #define    LSR_OE    2    /* Overrun error */
  99. #define    LSR_PE    4    /* Parity error */
  100. #define    LSR_FE    8    /* Framing error */
  101. #define    LSR_BI    0x10    /* Break interrupt */
  102. #define    LSR_THRE 0x20    /* Transmitter line holding register empty */
  103. #define    LSR_TSRE 0x40    /* Transmitter shift register empty */
  104.  
  105. /* 8250 Interrupt Identification Register */
  106. #define    IIR_IP        1    /* 0 if interrupt pending */
  107. #define    IIR_ID        6    /* Mask for interrupt ID */
  108. #define    IIR_RLS        6    /* Receiver Line Status interrupt */
  109. #define    IIR_RDA        4    /* Receiver data available interrupt */
  110. #define    IIR_THRE    2    /* Transmitter holding register empty int */
  111. #define    IIR_MSTAT    0    /* Modem status interrupt */
  112. #define IIR_FIFO_TIMEOUT 8    /* FIFO timeout interrupt pending - 16550A */
  113. #define IIR_FIFO_ENABLED 0xc0    /* FIFO enabled (FCR0,1 = 1) - 16550A only */
  114.  
  115.  
  116. /* 8250 interrupt enable register bits */
  117. #define    IER_DAV    1    /* Data available interrupt */
  118. #define    IER_TxE    2    /* Tx buffer empty interrupt */
  119. #define    IER_RLS    4    /* Receive line status interrupt */
  120. #define    IER_MS    8    /* Modem status interrupt */
  121.  
  122. /* 8250 Modem control register */
  123. #define    MCR_DTR    1    /* Data Terminal Ready */
  124. #define    MCR_RTS    2    /* Request to Send */
  125. #define    MCR_OUT1 4    /* Out 1 (not used) */
  126. #define    MCR_OUT2 8    /* Master interrupt enable (actually OUT 2) */
  127. #define    MCR_LOOP 0x10    /* Loopback test mode */
  128.  
  129. /* 8250 Modem Status Register */
  130. #define    MSR_DCTS 1    /* Delta Clear-to-Send */
  131. #define    MSR_DDSR 2    /* Delta Data Set Ready */
  132. #define    MSR_TERI 4    /* Trailing edge ring indicator */
  133. #define    MSR_DRLSD 8    /* Delta Rx Line Signal Detect */
  134. #define    MSR_CTS    0x10    /* Clear to send */
  135. #define    MSR_DSR 0x20    /* Data set ready */
  136. #define    MSR_RI    0x40    /* Ring indicator */
  137. #define    MSR_RLSD 0x80    /* Received line signal detect */
  138.  
  139. /* 16550A FIFO control register values */
  140. #define    FIFO_ENABLE    0x01    /* enable TX & RX fifo */
  141. #define    FIFO_CLR_RX    0x02    /* clear RX fifo */
  142. #define    FIFO_CLR_TX    0x04    /* clear TX fifo */
  143. #define    FIFO_START_DMA    0x08    /* enable TXRDY/RXRDY pin DMA handshake */
  144. #define FIFO_SIZE_1    0x00    /* RX fifo trigger levels */
  145. #define FIFO_SIZE_4    0x40
  146. #define FIFO_SIZE_8    0x80
  147. #define FIFO_SIZE_14    0xC0
  148. #define FIFO_SIZE_MASK    0xC0
  149.  
  150. #define FIFO_TRIGGER_LEVEL    FIFO_SIZE_4
  151. #define FIFO_SETUP     (FIFO_ENABLE|FIFO_CLR_RX|FIFO_CLR_TX|FIFO_TRIGGER_LEVEL)
  152.  
  153. #define OUTPUT_FIFO_SIZE    16
  154.  
  155. /* In asyvec.asm: */
  156. INTERRUPT asy0vec __ARGS((void));
  157. INTERRUPT asy1vec __ARGS((void));
  158. INTERRUPT asy2vec __ARGS((void));
  159. INTERRUPT asy3vec __ARGS((void));
  160. INTERRUPT asy4vec __ARGS((void));
  161.  
  162. #endif    /* _8250_H */
  163.