summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/dev/mscreg.h
blob: afeaee89562e7b660907381e36e25cb7e0467b66 (plain)
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