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
|