spifreg.h revision 1.1
1214152Sed/* $OpenBSD: spifreg.h,v 1.1 2002/01/13 02:06:46 jason Exp $ */ 2214152Sed 3214152Sed/* 4214152Sed * Copyright (c) 1999-2002 Jason L. Wright (jason@thought.net) 5222656Sed * All rights reserved. 6222656Sed * 7214152Sed * Redistribution and use in source and binary forms, with or without 8214152Sed * modification, are permitted provided that the following conditions 9214152Sed * are met: 10214152Sed * 1. Redistributions of source code must retain the above copyright 11214152Sed * notice, this list of conditions and the following disclaimer. 12214152Sed * 2. Redistributions in binary form must reproduce the above copyright 13214152Sed * notice, this list of conditions and the following disclaimer in the 14214152Sed * documentation and/or other materials provided with the distribution. 15214152Sed * 3. All advertising materials mentioning features or use of this software 16214152Sed * must display the following acknowledgement: 17214152Sed * This product includes software developed by Jason L. Wright 18214152Sed * 4. The name of the author may not be used to endorse or promote products 19229135Sed * derived from this software without specific prior written permission. 20214152Sed * 21214152Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22229135Sed * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23229135Sed * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24229135Sed * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 25229135Sed * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26214152Sed * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 27214152Sed * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28214152Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#define PPC_IN_PDATA 0x000 /* input data */ 35#define PPC_IN_PSTAT 0x001 /* input status */ 36#define PPC_IN_CTRL 0x002 /* input control */ 37#define PPC_IN_PWEIRD 0x003 /* input weird */ 38#define PPC_OUT_PDATA 0x000 /* output data */ 39#define PPC_OUT_PSTAT 0x001 /* output status */ 40#define PPC_OUT_PCTRL 0x002 /* output control */ 41#define PPC_OUT_PWEIRD 0x003 /* output weird */ 42#define PPC_IACK_PDATA 0x1fc /* iack data */ 43#define PPC_IACK_PSTAT 0x1fd /* iack status */ 44#define PPC_IACK_PCTRL 0x1fe /* iack control */ 45#define PPC_IACK_PWEIRD 0x1ff /* iack weird */ 46 47/* Parallel Status: read only */ 48#define PPC_PSTAT_ERROR 0x08 /* error */ 49#define PPC_PSTAT_SELECT 0x10 /* select */ 50#define PPC_PSTAT_PAPER 0x20 /* paper out */ 51#define PPC_PSTAT_ACK 0x40 /* ack */ 52#define PPC_PSTAT_BUSY 0x80 /* busy */ 53 54/* Parallel Control: read/write */ 55#define PPC_CTRL_STROBE 0x01 /* strobe, 1=drop strobe */ 56#define PPC_CTRL_AFX 0x02 /* auto form-feed */ 57#define PPC_CTRL_INIT 0x04 /* init, 1=enable printer */ 58#define PPC_CTRL_SLCT 0x08 /* SLC, 1=select printer */ 59#define PPC_CTRL_IRQE 0x10 /* IRQ, 1=enable intrs */ 60#define PPC_CTRL_OUTPUT 0x20 /* direction: 1=ppc out */ 61 62/* 63 * The 'stc' is a Cirrus Logic CL-CD180 (either revision B or revision C) 64 */ 65#define STC_CCR 0x01 /* channel command */ 66#define STC_SRER 0x02 /* service request enable */ 67#define STC_COR1 0x03 /* channel option 1 */ 68#define STC_COR2 0x04 /* channel option 2 */ 69#define STC_COR3 0x05 /* channel option 3 */ 70#define STC_CCSR 0x06 /* channel control status */ 71#define STC_RDCR 0x07 /* rx data count */ 72#define STC_SCHR1 0x09 /* special character 1 */ 73#define STC_SCHR2 0x0a /* special character 2 */ 74#define STC_SCHR3 0x0b /* special character 3 */ 75#define STC_SCHR4 0x0c /* special character 4 */ 76#define STC_MCOR1 0x10 /* modem change option 1 */ 77#define STC_MCOR2 0x11 /* modem change option 2 */ 78#define STC_MCR 0x12 /* modem change */ 79#define STC_RTPR 0x18 /* rx timeout period */ 80#define STC_MSVR 0x28 /* modem signal value */ 81#define STC_MSVRTS 0x29 /* modem signal value rts */ 82#define STC_MSVDTR 0x2a /* modem signal value dtr */ 83#define STC_RBPRH 0x31 /* rx bit rate period high */ 84#define STC_RBPRL 0x32 /* rx bit rate period low */ 85#define STC_RBR 0x33 /* rx bit */ 86#define STC_TBPRH 0x39 /* tx bit rate period high */ 87#define STC_TBPRL 0x3a /* tx bit rate period low */ 88#define STC_GSVR 0x40 /* global service vector */ 89#define STC_GSCR1 0x41 /* global service channel 1 */ 90#define STC_GSCR2 0x42 /* global service channel 2 */ 91#define STC_GSCR3 0x43 /* global service channel 3 */ 92#define STC_MSMR 0x61 /* modem service match */ 93#define STC_TSMR 0x62 /* tx service match */ 94#define STC_RSMR 0x63 /* rx service match */ 95#define STC_CAR 0x64 /* channel access */ 96#define STC_SRSR 0x65 /* service request status */ 97#define STC_SRCR 0x66 /* service request config */ 98#define STC_GFRCR 0x6b /* global firmware rev code */ 99#define STC_PPRH 0x70 /* prescalar period high */ 100#define STC_PPRL 0x71 /* prescalar period low */ 101#define STC_MRAR 0x75 /* modem request ack */ 102#define STC_TRAR 0x76 /* tx request ack */ 103#define STC_RRAR 0x77 /* rx request ack */ 104#define STC_RDR 0x78 /* rx data */ 105#define STC_RCSR 0x7a /* rx character status */ 106#define STC_TDR 0x7b /* tx data */ 107#define STC_EOSRR 0x7f /* end of service */ 108 109#define STC_REGMAPSIZE 0x80 110 111/* Global Firmware Revision Code Register (rw) */ 112#define CD180_GFRCR_REV_B 0x81 /* CL-CD180B */ 113#define CD180_GFRCR_REV_C 0x82 /* CL-CD180C */ 114 115/* Service Request Configuration Register (rw) (CD180C or higher) */ 116#define CD180_SRCR_PKGTYP 0x80 /* pkg type,0=PLCC,1=PQFP */ 117#define CD180_SRCR_REGACKEN 0x40 /* register ack enable */ 118#define CD180_SRCR_DAISYEN 0x20 /* daisy chain enable */ 119#define CD180_SRCR_GLOBPRI 0x10 /* global priority */ 120#define CD180_SRCR_UNFAIR 0x08 /* use unfair interrupts */ 121#define CD180_SRCR_AUTOPRI 0x02 /* automatic priority */ 122#define CD180_SRCR_PRISEL 0x01 /* select rx/tx as high pri */ 123 124/* Prescalar Period Register High (rw) */ 125#define CD180_PPRH 0xf0 /* high byte */ 126#define CD180_PPRL 0x00 /* low byte */ 127 128/* Global Service Vector Register (rw) */ 129/* Modem Request Acknowledgement Register (ro) (and IACK equivalent) */ 130/* Receive Request Acknowledgement Register (ro) (and IACK equivalent) */ 131/* Transmit Request Acknowledgement Register (ro) (and IACK equivalent) */ 132#define CD180_GSVR_USERMASK 0xf8 /* user defined bits */ 133#define CD180_GSVR_IMASK 0x07 /* interrupt type mask */ 134#define CD180_GSVR_NOREQUEST 0x00 /* no request pending */ 135#define CD180_GSVR_STATCHG 0x01 /* modem signal change */ 136#define CD180_GSVR_TXDATA 0x02 /* tx service request */ 137#define CD180_GSVR_RXGOOD 0x03 /* rx service request */ 138#define CD180_GSVR_reserved1 0x04 /* reserved */ 139#define CD180_GSVR_reserved2 0x05 /* reserved */ 140#define CD180_GSVR_reserved3 0x06 /* reserved */ 141#define CD180_GSVR_RXEXCEPTION 0x07 /* rx exception request */ 142 143/* Service Request Status Register (ro) (CD180C and higher) */ 144#define CD180_SRSR_MREQINT 0x01 /* modem request internal */ 145#define CD180_SRSR_MREQEXT 0x02 /* modem request external */ 146#define CD180_SRSR_TREQINT 0x04 /* tx request internal */ 147#define CD180_SRSR_TREQEXT 0x08 /* tx request external */ 148#define CD180_SRSR_RREQINT 0x10 /* rx request internal */ 149#define CD180_SRSR_RREQEXT 0x20 /* rx request external */ 150#define CD180_SRSR_ILV_MASK 0xc0 /* internal service context */ 151#define CD180_SRSR_ILV_NONE 0x00 /* not in service context */ 152#define CD180_SRSR_ILV_RX 0xc0 /* in rx service context */ 153#define CD180_SRSR_ILV_TX 0x80 /* in tx service context */ 154#define CD180_SRSR_ILV_MODEM 0x40 /* in modem service context */ 155 156/* Global Service Channel Register 1,2,3 (rw) */ 157#define CD180_GSCR_CHANNEL(gscr) (((gscr) >> 2) & 7) 158 159/* Receive Data Count Register (ro) */ 160#define CD180_RDCR_MASK 0x0f /* mask for fifo length */ 161 162/* Receive Character Status Register (ro) */ 163#define CD180_RCSR_TO 0x80 /* time out */ 164#define CD180_RCSR_SCD2 0x40 /* special char detect 2 */ 165#define CD180_RCSR_SCD1 0x20 /* special char detect 1 */ 166#define CD180_RCSR_SCD0 0x10 /* special char detect 0 */ 167#define CD180_RCSR_BE 0x08 /* break exception */ 168#define CD180_RCSR_PE 0x04 /* parity exception */ 169#define CD180_RCSR_FE 0x02 /* framing exception */ 170#define CD180_RCSR_OE 0x01 /* overrun exception */ 171 172/* Service Request Enable Register (rw) */ 173#define CD180_SRER_DSR 0x80 /* DSR service request */ 174#define CD180_SRER_CD 0x40 /* CD service request */ 175#define CD180_SRER_CTS 0x20 /* CTS service request */ 176#define CD180_SRER_RXD 0x10 /* RXD service request */ 177#define CD180_SRER_RXSCD 0x08 /* RX special char request */ 178#define CD180_SRER_TXD 0x04 /* TX ready service request */ 179#define CD180_SRER_TXE 0x02 /* TX empty service request */ 180#define CD180_SRER_NNDT 0x01 /* No new data timeout req */ 181 182/* Channel Command Register (rw) */ 183/* Reset Channel Command */ 184#define CD180_CCR_CMD_RESET 0x80 /* chip/channel reset */ 185#define CD180_CCR_RESETALL 0x01 /* global reset */ 186#define CD180_CCR_RESETCHAN 0x00 /* current channel reset */ 187/* Channel Option Register Command */ 188#define CD180_CCR_CMD_COR 0x40 /* channel opt reg changed */ 189#define CD180_CCR_CORCHG1 0x02 /* cor1 has changed */ 190#define CD180_CCR_CORCHG2 0x04 /* cor2 has changed */ 191#define CD180_CCR_CORCHG3 0x08 /* cor3 has changed */ 192/* Send Special Character Command */ 193#define CD180_CCR_CMD_SPC 0x20 /* send special chars changed */ 194#define CD180_CCR_SSPC0 0x01 /* send special char 0 change */ 195#define CD180_CCR_SSPC1 0x02 /* send special char 1 change */ 196#define CD180_CCR_SSPC2 0x04 /* send special char 2 change */ 197/* Channel Control Command */ 198#define CD180_CCR_CMD_CHAN 0x10 /* channel control command */ 199#define CD180_CCR_CHAN_TXEN 0x08 /* enable channel tx */ 200#define CD180_CCR_CHAN_TXDIS 0x04 /* disable channel tx */ 201#define CD180_CCR_CHAN_RXEN 0x02 /* enable channel rx */ 202#define CD180_CCR_CHAN_RXDIS 0x01 /* disable channel rx */ 203 204/* Channel Option Register 1 (rw) */ 205#define CD180_COR1_EVENPAR 0x00 /* even parity */ 206#define CD180_COR1_ODDPAR 0x80 /* odd parity */ 207#define CD180_COR1_PARMODE_NO 0x00 /* no parity */ 208#define CD180_COR1_PARMODE_FORCE 0x20 /* force (odd=1, even=0) */ 209#define CD180_COR1_PARMODE_NORMAL 0x40 /* normal parity mode */ 210#define CD180_COR1_PARMODE_NA 0x60 /* notused */ 211#define CD180_COR1_IGNPAR 0x10 /* ignore parity */ 212#define CD180_COR1_STOP1 0x00 /* 1 stop bit */ 213#define CD180_COR1_STOP15 0x04 /* 1.5 stop bits */ 214#define CD180_COR1_STOP2 0x08 /* 2 stop bits */ 215#define CD180_COR1_STOP25 0x0c /* 2.5 stop bits */ 216#define CD180_COR1_CS5 0x00 /* 5 bit characters */ 217#define CD180_COR1_CS6 0x01 /* 6 bit characters */ 218#define CD180_COR1_CS7 0x02 /* 7 bit characters */ 219#define CD180_COR1_CS8 0x03 /* 8 bit characters */ 220 221/* Channel Option Register 2 (rw) */ 222#define CD180_COR2_IXM 0x80 /* implied xon mode */ 223#define CD180_COR2_TXIBE 0x40 /* tx in-band flow control */ 224#define CD180_COR2_ETC 0x20 /* embedded tx command enbl */ 225#define CD180_COR2_LLM 0x10 /* local loopback mode */ 226#define CD180_COR2_RLM 0x08 /* remote loopback mode */ 227#define CD180_COR2_RTSAO 0x04 /* RTS automatic output enbl */ 228#define CD180_COR2_CTSAE 0x02 /* CTS automatic enable */ 229#define CD180_COR2_DSRAE 0x01 /* DSR automatic enable */ 230 231/* Channel Option Register 3 (rw) */ 232#define CD180_COR3_XON2 0x80 /* XON char in spc1&3 */ 233#define CD180_COR3_XON1 0x00 /* XON char in spc1 */ 234#define CD180_COR3_XOFF2 0x40 /* XOFF char in spc2&4 */ 235#define CD180_COR3_XOFF1 0x00 /* XOFF char in spc2 */ 236#define CD180_COR3_FCT 0x20 /* flow control transparency */ 237#define CD180_COR3_SCDE 0x10 /* special char recognition */ 238#define CD180_COR3_RXFIFO_MASK 0x0f /* rx fifo threshold */ 239 240/* Channel Control Status Register (ro) */ 241#define CD180_CCSR_RXEN 0x80 /* rx is enabled */ 242#define CD180_CCSR_RXFLOFF 0x40 /* rx flow-off */ 243#define CD180_CCSR_RXFLON 0x20 /* rx flow-on */ 244#define CD180_CCSR_TXEN 0x08 /* tx is enabled */ 245#define CD180_CCSR_TXFLOFF 0x04 /* tx flow-off */ 246#define CD180_CCSR_TXFLON 0x02 /* tx flow-on */ 247 248/* Receiver Bit Register (ro) */ 249#define CD180_RBR_RXD 0x40 /* state of RxD pin */ 250#define CD180_RBR_STARTHUNT 0x20 /* looking for start bit */ 251 252/* Modem Change Register (rw) */ 253#define CD180_MCR_DSR 0x80 /* DSR changed */ 254#define CD180_MCR_CD 0x40 /* CD changed */ 255#define CD180_MCR_CTS 0x20 /* CTS changed */ 256 257/* Modem Change Option Register 1 (rw) */ 258#define CD180_MCOR1_DSRZD 0x80 /* catch 0->1 DSR changes */ 259#define CD180_MCOR1_CDZD 0x40 /* catch 0->1 CD changes */ 260#define CD180_MCOR1_CTSZD 0x40 /* catch 0->1 CTS changes */ 261#define CD180_MCOR1_DTRTHRESH 0x0f /* DTR threshold mask */ 262 263/* Modem Change Option Register 2 (rw) */ 264#define CD180_MCOR2_DSROD 0x80 /* catch 1->0 DSR changes */ 265#define CD180_MCOR2_CDOD 0x40 /* catch 1->0 CD changes */ 266#define CD180_MCOR2_CTSOD 0x20 /* catch 1->0 CTS changes */ 267 268/* Modem Signal Value Register (rw) */ 269#define CD180_MSVR_DSR 0x80 /* DSR input state */ 270#define CD180_MSVR_CD 0x40 /* CD input state */ 271#define CD180_MSVR_CTS 0x20 /* CTS input state */ 272#define CD180_MSVR_DTR 0x02 /* DTR output state */ 273#define CD180_MSVR_RTS 0x01 /* RTS output state */ 274 275/* Modem Signal Value Register - Request To Send (w) (CD180C and higher) */ 276#define CD180_MSVRTS_RTS 0x01 /* RTS signal value */ 277 278/* Modem Signal Value Register - Data Terminal Ready (w) (CD180C and higher) */ 279#define CD180_MSVDTR_DTR 0x02 /* DTR signal value */ 280 281/* 282 * The register map for the SUNW,spif looks something like: 283 * Offset: Function: 284 * 0000 - 03ff Boot ROM 285 * 0400 - 0407 dtr latches (one per port) 286 * 0409 - 07ff unused 287 * 0800 - 087f CD180 registers (normal mapping) 288 * 0880 - 0bff unused 289 * 0c00 - 0c7f CD180 registers (*iack mapping) 290 * 0c80 - 0dff unused 291 * 0e00 - 1fff PPC registers 292 * 293 * One note about the DTR latches: The values stored there are reversed. 294 * By writing a 1 to the latch, DTR is lowered, and by writing a 0, DTR 295 * is raised. The latches cannot be read, and no other value can be written 296 * there or the system will crash due to "excessive bus loading (see 297 * SBus loading and capacitance spec)" 298 * 299 * The *iack registers are read/written with the IACK bit set. When 300 * the interrupt routine starts, it reads the MRAR, TRAR, and RRAR registers 301 * from this mapping. This signals an interrupt acknowlegement cycle. 302 * (NOTE: these are not really the MRAR, TRAR, and RRAR... They are copies 303 * of the GSVR, I just mapped them to the same location as the mrar, trar, 304 * and rrar because it seemed appropriate). 305 */ 306#define DTR_REG_OFFSET 0x400 /* DTR latches */ 307#define DTR_REG_LEN 0x8 308#define STC_REG_OFFSET 0x800 /* normal cd180 access */ 309#define STC_REG_LEN 0x80 310#define ISTC_REG_OFFSET 0xc00 /* IACK cd180 access */ 311#define ISTC_REG_LEN STC_REG_LEN 312#define PPC_REG_OFFSET 0xe00 /* PPC registers */ 313#define PPC_REG_LEN 0x200 314 315/* 316 * The mapping of minor device number -> card and port is done as 317 * follows by default: 318 * 319 * +---+---+---+---+---+---+---+---+ 320 * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 321 * +---+---+---+---+---+---+---+---+ 322 * | | | | | | | | 323 * | | | | | +---+---+---> port number 324 * | | | | | 325 * | | | | +---------------> unused 326 * | | | | 327 * | | | +-------------------> dialout (on tty ports) 328 * | | | 329 * | | +-----------------------> unused 330 * | | 331 * +---+---------------------------> card number 332 * 333 */ 334#define SPIF_MAX_CARDS 4 335#define SPIF_MAX_TTY 8 336#define SPIF_MAX_BPP 1 337 338/* 339 * device selectors 340 */ 341#define SPIF_CARD(x) ((minor(x) >> 6) & 0x03) 342#define SPIF_PORT(x) (minor(x) & 0x07) 343#define STTY_DIALOUT(x) (minor(x) & 0x10) 344 345#define STTY_RX_FIFO_THRESHOLD 4 346#define STTY_RX_DTR_THRESHOLD 7 347#define CD180_TX_FIFO_SIZE 8 /* 8 chars of fifo */ 348 349/* 350 * These are the offsets of the MRAR, TRAR, and RRAR in *IACK space. 351 * The high bit must be set as per specs for the MSMR, TSMR, and RSMR. 352 */ 353#define SPIF_MSMR (0x80 | STC_MRAR) /* offset of MRAR | 0x80 */ 354#define SPIF_TSMR (0x80 | STC_TRAR) /* offset of TRAR | 0x80 */ 355#define SPIF_RSMR (0x80 | STC_RRAR) /* offset of RRAR | 0x80 */ 356 357/* 358 * "verosc" node tells which oscillator we have. 359 */ 360#define SPIF_OSC9 1 /* 9.8304 Mhz */ 361#define SPIF_OSC10 2 /* 10Mhz */ 362 363/* 364 * There are two interrupts, serial gets interrupt[0], and parallel 365 * gets interrupt[1] 366 */ 367#define SERIAL_INTR 0 368#define PARALLEL_INTR 1 369 370/* 371 * spif tty flags 372 */ 373#define STTYF_CDCHG 0x01 /* carrier changed */ 374#define STTYF_RING_OVERFLOW 0x02 /* ring buffer overflowed */ 375#define STTYF_DONE 0x04 /* done... flush buffers */ 376#define STTYF_SET_BREAK 0x08 /* set break signal */ 377#define STTYF_CLR_BREAK 0x10 /* clear break signal */ 378#define STTYF_STOP 0x20 /* stopped */ 379 380#define STTY_RBUF_SIZE (2 * 512) 381