Annotation of researchv9/sys/sun3/zsreg.h, revision 1.1.1.1

1.1       root        1: /*     @(#)zsreg.h 1.1 86/02/03 SMI    */
                      2: 
                      3: /*
                      4:  * Copyright (c) 1983 by Sun Microsystems, Inc.
                      5:  */
                      6: 
                      7: /*
                      8:  * Zilog 8530 SCC Serial Communications Controller
                      9:  *
                     10:  * This is a dual uart chip with on-chip baud rate generators.
                     11:  * It is about as brain-damaged as the typical modern uart chip,
                     12:  * but it does have a lot of features as well as the usual lot of
                     13:  * brain damage around addressing, write-onlyness, etc.
                     14:  */
                     15: 
                     16: /*
                     17:  * Uart registers:
                     18:  *
                     19:  * There are 16 write registers and 9 read registers in each channel.
                     20:  * As usual, the two channels are ALMOST orthogonal, not exactly.  Most regs
                     21:  * can only be written to, or read, but not both.  To access one, you must
                     22:  * first write to register 0 with the number of the register you
                     23:  * are interested in, then read/write the actual value, and hope that
                     24:  * nobody interrupts you in between.
                     25:  *
                     26:  * Note that the register&bit assignment is suspiciously like the Intel 8274.
                     27:  * Do you think they read each others' data sheets?  Can they decode them?
                     28:  */
                     29: 
                     30: /* bits in RR0 */
                     31: #define        ZSRR0_RX_READY          0x01    /* received character available */
                     32: #define ZSRR0_TIMER            0x02    /* if R15_TIMER, timer reached 0 */
                     33: #define        ZSRR0_TX_READY          0x04    /* transmit buffer empty */
                     34: #define        ZSRR0_CD                0x08    /* CD input (latched if R15_CD) */
                     35: #define ZSRR0_SYNC             0x10    /* SYNC input (latched if R15_SYNC) */
                     36: #define        ZSRR0_CTS               0x20    /* CTS input (latched if R15_CTS) */
                     37: #define ZSRR0_TXUNDER          0x40    /* (SYNC) Xmitter underran */
                     38: #define        ZSRR0_BREAK             0x80    /* received break detected */
                     39: 
                     40: /* bits in RR1 */
                     41: #define        ZSRR1_ALL_SENT          0x01    /* all chars fully transmitted */
                     42: #define        ZSRR1_PE                0x10    /* parity error (latched, must reset) */
                     43: #define        ZSRR1_DO                0x20    /* data overrun (latched, must reset) */
                     44: #define        ZSRR1_FE                0x40    /* framing/CRC error (not latched) */
                     45: #define        ZSRR1_RXEOF             0x80    /* end of recv sdlc frame */
                     46: 
                     47: /* bits in R/WR2 -- interrupt vector number. */
                     48: /* NOTE that RR2 in channel A is unmodified, while in channel B it is
                     49:    modified by the current status of the UARTs.  (This is independent
                     50:    of the setting of WR9_VIS.)  If no interrupts are pending, the modified
                     51:    status is Channel B Special Receive.  It can be written from
                     52:    either channel. */
                     53: 
                     54: /* bits in RR3 -- Interrupt Pending flags for both channels (this reg can
                     55:    only be read in Channel A, tho.  Thanks guys.) */
                     56: #define ZSRR3_IP_B_STAT                0x01    /* Ext/status int pending, chan B */
                     57: #define ZSRR3_IP_B_TX          0x02    /* Transmit int pending, chan B */
                     58: #define ZSRR3_IP_B_RX          0x04    /* Receive int pending, chan B */
                     59: #define ZSRR3_IP_A_STAT                0x08    /* Ditto for channel A */
                     60: #define ZSRR3_IP_A_TX          0x10
                     61: #define ZSRR3_IP_A_RX          0x20
                     62: 
                     63: /* bits in RR8 -- this is the same as reading the Data port */
                     64: 
                     65: /* bits in RR10 -- DPLL and SDLC Loop Mode status -- not entered*/
                     66: 
                     67: /* bits in R/WR12 -- lower byte of time constant for baud rate generator */
                     68: /*
                     69:  * The following macro can be used to generate the baud rate generator's
                     70:  * time constants.  The parameters are the input clock to the BRG (eg,
                     71:  * 5000000 for 5MHz) and the desired baud rate.  This macro assumes that
                     72:  * the clock needed is 16x the desired baud rate.
                     73:  */
                     74: #define ZSTimeConst(InputClock, BaudRate) (( InputClock / (2*BaudRate*16)) - 2)
                     75: 
                     76: /* bits in R/WR13 -- upper byte of time constant for baud rate generator */
                     77: 
                     78: /* bits in R/WR15 -- interrupt enables for status conditions */
                     79: #define ZSR15_TIMER            0x02    /* ie if baud rate generator = 0 */
                     80: #define ZSR15_CD               0x08    /* ie transition on CD (car. det.) */
                     81: #define ZSR15_SYNC             0x10    /* ie transition on SYNC (gen purp) */
                     82: #define ZSR15_CTS              0x20    /* ie transition on CTS (clr to send) */
                     83: #define ZSR15_TX_UNDER         0x40    /* (SYNC) ie transmit underrun */
                     84: #define ZSR15_BREAK            0x80    /* ie on start, and end, of break */
                     85: 
                     86: /* Write register 0 -- common commands and Register Pointers */
                     87: #define ZSWR0_REG              0x0F    /* mask: next reg to read/write */
                     88: #define        ZSWR0_RESET_STATUS      0x10    /* reset status bit latches */
                     89: #define ZSWR0_FIRST_RX         0x20    /* in WR1_RX_FIRST_IE, enab next int */
                     90: #define        ZSWR0_RESET_TXINT       0x28    /* reset transmitter interrupt */
                     91: #define        ZSWR0_RESET_ERRORS      0x30    /* reset read character errors */
                     92: #define        ZSWR0_CLR_INTR          0x38    /* Reset Interrupt In Service */
                     93: #define ZSWR0_RESET_RXCRC       0x40    /*  Reset Rx CRC generator.     */
                     94: #define ZSWR0_RESET_TXCRC       0x80    /*  Reset Tx CRC generator.     */
                     95: #define ZSWR0_RESET_EOM         0xC0    /*  Reset Tx underrun / EOM.    */
                     96: 
                     97: /* bits in WR1 */
                     98: #define        ZSWR1_SIE               0x01    /* status change master int enable */
                     99:                                        /* Also see R15 for individual enabs */
                    100: #define        ZSWR1_TIE               0x02    /* transmitter interrupt enable */
                    101: #define        ZSWR1_PARITY_SPECIAL    0x04    /* parity err causes special rx int */
                    102: #define ZSWR1_RX_FIRST_IE      0x08    /* r.i.e. on 1st char of msg */
                    103: #define        ZSWR1_RIE               0x10    /* receiver interrupt enable */
                    104: /* There are other Receive interrupt options defined, see data sheet. */
                    105: 
                    106: /* bits in WR2 are defined above as R/WR2. */
                    107: 
                    108: /* bits in WR3 */
                    109: #define        ZSWR3_RX_ENABLE         0x01    /* receiver enable */
                    110: #define        ZSWR3_RXCRC_ENABLE      0x08    /* receiver CRC enable */
                    111: #define        ZSWR3_HUNT              0x10    /* enter hunt mode */
                    112: #define        ZSWR3_AUTO_CD_CTS       0x20    /* auto-enable CD&CTS rcv&xmit ctl */
                    113: #define ZSWR3_RX_5             0x00    /* receive 5-bit characters */
                    114: #define        ZSWR3_RX_6              0x80    /* receive 6 bit characters */
                    115: #define        ZSWR3_RX_7              0x40    /* receive 7 bit characters */
                    116: #define        ZSWR3_RX_8              0xC0    /* receive 8 bit characters */
                    117: 
                    118: /* bits in WR4 */
                    119: #define        ZSWR4_PARITY_ENABLE     0x01    /* Gen/check parity bit */
                    120: #define        ZSWR4_PARITY_EVEN       0x02    /* Gen/check even parity */
                    121: #define        ZSWR4_1_STOP            0x04    /* 1 stop bit */
                    122: #define        ZSWR4_1_5_STOP          0x08    /* 1.5 stop bits */
                    123: #define        ZSWR4_2_STOP            0x0C    /* 2 stop bits */
                    124: #define        ZSWR4_SDLC              0x20    /* SDLC mode */
                    125: #define ZSWR4_X1_CLK           0x00    /* clock is 1x */
                    126: #define        ZSWR4_X16_CLK           0x40    /* clock is 16x */
                    127: #define ZSWR4_X32_CLK          0x80    /* clock is 32x */
                    128: #define ZSWR4_X64_CLK          0xC0    /* clock is 64x */
                    129: 
                    130: /* bits in WR5 */
                    131: #define        ZSWR5_TXCRC_ENABLE      0x01    /* transmitter CRC enable */
                    132: #define        ZSWR5_RTS               0x02    /* RTS output */
                    133: #define        ZSWR5_TX_ENABLE         0x08    /* transmitter enable */
                    134: #define        ZSWR5_BREAK             0x10    /* send break continuously */
                    135: #define        ZSWR5_TX_5              0x00    /* transmit 5 bit chars or less */
                    136: #define        ZSWR5_TX_6              0x40    /* transmit 6 bit characters */
                    137: #define        ZSWR5_TX_7              0x20    /* transmit 7 bit characters */
                    138: #define        ZSWR5_TX_8              0x60    /* transmit 8 bit characters */
                    139: #define        ZSWR5_DTR               0x80    /* DTR output */
                    140: 
                    141: /* bits in WR6 -- Sync characters or SDLC address field. */
                    142: 
                    143: /* bits in WR7 -- Sync character or SDLC flag */
                    144: 
                    145: /* bits in WR8 -- transmit buffer.  Same as writing to data port. */
                    146: 
                    147: /* bits in WR9 -- Master interrupt control and reset.  Accessible thru
                    148:    either channel, there's only one of them. */
                    149: #define ZSWR9_VECTOR_INCL_STAT 0x01    /* Include status bits in int vector */
                    150: #define ZSWR9_NO_VECTOR                0x02    /* Do not respond to int ack cycles */
                    151: #define ZSWR9_DIS_LOWER_CHAIN  0x04    /* Disable ints lower in daisy chain */
                    152: #define ZSWR9_MASTER_IE                0x08    /* Master interrupt enable */
                    153: #define ZSWR9_STAT_HIGH                0x10    /* Modify ivec bits 6-4, not 1-3 */
                    154: #define ZSWR9_RESET_CHAN_B     0x40    /* Reset just channel B */
                    155: #define ZSWR9_RESET_CHAN_A     0x80    /* Reset just channel A */
                    156: #define ZSWR9_RESET_WORLD      0xC0    /* Force hardware reset */
                    157: 
                    158: /* bits in WR10 -- SDLC, NRZI, FM control bits */
                    159: #define        ZSWR10_UNDERRUN_ABORT   0x04    /* send abort on TX underrun */
                    160: #define        ZSWR10_PRESET_ONES      0x80    /* preset CRC to ones (SDLC) */
                    161: 
                    162: /* bits in WR11 -- clock mode control */
                    163: #define ZSWR11_TRXC_XTAL       0x00    /* TRxC output = xtal osc */
                    164: #define ZSWR11_TRXC_XMIT       0x01    /* TRxC output = xmitter clk */
                    165: #define ZSWR11_TRXC_BAUD       0x02    /* TRxC output = baud rate gen */
                    166: #define ZSWR11_TRXC_DPLL       0x03    /* TRxC output = Phase Locked Loop */
                    167: #define ZSWR11_TRXC_OUT_ENA    0x04    /* TRxC output enable (unless input) */
                    168: #define ZSWR11_TXCLK_RTXC      0x00    /* Tx clock is RTxC pin */
                    169: #define ZSWR11_TXCLK_TRXC      0x08    /* Tx clock is TRxC pin */
                    170: #define ZSWR11_TXCLK_BAUD      0x10    /* Tx clock is baud rate gen output */
                    171: #define ZSWR11_TXCLK_DPLL      0x18    /* Tx clock is Phase Locked Loop o/p */
                    172: #define ZSWR11_RXCLK_RTXC      0x00    /* Rx clock is RTxC pin */
                    173: #define ZSWR11_RXCLK_TRXC      0x20    /* Rx clock is TRxC pin */
                    174: #define ZSWR11_RXCLK_BAUD      0x40    /* Rx clock is baud rate gen output */
                    175: #define ZSWR11_RXCLK_DPLL      0x60    /* Rx clock is Phase Locked Loop o/p */
                    176: #define ZSWR11_RTXC_XTAL       0x80    /* RTxC uses crystal, not TTL signal */
                    177: 
                    178: /* bits in WR12 -- described above as R/WR12 */
                    179: 
                    180: /* bits in WR13 -- described above as R/WR13 */
                    181: 
                    182: /* bits in WR14 -- misc control bits, and DPLL control */
                    183: #define ZSWR14_BAUD_ENA                0x01    /* enables baud rate counter */
                    184: #define ZSWR14_BAUD_FROM_PCLK  0x02    /* Baud rate gen src = PCLK not RTxC */
                    185: #define ZSWR14_DTR_IS_REQUEST  0x04    /* Changes DTR line to DMA Request */
                    186: #define ZSWR14_AUTO_ECHO       0x08    /* Echoes RXD to TXD */
                    187: #define ZSWR14_LOCAL_LOOPBACK  0x10    /* Echoes TX to RX in chip */
                    188: #define ZSWR14_DPLL_NOP                0x00    /* These 8 commands are mut. exclu. */
                    189: #define ZSWR14_DPLL_SEARCH     0x20    /* Enter search mode in DPLL */
                    190: #define ZSWR14_DPLL_RESET      0x40    /* Reset missing clock in DPLL */
                    191: #define ZSWR14_DPLL_DISABLE    0x60    /* Disable DPLL */
                    192: #define ZSWR14_DPLL_SRC_BAUD   0x80    /* Source for DPLL is baud rate gen */
                    193: #define ZSWR14_DPLL_SRC_RTXC   0xA0    /* Source for DPLL is RTxC pin */
                    194: #define ZSWR14_DPLL_FM         0xC0    /* DPLL should run in FM mode */
                    195: #define ZSWR14_DPLL_NRZI       0xE0    /* DPLL should run in NRZI mode */
                    196: 
                    197: /* bits in WR15 -- described above as R/WR15 */
                    198: 
                    199: /*
                    200:  * UART register addressing
                    201:  *
                    202:  * It would be nice if they used 4 address pins to address 15 registers,
                    203:  * but they only used 1.  So you have to write to the control port then
                    204:  * read or write it; the 2nd cycle is done to whatever register number
                    205:  * you wrote in the first cycle.
                    206:  *
                    207:  * The data register can also be accessed as Read/Write register 8.
                    208:  */
                    209: #ifndef LOCORE
                    210: struct zscc_device {
                    211:        unsigned char   zscc_control;
                    212:        unsigned char   :8;             /* Filler */
                    213:        unsigned char   zscc_data;
                    214:        unsigned char   :8;             /* Filler */
                    215: };
                    216: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.