1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
/* $OpenBSD: mscreg.h,v 1.2 1997/01/16 09:25:07 niklas Exp $ */
/* $NetBSD: mscreg.h,v 1.5 1996/12/09 17:24:58 is Exp $ */
/*
* Copyright (c) 1993 Zik.
* Copyright (c) 1995 Jukka Marin <jmarin@teeri.jmp.fi>.
* Copyright (c) 1995 Rob Healey <rhealey@kas.helios.mn.org>.
* Copyright (c) 1982, 1986, 1990 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* - created by zik 931207
* - Fixed break value. 950108 RFH
* - Added 6502 field to mscmemory so board can be halted while
* it's memory is being reloaded. 950108 RFH
* - Ripped out structure guts and replaced with Jukka Marin's stuff for his
* freely redistributable version of the 2232 6502c code. Yea!!!!!!
* 950916 RFH
* - Added Jukka's turbo board detection support and tmpbuf for copys. 950918
* - Change to NetBSD style for integration in to the main tree. 950919
*/
#define NUMLINES 7 /* number of lines per card */
#define IOBUFLEN 256 /* number of bytes per buffer */
#define IOBUFLENMASK 0xff /* mask for maximum number of bytes */
#define IOBUFHIGHWATER 192 /* point at which to enable output */
#define IOBUFLOWWATER 128 /* point at which to wake output */
#define MSC_VBL_PRIORITY 1 /* priority of vbl interrupt handler */
#define MSC_UNKNOWN 0 /* crystal not known */
#define MSC_NORMAL 1 /* normal A2232 (1.8432 MHz oscillator) */
#define MSC_TURBO 2 /* turbo A2232 (3.6864 MHz oscillator) */
struct msccommon {
char Crystal; /* normal (1) or turbo (2) board? */
u_char Pad_a;
u_char TimerH; /* timer value after speed check */
u_char TimerL;
u_char CDHead; /* head pointer for CD message queue */
u_char CDTail; /* tail pointer for CD message queue */
u_char CDStatus;
u_char Pad_b;
};
struct mscstatus {
u_char InHead; /* input queue head */
u_char InTail; /* input queue tail */
u_char OutDisable; /* disables output */
u_char OutHead; /* output queue head */
u_char OutTail; /* output queue tail */
u_char OutCtrl; /* soft flow control character to send */
u_char OutFlush; /* flushes output buffer */
u_char Setup; /* causes reconfiguration */
u_char Param; /* parameter byte - see MSCPARAM */
u_char Command; /* command byte - see MSCCMD */
u_char SoftFlow; /* enables xon/xoff flow control */
/* private 65C02 fields: */
u_char XonOff; /* stores XON/XOFF enable/disable */
};
#define MSC_MEMPAD1 \
(0x0200 - NUMLINES * sizeof(struct mscstatus) - sizeof(struct msccommon))
#define MSC_MEMPAD2 (0x2000 - NUMLINES * IOBUFLEN - IOBUFLEN)
struct mscmemory {
struct mscstatus Status[NUMLINES]; /* 0x0000-0x006f status areas */
struct msccommon Common; /* 0x0070-0x0077 common flags */
u_char Dummy1[MSC_MEMPAD1]; /* 0x00XX-0x01ff */
u_char OutBuf[NUMLINES][IOBUFLEN]; /* 0x0200-0x08ff output bufs */
u_char InBuf[NUMLINES][IOBUFLEN]; /* 0x0900-0x0fff input bufs */
u_char InCtl[NUMLINES][IOBUFLEN]; /* 0x1000-0x16ff control data */
u_char CDBuf[IOBUFLEN]; /* 0x1700-0x17ff CD event buffer */
u_char Dummy2[MSC_MEMPAD2]; /* 0x1800-0x2fff */
u_char Code[0x1000]; /* 0x3000-0x3fff code area */
u_short InterruptAck; /* 0x4000 intr ack */
u_char Dummy3[0x3ffe]; /* 0x4002-0x7fff */
u_short Enable6502Reset; /* 0x8000 Stop board, */
/* 6502 RESET line held low */
u_char Dummy4[0x3ffe]; /* 0x8002-0xbfff */
u_short ResetBoard; /* 0xc000 reset board & run, */
/* 6502 RESET line held high */
};
#undef MSC_MEMPAD1
#undef MSC_MEMPAD2
struct mscdevice {
volatile struct mscmemory *board; /* where the board is located */
int flags; /* modem control flags */
int openflags; /* flags for device open */
u_char unit; /* which unit (ie. which board) */
u_char port; /* which port on the board (0-6) */
u_char active; /* does this port have hardware? */
u_char closing; /* are we flushing before close? */
char tmpbuf[IOBUFLEN]; /* temp buffer for data transfers */
};
#define MSCINCTL_CHAR 0 /* corresponding byte in InBuf is a character */
#define MSCINCTL_EVENT 1 /* corresponding byte in InBuf is an event */
#define MSCEVENT_Break 1 /* break set */
#define MSCEVENT_CarrierOn 2 /* carrier raised */
#define MSCEVENT_CarrierOff 3 /* carrier dropped */
#define MSCCMD_Enable 0x1 /* enable/DTR bit */
#define MSCCMD_Close 0x2 /* close the device */
#define MSCCMD_Open 0xb /* open the device */
#define MSCCMD_CMask 0xf /* command mask */
#define MSCCMD_RTSOff 0x0 /* turn off RTS */
#define MSCCMD_RTSOn 0x8 /* turn on RTS */
#define MSCCMD_Break 0xd /* transmit a break */
#define MSCCMD_RTSMask 0xc /* mask for RTS stuff */
#define MSCCMD_NoParity 0x00 /* don't use parity */
#define MSCCMD_OddParity 0x20 /* odd parity */
#define MSCCMD_EvenParity 0x60 /* even parity */
#define MSCCMD_ParityMask 0xe0 /* parity mask */
#define MSCPARAM_B115200 0x0 /* baud rates */
#define MSCPARAM_B50 0x1
#define MSCPARAM_B75 0x2
#define MSCPARAM_B110 0x3
#define MSCPARAM_B134 0x4
#define MSCPARAM_B150 0x5
#define MSCPARAM_B300 0x6
#define MSCPARAM_B600 0x7
#define MSCPARAM_B1200 0x8
#define MSCPARAM_B1800 0x9
#define MSCPARAM_B2400 0xa
#define MSCPARAM_B3600 0xb
#define MSCPARAM_B4800 0xc
#define MSCPARAM_B7200 0xd
#define MSCPARAM_B9600 0xe
#define MSCPARAM_B19200 0xf
#define MSCPARAM_BaudMask 0xf /* baud rate mask */
#define MSCPARAM_RcvBaud 0x10 /* enable receive baud rate */
#define MSCPARAM_8Bit 0x00 /* numbers of bits */
#define MSCPARAM_7Bit 0x20
#define MSCPARAM_6Bit 0x40
#define MSCPARAM_5Bit 0x60
#define MSCPARAM_BitMask 0x60 /* numbers of bits mask */
/* tty number from device */
#define MSCTTY(dev) (minor(dev) & 0x7e)
/* slot number from device */
#define MSCSLOT(dev) ((minor(dev) & 0x7e)>>1)
/* dialin mode from device */
#define MSCDIALIN(dev) (minor(dev) & 0x01)
/* board number from device */
#define MSCBOARD(dev) ((minor(dev))>>4)
/* line number from device */
#define MSCLINE(dev) (((minor(dev)) & 0xe)>>1)
/* number of slots */
#define MSCSLOTS ((NMSC-1)*8+7)
/* number of ttys */
#define MSCTTYS (MSCSLOTS*2)
/* board number given slot number */
#define MSCUNIT(slot) ((slot)>>3)
/* slot number given unit and line */
#define MSCSLOTUL(unit,line) (((unit)<<3)+(line))
/* tty number given slot */
#define MSCTTYSLOT(slot) ((slot)<<1)
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
|