aboutsummaryrefslogtreecommitdiff
path: root/drivers/char/ser_a2232.h
blob: bc09eb9e118b1ac04562b60e31ac282193e5f3c0 (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
/* drivers/char/ser_a2232.h */

/* $Id: ser_a2232.h,v 0.4 2000/01/25 12:00:00 ehaase Exp $ */

/* Linux serial driver for the Amiga A2232 board */

/* This driver is MAINTAINED. Before applying any changes, please contact
 * the author.
 */
   
/* Copyright (c) 2000-2001 Enver Haase    <ehaase@inf.fu-berlin.de>
 *                   alias The A2232 driver project <A2232@gmx.net>
 * All rights reserved.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *  
 */

#ifndef _SER_A2232_H_
#define _SER_A2232_H_

/*
	How many boards are to be supported at maximum;
	"up to five A2232 Multiport Serial Cards may be installed in a
	single Amiga 2000" states the A2232 User's Guide. If you have
	more slots available, you might want to change the value below.
*/
#define MAX_A2232_BOARDS 5

#ifndef A2232_NORMAL_MAJOR
/* This allows overriding on the compiler commandline, or in a "major.h" 
   include or something like that */
#define A2232_NORMAL_MAJOR  224	/* /dev/ttyY* */
#define A2232_CALLOUT_MAJOR 225	/* /dev/cuy*  */
#endif

/* Some magic is always good - Who knows :) */
#define A2232_MAGIC 0x000a2232

/* A2232 port structure to keep track of the
   status of every single line used */
struct a2232_port{
	struct gs_port gs;
	unsigned int which_a2232;
	unsigned int which_port_on_a2232;
	short disable_rx;
	short throttle_input;
	short cd_status;
};

#define	NUMLINES		7	/* number of lines per board */
#define	A2232_IOBUFLEN		256	/* number of bytes per buffer */
#define	A2232_IOBUFLENMASK	0xff	/* mask for maximum number of bytes */


#define	A2232_UNKNOWN	0	/* crystal not known */
#define	A2232_NORMAL	1	/* normal A2232 (1.8432 MHz oscillator) */
#define	A2232_TURBO	2	/* turbo A2232 (3.6864 MHz oscillator) */


struct a2232common {
	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 a2232status {
	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 A2232PARAM */
	u_char Command;		/* command byte - see A2232CMD */
	u_char SoftFlow;	/* enables xon/xoff flow control */
	/* private 65EC02 fields: */
	u_char XonOff;		/* stores XON/XOFF enable/disable */
};

#define	A2232_MEMPAD1	\
	(0x0200 - NUMLINES * sizeof(struct a2232status)	-	\
	sizeof(struct a2232common))
#define	A2232_MEMPAD2	(0x2000 - NUMLINES * A2232_IOBUFLEN - A2232_IOBUFLEN)

struct a2232memory {
	struct a2232status Status[NUMLINES];	/* 0x0000-0x006f status areas */
	struct a2232common Common;		/* 0x0070-0x0077 common flags */
	u_char Dummy1[A2232_MEMPAD1];		/* 0x00XX-0x01ff */
	u_char OutBuf[NUMLINES][A2232_IOBUFLEN];/* 0x0200-0x08ff output bufs */
	u_char InBuf[NUMLINES][A2232_IOBUFLEN];	/* 0x0900-0x0fff input bufs */
	u_char InCtl[NUMLINES][A2232_IOBUFLEN];	/* 0x1000-0x16ff control data */
	u_char CDBuf[A2232_IOBUFLEN];		/* 0x1700-0x17ff CD event buffer */
	u_char Dummy2[A2232_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 A2232_MEMPAD1
#undef A2232_MEMPAD2

#define	A2232INCTL_CHAR		0	/* corresponding byte in InBuf is a character */
#define	A2232INCTL_EVENT	1	/* corresponding byte in InBuf is an event */

#define	A2232EVENT_Break	1	/* break set */
#define	A2232EVENT_CarrierOn	2	/* carrier raised */
#define	A2232EVENT_CarrierOff	3	/* carrier dropped */
#define A2232EVENT_Sync		4	/* don't know, defined in 2232.ax */

#define	A2232CMD_Enable		0x1	/* enable/DTR bit */
#define	A2232CMD_Close		0x2	/* close the device */
#define	A2232CMD_Open		0xb	/* open the device */
#define	A2232CMD_CMask		0xf	/* command mask */
#define	A2232CMD_RTSOff		0x0  	/* turn off RTS */
#define	A2232CMD_RTSOn		0x8	/* turn on RTS */
#define	A2232CMD_Break		0xd	/* transmit a break */
#define	A2232CMD_RTSMask	0xc	/* mask for RTS stuff */
#define	A2232CMD_NoParity	0x00	/* don't use parity */
#define	A2232CMD_OddParity	0x20	/* odd parity */
#define	A2232CMD_EvenParity	0x60	/* even parity */
#define	A2232CMD_ParityMask	0xe0	/* parity mask */

#define	A2232PARAM_B115200	0x0	/* baud rates */
#define	A2232PARAM_B50		0x1
#define	A2232PARAM_B75		0x2
#define	A2232PARAM_B110		0x3
#define	A2232PARAM_B134		0x4
#define	A2232PARAM_B150		0x5
#define	A2232PARAM_B300		0x6
#define	A2232PARAM_B600		0x7
#define	A2232PARAM_B1200	0x8
#define	A2232PARAM_B1800	0x9
#define	A2232PARAM_B2400	0xa
#define	A2232PARAM_B3600	0xb
#define	A2232PARAM_B4800	0xc
#define	A2232PARAM_B7200	0xd
#define	A2232PARAM_B9600	0xe
#define	A2232PARAM_B19200	0xf
#define	A2232PARAM_BaudMask	0xf	/* baud rate mask */
#define	A2232PARAM_RcvBaud	0x10	/* enable receive baud rate */
#define	A2232PARAM_8Bit		0x00	/* numbers of bits */
#define	A2232PARAM_7Bit		0x20
#define	A2232PARAM_6Bit		0x40
#define	A2232PARAM_5Bit		0x60
#define	A2232PARAM_BitMask	0x60	/* numbers of bits mask */


/* Standard speeds tables, -1 means unavailable, -2 means 0 baud: switch off line */
#define A2232_BAUD_TABLE_NOAVAIL -1
#define A2232_BAUD_TABLE_NUM_RATES (18)
static int a2232_baud_table[A2232_BAUD_TABLE_NUM_RATES*3] = {
	//Baud	//Normal			//Turbo
	50,	A2232PARAM_B50,			A2232_BAUD_TABLE_NOAVAIL,
	75,	A2232PARAM_B75,			A2232_BAUD_TABLE_NOAVAIL,
	110,	A2232PARAM_B110,		A2232_BAUD_TABLE_NOAVAIL,
	134,	A2232PARAM_B134,		A2232_BAUD_TABLE_NOAVAIL,
	150,	A2232PARAM_B150,		A2232PARAM_B75,
	200,	A2232_BAUD_TABLE_NOAVAIL,	A2232_BAUD_TABLE_NOAVAIL,
	300,	A2232PARAM_B300,		A2232PARAM_B150,
	600,	A2232PARAM_B600,		A2232PARAM_B300,
	1200,	A2232PARAM_B1200,		A2232PARAM_B600,
	1800,	A2232PARAM_B1800,		A2232_BAUD_TABLE_NOAVAIL,
	2400,	A2232PARAM_B2400,		A2232PARAM_B1200,
	4800,	A2232PARAM_B4800,		A2232PARAM_B2400,
	9600,	A2232PARAM_B9600,		A2232PARAM_B4800,
	19200,	A2232PARAM_B19200,		A2232PARAM_B9600,
	38400,	A2232_BAUD_TABLE_NOAVAIL,	A2232PARAM_B19200,
	57600,	A2232_BAUD_TABLE_NOAVAIL,	A2232_BAUD_TABLE_NOAVAIL,
#ifdef A2232_SPEEDHACK
	115200,	A2232PARAM_B115200,		A2232_BAUD_TABLE_NOAVAIL,
	230400,	A2232_BAUD_TABLE_NOAVAIL,	A2232PARAM_B115200
#else
	115200,	A2232_BAUD_TABLE_NOAVAIL,	A2232_BAUD_TABLE_NOAVAIL,
	230400,	A2232_BAUD_TABLE_NOAVAIL,	A2232_BAUD_TABLE_NOAVAIL
#endif
};
#endif