The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/chips/scc_8530.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* 
    2  * Mach Operating System
    3  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
    4  * All Rights Reserved.
    5  * 
    6  * Permission to use, copy, modify and distribute this software and its
    7  * documentation is hereby granted, provided that both the copyright
    8  * notice and this permission notice appear in all copies of the
    9  * software, derivative works or modified versions, and any portions
   10  * thereof, and that both notices appear in supporting documentation.
   11  * 
   12  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
   13  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
   14  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
   15  * 
   16  * Carnegie Mellon requests users of this software to return to
   17  * 
   18  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
   19  *  School of Computer Science
   20  *  Carnegie Mellon University
   21  *  Pittsburgh PA 15213-3890
   22  * 
   23  * any improvements or extensions that they make and grant Carnegie Mellon
   24  * the rights to redistribute these changes.
   25  */
   26 /*
   27  * HISTORY
   28  * $Log:        scc_8530.h,v $
   29  * Revision 2.5  93/05/10  20:08:33  rvb
   30  *      Lint.
   31  *      [93/05/06  09:56:51  af]
   32  * 
   33  * Revision 2.4  93/02/05  08:06:56  danner
   34  *      Generalized register access, to accomodate Alpha.
   35  *      [93/02/04  01:27:21  af]
   36  * 
   37  * Revision 2.3  92/02/19  16:46:06  elf
   38  *      Revised, based on Intel documentation for the 82530:
   39  *      "Microcommunications Handbook", Vol 1-2, 1990.
   40  *      [92/01/22            af]
   41  * 
   42  * Revision 2.2  91/08/24  11:52:49  af
   43  *      Created, from the Zilog specs:
   44  *      "Z8530 SCC Serial Communications Controller, Product Specification"
   45  *      in the "1983/84 Components Data Book" pp 409-429, September 1983
   46  *      Zilog, Campbell, CA 95008
   47  *      [91/06/21            af]
   48  * 
   49  */
   50 /*
   51  *      File: scc_8530.h
   52  *      Author: Alessandro Forin, Carnegie Mellon University
   53  *      Date:   6/91
   54  *
   55  *      Definitions for the Zilog Z8530 SCC serial line chip
   56  */
   57 
   58 #ifndef _SCC_8530_H_
   59 #define _SCC_8530_H_
   60 
   61 /*
   62  * Register map, needs definition of the alignment
   63  * used on the specific machine.
   64  * #define the 'scc_register_t' data type before
   65  * including this header file.  For restrictions on
   66  * access modes define the set/get_datum macros.
   67  * We provide defaults ifnot.
   68  */
   69 
   70 #ifndef scc_register_t
   71 
   72 typedef struct scc_register {
   73     volatile unsigned char      datum;
   74 } scc_register_t;
   75 
   76 #endif
   77 
   78 
   79 #define SCC_CHANNEL_A   1
   80 #define SCC_CHANNEL_B   0
   81 
   82 typedef struct {
   83     /* Channel B is first, then A */
   84     struct {
   85         scc_register_t  scc_command;    /* reg select */
   86         scc_register_t  scc_data;       /* Rx/Tx buffer */
   87     } scc_channel[2];
   88 } scc_regmap_t;
   89 
   90 
   91 #ifndef scc_set_datum
   92 #define scc_set_datum(d,v)      (d) = (v)
   93 #define scc_get_datum(d,v)      (v) = (d)
   94 #endif
   95 
   96 #define scc_init_reg(scc,chan)          { \
   97                 char tmp; \
   98                 scc_get_datum((scc)->scc_channel[(chan)].scc_command.datum,tmp); \
   99                 scc_get_datum((scc)->scc_channel[(chan)].scc_command.datum,tmp); \
  100         }
  101 
  102 #define scc_read_reg(scc,chan,reg,val)  { \
  103                 scc_set_datum((scc)->scc_channel[(chan)].scc_command.datum,reg); \
  104                 scc_get_datum((scc)->scc_channel[(chan)].scc_command.datum,val); \
  105         }
  106 
  107 #define scc_read_reg_zero(scc,chan,val) { \
  108                 scc_get_datum((scc)->scc_channel[(chan)].scc_command.datum,val); \
  109         }
  110 
  111 #define scc_write_reg(scc,chan,reg,val) { \
  112                 scc_set_datum((scc)->scc_channel[(chan)].scc_command.datum,reg); \
  113                 scc_set_datum((scc)->scc_channel[(chan)].scc_command.datum,val); \
  114         }
  115 
  116 #define scc_write_reg_zero(scc,chan,val) { \
  117                 scc_set_datum((scc)->scc_channel[(chan)].scc_command.datum,val); \
  118         }
  119 
  120 #define scc_read_data(scc,chan,val)     { \
  121                 scc_get_datum((scc)->scc_channel[(chan)].scc_data.datum,val); \
  122         }
  123 
  124 #define scc_write_data(scc,chan,val) { \
  125                 scc_set_datum((scc)->scc_channel[(chan)].scc_data.datum,val); \
  126         }
  127 
  128 /*
  129  * Addressable registers
  130  */
  131 
  132 #define SCC_RR0         0       /* status register */
  133 #define SCC_RR1         1       /* special receive conditions */
  134 #define SCC_RR2         2       /* (modified) interrupt vector */
  135 #define SCC_RR3         3       /* interrupts pending (cha A only) */
  136 #define SCC_RR8         8       /* recv buffer (alias for data) */
  137 #define SCC_RR10        10      /* sdlc status */
  138 #define SCC_RR12        12      /* BRG constant, low part */
  139 #define SCC_RR13        13      /* BRG constant, high part */
  140 #define SCC_RR15        15      /* interrupts currently enabled */
  141 
  142 #define SCC_WR0         0       /* reg select, and commands */
  143 #define SCC_WR1         1       /* interrupt and DMA enables */
  144 #define SCC_WR2         2       /* interrupt vector */
  145 #define SCC_WR3         3       /* receiver params and enables */
  146 #define SCC_WR4         4       /* clock/char/parity params */
  147 #define SCC_WR5         5       /* xmit params and enables */
  148 #define SCC_WR6         6       /* synchr SYNCH/address */
  149 #define SCC_WR7         7       /* synchr SYNCH/flag */
  150 #define SCC_WR8         8       /* xmit buffer (alias for data) */
  151 #define SCC_WR9         9       /* vectoring and resets */
  152 #define SCC_WR10        10      /* synchr params */
  153 #define SCC_WR11        11      /* clocking definitions */
  154 #define SCC_WR12        12      /* BRG constant, low part */
  155 #define SCC_WR13        13      /* BRG constant, high part */
  156 #define SCC_WR14        14      /* BRG enables and commands */
  157 #define SCC_WR15        15      /* interrupt enables */
  158 
  159 /*
  160  * Read registers defines
  161  */
  162 
  163 #define SCC_RR0_BREAK           0x80    /* break detected (rings twice), or */
  164 #define SCC_RR0_ABORT           0x80    /* abort (synchr) */
  165 #define SCC_RR0_TX_UNDERRUN     0x40    /* xmit buffer empty/end of message */
  166 #define SCC_RR0_CTS             0x20    /* clear-to-send pin active (sampled
  167                                            only on intr and after RESI cmd */
  168 #define SCC_RR0_SYNCH           0x10    /* SYNCH found/still hunting */
  169 #define SCC_RR0_DCD             0x08    /* carrier-detect (same as CTS) */
  170 #define SCC_RR0_TX_EMPTY        0x04    /* xmit buffer empty */
  171 #define SCC_RR0_ZERO_COUNT      0x02    /* ? */
  172 #define SCC_RR0_RX_AVAIL        0x01    /* recv fifo not empty */
  173 
  174 #define SCC_RR1_EOF             0x80    /* end-of-frame, SDLC mode */
  175 #define SCC_RR1_CRC_ERR         0x40    /* incorrect CRC or.. */
  176 #define SCC_RR1_FRAME_ERR       0x40    /* ..bad frame */
  177 #define SCC_RR1_RX_OVERRUN      0x20    /* rcv fifo overflow */
  178 #define SCC_RR1_PARITY_ERR      0x10    /* incorrect parity in data */
  179 #define SCC_RR1_RESIDUE0        0x08
  180 #define SCC_RR1_RESIDUE1        0x04
  181 #define SCC_RR1_RESIDUE2        0x02
  182 #define SCC_RR1_ALL_SENT        0x01
  183 
  184 /* RR2 contains the interrupt vector unmodified (channel A) or
  185    modified as follows (channel B, if vector-include-status) */
  186 
  187 #define SCC_RR2_STATUS(val)     ((val)&0xf)
  188 
  189 #define SCC_RR2_B_XMIT_DONE     0x0
  190 #define SCC_RR2_B_EXT_STATUS    0x2
  191 #define SCC_RR2_B_RECV_DONE     0x4
  192 #define SCC_RR2_B_RECV_SPECIAL  0x6
  193 #define SCC_RR2_A_XMIT_DONE     0x8
  194 #define SCC_RR2_A_EXT_STATUS    0xa
  195 #define SCC_RR2_A_RECV_DONE     0xc
  196 #define SCC_RR2_A_RECV_SPECIAL  0xe
  197 
  198 /* Interrupts pending, to be read from channel A only (B raz) */
  199 #define SCC_RR3_zero            0xc0
  200 #define SCC_RR3_RX_IP_A         0x20
  201 #define SCC_RR3_TX_IP_A         0x10
  202 #define SCC_RR3_EXT_IP_A        0x08
  203 #define SCC_RR3_RX_IP_B         0x04
  204 #define SCC_RR3_TX_IP_B         0x02
  205 #define SCC_RR3_EXT_IP_B        0x01
  206 
  207 /* RR8 is the receive data buffer, a 3 deep FIFO */
  208 #define SCC_RECV_BUFFER         SCC_RR8
  209 #define SCC_RECV_FIFO_DEEP      3
  210 
  211 #define SCC_RR10_1CLKS          0x80
  212 #define SCC_RR10_2CLKS          0x40
  213 #define SCC_RR10_zero           0x2d
  214 #define SCC_RR10_LOOP_SND       0x10
  215 #define SCC_RR10_ON_LOOP        0x02
  216 
  217 /* RR12/RR13 hold the timing base, upper byte in RR13 */
  218 
  219 #define scc_get_timing_base(scc,chan,val)       { \
  220                 register char   tmp;    \
  221                 scc_read_reg(scc,chan,SCC_RR12,val);\
  222                 scc_read_reg(scc,chan,SCC_RR13,tmp);\
  223                 (val) = ((val)<<8)|(tmp&0xff);\
  224         }
  225 
  226 #define SCC_RR15_BREAK_IE       0x80
  227 #define SCC_RR15_TX_UNDERRUN_IE 0x40
  228 #define SCC_RR15_CTS_IE         0x20
  229 #define SCC_RR15_SYNCH_IE       0x10
  230 #define SCC_RR15_DCD_IE         0x08
  231 #define SCC_RR15_zero           0x05
  232 #define SCC_RR15_ZERO_COUNT_IE  0x02
  233 
  234 
  235 /*
  236  * Write registers defines
  237  */
  238 
  239 /* WR0 is used for commands too */
  240 #define SCC_RESET_TXURUN_LATCH  0xc0
  241 #define SCC_RESET_TX_CRC        0x80
  242 #define SCC_RESET_RX_CRC        0x40
  243 #define SCC_RESET_HIGHEST_IUS   0x38    /* channel A only */
  244 #define SCC_RESET_ERROR         0x30
  245 #define SCC_RESET_TX_IP         0x28
  246 #define SCC_IE_NEXT_CHAR        0x20
  247 #define SCC_SEND_SDLC_ABORT     0x18
  248 #define SCC_RESET_EXT_IP        0x10
  249 
  250 #define SCC_WR1_DMA_ENABLE      0x80    /* dma control */
  251 #define SCC_WR1_DMA_MODE        0x40    /* drive ~req for DMA controller */
  252 #define SCC_WR1_DMA_RECV_DATA   0x20    /* from wire to host memory */
  253                                         /* interrupt enable/conditions */
  254 #define SCC_WR1_RXI_SPECIAL_O   0x18    /* on special only */
  255 #define SCC_WR1_RXI_ALL_CHAR    0x10    /* on each char, or special */
  256 #define SCC_WR1_RXI_FIRST_CHAR  0x08    /* on first char, or special */
  257 #define SCC_WR1_RXI_DISABLE     0x00    /* never on recv */
  258 #define SCC_WR1_PARITY_IE       0x04    /* on parity errors */
  259 #define SCC_WR1_TX_IE           0x02
  260 #define SCC_WR1_EXT_IE          0x01
  261 
  262 /* WR2 is common and contains the interrupt vector (high nibble) */
  263 
  264 #define SCC_WR3_RX_8_BITS       0xc0
  265 #define SCC_WR3_RX_6_BITS       0x80
  266 #define SCC_WR3_RX_7_BITS       0x40
  267 #define SCC_WR3_RX_5_BITS       0x00
  268 #define SCC_WR3_AUTO_ENABLE     0x20
  269 #define SCC_WR3_HUNT_MODE       0x10
  270 #define SCC_WR3_RX_CRC_ENABLE   0x08
  271 #define SCC_WR3_SDLC_SRCH       0x04
  272 #define SCC_WR3_INHIBIT_SYNCH   0x02
  273 #define SCC_WR3_RX_ENABLE       0x01
  274 
  275 /* Should be re-written after reset */
  276 #define SCC_WR4_CLK_x64         0xc0    /* clock divide factor */
  277 #define SCC_WR4_CLK_x32         0x80
  278 #define SCC_WR4_CLK_x16         0x40
  279 #define SCC_WR4_CLK_x1          0x00
  280 #define SCC_WR4_EXT_SYNCH_MODE  0x30    /* synch modes */
  281 #define SCC_WR4_SDLC_MODE       0x20
  282 #define SCC_WR4_16BIT_SYNCH     0x10
  283 #define SCC_WR4_8BIT_SYNCH      0x00
  284 #define SCC_WR4_2_STOP          0x0c    /* asynch modes */
  285 #define SCC_WR4_1_5_STOP        0x08
  286 #define SCC_WR4_1_STOP          0x04
  287 #define SCC_WR4_SYNCH_MODE      0x00
  288 #define SCC_WR4_EVEN_PARITY     0x02
  289 #define SCC_WR4_PARITY_ENABLE   0x01
  290 
  291 #define SCC_WR5_DTR             0x80    /* drive DTR pin */
  292 #define SCC_WR5_TX_8_BITS       0x60
  293 #define SCC_WR5_TX_6_BITS       0x40
  294 #define SCC_WR5_TX_7_BITS       0x20
  295 #define SCC_WR5_TX_5_BITS       0x00
  296 #define SCC_WR5_SEND_BREAK      0x10
  297 #define SCC_WR5_TX_ENABLE       0x08
  298 #define SCC_WR5_CRC_16          0x04    /* CRC if non zero, .. */
  299 #define SCC_WR5_SDLC            0x00    /* ..SDLC otherwise  */
  300 #define SCC_WR5_RTS             0x02    /* drive RTS pin */
  301 #define SCC_WR5_TX_CRC_ENABLE   0x01
  302 
  303 /* Registers WR6 and WR7 are for synch modes data, with among other things: */
  304 
  305 #define SCC_WR6_BISYNCH_12      0x0f
  306 #define SCC_WR6_SDLC_RANGE_MASK 0x0f
  307 #define SCC_WR7_SDLC_FLAG       0x7e
  308 
  309 /* WR8 is the transmit data buffer (no FIFO) */
  310 #define SCC_XMT_BUFFER          SCC_WR8
  311 
  312 #define SCC_WR9_HW_RESET        0xc0    /* force hardware reset */
  313 #define SCC_WR9_RESET_CHA_A     0x80
  314 #define SCC_WR9_RESET_CHA_B     0x40
  315 #define SCC_WR9_NON_VECTORED    0x20    /* mbz for Zilog chip */
  316 #define SCC_WR9_STATUS_HIGH     0x10
  317 #define SCC_WR9_MASTER_IE       0x08
  318 #define SCC_WR9_DLC             0x04    /* disable-lower-chain */
  319 #define SCC_WR9_NV              0x02    /* no vector */
  320 #define SCC_WR9_VIS             0x01    /* vector-includes-status */
  321 
  322 #define SCC_WR10_CRC_PRESET     0x80
  323 #define SCC_WR10_FM0            0x60
  324 #define SCC_WR10_FM1            0x40
  325 #define SCC_WR10_NRZI           0x20
  326 #define SCC_WR10_NRZ            0x00
  327 #define SCC_WR10_ACTIVE_ON_POLL 0x10
  328 #define SCC_WR10_MARK_IDLE      0x08    /* flag if zero */
  329 #define SCC_WR10_ABORT_ON_URUN  0x04    /* flag if zero */
  330 #define SCC_WR10_LOOP_MODE      0x02
  331 #define SCC_WR10_6BIT_SYNCH     0x01
  332 #define SCC_WR10_8BIT_SYNCH     0x00
  333 
  334 #define SCC_WR11_RTxC_XTAL      0x80    /* RTxC pin is input (ext oscill) */
  335 #define SCC_WR11_RCLK_DPLL      0x60    /* clock received data on dpll */
  336 #define SCC_WR11_RCLK_BAUDR     0x40    /* .. on BRG */
  337 #define SCC_WR11_RCLK_TRc_PIN   0x20    /* .. on TRxC pin */
  338 #define SCC_WR11_RCLK_RTc_PIN   0x00    /* .. on RTxC pin */
  339 #define SCC_WR11_XTLK_DPLL      0x18
  340 #define SCC_WR11_XTLK_BAUDR     0x10
  341 #define SCC_WR11_XTLK_TRc_PIN   0x08
  342 #define SCC_WR11_XTLK_RTc_PIN   0x00
  343 #define SCC_WR11_TRc_OUT        0x04    /* drive TRxC pin as output from..*/
  344 #define SCC_WR11_TRcOUT_DPLL    0x03    /* .. the dpll */
  345 #define SCC_WR11_TRcOUT_BAUDR   0x02    /* .. the BRG */
  346 #define SCC_WR11_TRcOUT_XMTCLK  0x01    /* .. the xmit clock */
  347 #define SCC_WR11_TRcOUT_XTAL    0x00    /* .. the external oscillator */
  348 
  349 /* WR12/WR13 are for timing base preset */
  350 #define scc_set_timing_base(scc,chan,val)       { \
  351                 scc_write_reg(scc,chan,SCC_RR12,val);\
  352                 scc_write_reg(scc,chan,SCC_RR13,(val)>>8);\
  353         }
  354 
  355 /* More commands in this register */
  356 #define SCC_WR14_NRZI_MODE      0xe0    /* synch modulations */
  357 #define SCC_WR14_FM_MODE        0xc0
  358 #define SCC_WR14_RTc_SOURCE     0xa0    /* clock is from pin .. */
  359 #define SCC_WR14_BAUDR_SOURCE   0x80    /* .. or internal BRG */
  360 #define SCC_WR14_DISABLE_DPLL   0x60
  361 #define SCC_WR14_RESET_CLKMISS  0x40
  362 #define SCC_WR14_SEARCH_MODE    0x20
  363 /* ..and more bitsy */
  364 #define SCC_WR14_LOCAL_LOOPB    0x10
  365 #define SCC_WR14_AUTO_ECHO      0x08
  366 #define SCC_WR14_DTR_REQUEST    0x04
  367 #define SCC_WR14_BAUDR_SRC      0x02
  368 #define SCC_WR14_BAUDR_ENABLE   0x01
  369 
  370 #define SCC_WR15_BREAK_IE       0x80
  371 #define SCC_WR15_TX_UNDERRUN_IE 0x40
  372 #define SCC_WR15_CTS_IE         0x20
  373 #define SCC_WR15_SYNCHUNT_IE    0x10
  374 #define SCC_WR15_DCD_IE         0x08
  375 #define SCC_WR15_zero           0x05
  376 #define SCC_WR15_ZERO_COUNT_IE  0x02
  377 
  378 
  379 #endif  /*_SCC_8530_H_*/

Cache object: 00f06cade0a70cf714f6b0f6ccfc30c2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.