1 /*****************************************************************************/
2 
3 /*
4  *	cdk.h  -- CDK interface definitions.
5  *
6  *	Copyright (C) 1996-1998  Stallion Technologies
7  *	Copyright (C) 1994-1996  Greg Ungerer.
8  *
9  *	This program is free software; you can redistribute it and/or modify
10  *	it under the terms of the GNU General Public License as published by
11  *	the Free Software Foundation; either version 2 of the License, or
12  *	(at your option) any later version.
13  *
14  *	This program is distributed in the hope that it will be useful,
15  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *	GNU General Public License for more details.
18  *
19  *	You should have received a copy of the GNU General Public License
20  *	along with this program; if not, write to the Free Software
21  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23 
24 /*****************************************************************************/
25 #ifndef	_CDK_H
26 #define	_CDK_H
27 /*****************************************************************************/
28 
29 #pragma	pack(2)
30 
31 /*
32  *	The following set of definitions is used to communicate with the
33  *	shared memory interface of the Stallion intelligent multiport serial
34  *	boards. The definitions in this file are taken directly from the
35  *	document titled "Generic Stackable Interface, Downloader and
36  *	Communications Development Kit".
37  */
38 
39 /*
40  *	Define the set of important shared memory addresses. These are
41  *	required to initialize the board and get things started. All of these
42  *	addresses are relative to the start of the shared memory.
43  */
44 #define	CDK_SIGADDR	0x200
45 #define	CDK_FEATADDR	0x280
46 #define	CDK_CDKADDR	0x300
47 #define	CDK_RDYADDR	0x262
48 
49 #define	CDK_ALIVEMARKER	13
50 
51 /*
52  *	On hardware power up the ROMs located on the EasyConnection 8/64 will
53  *	fill out the following signature information into shared memory. This
54  *	way the host system can quickly determine that the board is present
55  *	and is operational.
56  */
57 typedef struct cdkecpsig {
58 	unsigned long	magic;
59 	unsigned short	romver;
60 	unsigned short	cputype;
61 	unsigned char	panelid[8];
62 } cdkecpsig_t;
63 
64 #define	ECP_MAGIC	0x21504345
65 
66 /*
67  *	On hardware power up the ROMs located on the ONboard, Stallion and
68  *	Brumbys will fill out the following signature information into shared
69  *	memory. This way the host system can quickly determine that the board
70  *	is present and is operational.
71  */
72 typedef struct cdkonbsig {
73 	unsigned short	magic0;
74 	unsigned short	magic1;
75 	unsigned short	magic2;
76 	unsigned short	magic3;
77 	unsigned short	romver;
78 	unsigned short	memoff;
79 	unsigned short	memseg;
80 	unsigned short	amask0;
81 	unsigned short	pic;
82 	unsigned short	status;
83 	unsigned short	btype;
84 	unsigned short	clkticks;
85 	unsigned short	clkspeed;
86 	unsigned short	amask1;
87 	unsigned short	amask2;
88 } cdkonbsig_t;
89 
90 #define	ONB_MAGIC0	0xf2a7
91 #define	ONB_MAGIC1	0xa149
92 #define	ONB_MAGIC2	0x6352
93 #define	ONB_MAGIC3	0xf121
94 
95 /*
96  *	Define the feature area structure. The feature area is the set of
97  *	startup parameters used by the slave image when it starts executing.
98  *	They allow for the specification of buffer sizes, debug trace, etc.
99  */
100 typedef struct cdkfeature {
101 	unsigned long	debug;
102 	unsigned long	banner;
103 	unsigned long	etype;
104 	unsigned long	nrdevs;
105 	unsigned long	brdspec;
106 	unsigned long	txrqsize;
107 	unsigned long	rxrqsize;
108 	unsigned long	flags;
109 } cdkfeature_t;
110 
111 #define	ETYP_DDK	0
112 #define	ETYP_CDK	1
113 
114 /*
115  *	Define the CDK header structure. This is the info that the slave
116  *	environment sets up after it has been downloaded and started. It
117  *	essentially provides a memory map for the shared memory interface.
118  */
119 typedef struct cdkhdr {
120 	unsigned short	command;
121 	unsigned short	status;
122 	unsigned short	port;
123 	unsigned short	mode;
124 	unsigned long	cmd_buf[14];
125 	unsigned short	alive_cnt;
126 	unsigned short	intrpt_mode;
127 	unsigned char	intrpt_id[8];
128 	unsigned char	ver_release;
129 	unsigned char	ver_modification;
130 	unsigned char	ver_fix;
131 	unsigned char	deadman_restart;
132 	unsigned short	deadman;
133 	unsigned short	nrdevs;
134 	unsigned long	memp;
135 	unsigned long	hostp;
136 	unsigned long	slavep;
137 	unsigned char	hostreq;
138 	unsigned char	slavereq;
139 	unsigned char	cmd_reserved[30];
140 } cdkhdr_t;
141 
142 #define	MODE_DDK	0
143 #define	MODE_CDK	1
144 
145 #define	IMD_INTR	0x0
146 #define	IMD_PPINTR	0x1
147 #define	IMD_POLL	0xff
148 
149 /*
150  *	Define the memory mapping structure. This structure is pointed to by
151  *	the memp field in the stlcdkhdr struct. As many as these structures
152  *	as required are laid out in shared memory to define how the rest of
153  *	shared memory is divided up. There will be one for each port.
154  */
155 typedef struct cdkmem {
156 	unsigned short	dtype;
157 	unsigned long	offset;
158 } cdkmem_t;
159 
160 #define	TYP_UNDEFINED	0x0
161 #define	TYP_ASYNCTRL	0x1
162 #define	TYP_ASYNC	0x20
163 #define	TYP_PARALLEL	0x40
164 #define	TYP_SYNCX21	0x60
165 
166 /*****************************************************************************/
167 
168 /*
169  *	Following is a set of defines and structures used to actually deal
170  *	with the serial ports on the board. Firstly is the set of commands
171  *	that can be applied to ports.
172  */
173 #define	ASYCMD		(((unsigned long) 'a') << 8)
174 
175 #define	A_NULL		(ASYCMD | 0)
176 #define	A_FLUSH		(ASYCMD | 1)
177 #define	A_BREAK		(ASYCMD | 2)
178 #define	A_GETPORT	(ASYCMD | 3)
179 #define	A_SETPORT	(ASYCMD | 4)
180 #define	A_SETPORTF	(ASYCMD | 5)
181 #define	A_SETPORTFTX	(ASYCMD | 6)
182 #define	A_SETPORTFRX	(ASYCMD | 7)
183 #define	A_GETSIGNALS	(ASYCMD | 8)
184 #define	A_SETSIGNALS	(ASYCMD | 9)
185 #define	A_SETSIGNALSF	(ASYCMD | 10)
186 #define	A_SETSIGNALSFTX	(ASYCMD | 11)
187 #define	A_SETSIGNALSFRX	(ASYCMD | 12)
188 #define	A_GETNOTIFY	(ASYCMD | 13)
189 #define	A_SETNOTIFY	(ASYCMD | 14)
190 #define	A_NOTIFY	(ASYCMD | 15)
191 #define	A_PORTCTRL	(ASYCMD | 16)
192 #define	A_GETSTATS	(ASYCMD | 17)
193 #define	A_RQSTATE	(ASYCMD | 18)
194 #define	A_FLOWSTATE	(ASYCMD | 19)
195 #define	A_CLEARSTATS	(ASYCMD | 20)
196 
197 /*
198  *	Define those arguments used for simple commands.
199  */
200 #define	FLUSHRX		0x1
201 #define	FLUSHTX		0x2
202 
203 #define	BREAKON		-1
204 #define	BREAKOFF	-2
205 
206 /*
207  *	Define the port setting structure, and all those defines that go along
208  *	with it. Basically this structure defines the characteristics of this
209  *	port: baud rate, chars, parity, input/output char cooking etc.
210  */
211 typedef struct asyport {
212 	unsigned long	baudout;
213 	unsigned long	baudin;
214 	unsigned long	iflag;
215 	unsigned long	oflag;
216 	unsigned long	lflag;
217 	unsigned long	pflag;
218 	unsigned long	flow;
219 	unsigned long	spare1;
220 	unsigned short	vtime;
221 	unsigned short	vmin;
222 	unsigned short	txlo;
223 	unsigned short	txhi;
224 	unsigned short	rxlo;
225 	unsigned short	rxhi;
226 	unsigned short	rxhog;
227 	unsigned short	spare2;
228 	unsigned char	csize;
229 	unsigned char	stopbs;
230 	unsigned char	parity;
231 	unsigned char	stopin;
232 	unsigned char	startin;
233 	unsigned char	stopout;
234 	unsigned char	startout;
235 	unsigned char	parmark;
236 	unsigned char	brkmark;
237 	unsigned char	cc[11];
238 } asyport_t;
239 
240 #define	PT_STOP1	0x0
241 #define	PT_STOP15	0x1
242 #define	PT_STOP2	0x2
243 
244 #define	PT_NOPARITY	0x0
245 #define	PT_ODDPARITY	0x1
246 #define	PT_EVENPARITY	0x2
247 #define	PT_MARKPARITY	0x3
248 #define	PT_SPACEPARITY	0x4
249 
250 #define	F_NONE		0x0
251 #define	F_IXON		0x1
252 #define	F_IXOFF		0x2
253 #define	F_IXANY		0x4
254 #define	F_IOXANY	0x8
255 #define	F_RTSFLOW	0x10
256 #define	F_CTSFLOW	0x20
257 #define	F_DTRFLOW	0x40
258 #define	F_DCDFLOW	0x80
259 #define	F_DSROFLOW	0x100
260 #define	F_DSRIFLOW	0x200
261 
262 #define	FI_NORX		0x1
263 #define	FI_RAW		0x2
264 #define	FI_ISTRIP	0x4
265 #define	FI_UCLC		0x8
266 #define	FI_INLCR	0x10
267 #define	FI_ICRNL	0x20
268 #define	FI_IGNCR	0x40
269 #define	FI_IGNBREAK	0x80
270 #define	FI_DSCRDBREAK	0x100
271 #define	FI_1MARKBREAK	0x200
272 #define	FI_2MARKBREAK	0x400
273 #define	FI_XCHNGBREAK	0x800
274 #define	FI_IGNRXERRS	0x1000
275 #define	FI_DSCDRXERRS	0x2000
276 #define	FI_1MARKRXERRS	0x4000
277 #define	FI_2MARKRXERRS	0x8000
278 #define	FI_XCHNGRXERRS	0x10000
279 #define	FI_DSCRDNULL	0x20000
280 
281 #define	FO_OLCUC	0x1
282 #define	FO_ONLCR	0x2
283 #define	FO_OOCRNL	0x4
284 #define	FO_ONOCR	0x8
285 #define	FO_ONLRET	0x10
286 #define	FO_ONL		0x20
287 #define	FO_OBS		0x40
288 #define	FO_OVT		0x80
289 #define	FO_OFF		0x100
290 #define	FO_OTAB1	0x200
291 #define	FO_OTAB2	0x400
292 #define	FO_OTAB3	0x800
293 #define	FO_OCR1		0x1000
294 #define	FO_OCR2		0x2000
295 #define	FO_OCR3		0x4000
296 #define	FO_OFILL	0x8000
297 #define	FO_ODELL	0x10000
298 
299 #define	P_RTSLOCK	0x1
300 #define	P_CTSLOCK	0x2
301 #define	P_MAPRTS	0x4
302 #define	P_MAPCTS	0x8
303 #define	P_LOOPBACK	0x10
304 #define	P_DTRFOLLOW	0x20
305 #define	P_FAKEDCD	0x40
306 
307 #define	P_RXIMIN	0x10000
308 #define	P_RXITIME	0x20000
309 #define	P_RXTHOLD	0x40000
310 
311 /*
312  *	Define a structure to communicate serial port signal and data state
313  *	information.
314  */
315 typedef struct asysigs {
316 	unsigned long	data;
317 	unsigned long	signal;
318 	unsigned long	sigvalue;
319 } asysigs_t;
320 
321 #define	DT_TXBUSY	0x1
322 #define	DT_TXEMPTY	0x2
323 #define	DT_TXLOW	0x4
324 #define	DT_TXHIGH	0x8
325 #define	DT_TXFULL	0x10
326 #define	DT_TXHOG	0x20
327 #define	DT_TXFLOWED	0x40
328 #define	DT_TXBREAK	0x80
329 
330 #define	DT_RXBUSY	0x100
331 #define	DT_RXEMPTY	0x200
332 #define	DT_RXLOW	0x400
333 #define	DT_RXHIGH	0x800
334 #define	DT_RXFULL	0x1000
335 #define	DT_RXHOG	0x2000
336 #define	DT_RXFLOWED	0x4000
337 #define	DT_RXBREAK	0x8000
338 
339 #define	SG_DTR		0x1
340 #define	SG_DCD		0x2
341 #define	SG_RTS		0x4
342 #define	SG_CTS		0x8
343 #define	SG_DSR		0x10
344 #define	SG_RI		0x20
345 
346 /*
347  *	Define the notification setting structure. This is used to tell the
348  *	port what events we want to be informed about. Fields here use the
349  *	same defines as for the asysigs structure above.
350  */
351 typedef struct asynotify {
352 	unsigned long	ctrl;
353 	unsigned long	data;
354 	unsigned long	signal;
355 	unsigned long	sigvalue;
356 } asynotify_t;
357 
358 /*
359  *	Define the port control structure. It is used to do fine grain
360  *	control operations on the port.
361  */
362 typedef struct {
363 	unsigned long	rxctrl;
364 	unsigned long	txctrl;
365 	char		rximdch;
366 	char		tximdch;
367 	char		spare1;
368 	char		spare2;
369 } asyctrl_t;
370 
371 #define	CT_ENABLE	0x1
372 #define	CT_DISABLE	0x2
373 #define	CT_STOP		0x4
374 #define	CT_START	0x8
375 #define	CT_STARTFLOW	0x10
376 #define	CT_STOPFLOW	0x20
377 #define	CT_SENDCHR	0x40
378 
379 /*
380  *	Define the stats structure kept for each port. This is a useful set
381  *	of data collected for each port on the slave. The A_GETSTATS command
382  *	is used to retrieve this data from the slave.
383  */
384 typedef struct asystats {
385 	unsigned long	opens;
386 	unsigned long	txchars;
387 	unsigned long	rxchars;
388 	unsigned long	txringq;
389 	unsigned long	rxringq;
390 	unsigned long	txmsgs;
391 	unsigned long	rxmsgs;
392 	unsigned long	txflushes;
393 	unsigned long	rxflushes;
394 	unsigned long	overruns;
395 	unsigned long	framing;
396 	unsigned long	parity;
397 	unsigned long	ringover;
398 	unsigned long	lost;
399 	unsigned long	rxstart;
400 	unsigned long	rxstop;
401 	unsigned long	txstart;
402 	unsigned long	txstop;
403 	unsigned long	dcdcnt;
404 	unsigned long	dtrcnt;
405 	unsigned long	ctscnt;
406 	unsigned long	rtscnt;
407 	unsigned long	dsrcnt;
408 	unsigned long	ricnt;
409 	unsigned long	txbreaks;
410 	unsigned long	rxbreaks;
411 	unsigned long	signals;
412 	unsigned long	state;
413 	unsigned long	hwid;
414 } asystats_t;
415 
416 /*****************************************************************************/
417 
418 /*
419  *	All command and control communication with a device on the slave is
420  *	via a control block in shared memory. Each device has its own control
421  *	block, defined by the following structure. The control block allows
422  *	the host to open, close and control the device on the slave.
423  */
424 typedef struct cdkctrl {
425 	unsigned char	open;
426 	unsigned char	close;
427 	unsigned long	openarg;
428 	unsigned long	closearg;
429 	unsigned long	cmd;
430 	unsigned long	status;
431 	unsigned long	args[32];
432 } cdkctrl_t;
433 
434 /*
435  *	Each device on the slave passes data to and from the host via a ring
436  *	queue in shared memory. Define a ring queue structure to hold the
437  *	vital information about each ring queue. Two ring queues will be
438  *	allocated for each port, one for receive data and one for transmit
439  *	data.
440  */
441 typedef struct cdkasyrq {
442 	unsigned long	offset;
443 	unsigned short	size;
444 	unsigned short	head;
445 	unsigned short	tail;
446 } cdkasyrq_t;
447 
448 /*
449  *	Each asynchronous port is defined in shared memory by the following
450  *	structure. It contains a control block to command a device, and also
451  *	the necessary data channel information as well.
452  */
453 typedef struct cdkasy {
454 	cdkctrl_t	ctrl;
455 	unsigned short	notify;
456 	asynotify_t	changed;
457 	unsigned short	receive;
458 	cdkasyrq_t	rxq;
459 	unsigned short	transmit;
460 	cdkasyrq_t	txq;
461 } cdkasy_t;
462 
463 #pragma	pack()
464 
465 /*****************************************************************************/
466 
467 /*
468  *	Define the set of ioctls used by the driver to do special things
469  *	to the board. These include interrupting it, and initializing
470  *	the driver after board startup and shutdown.
471  */
472 #include <linux/ioctl.h>
473 
474 #define	STL_BINTR	_IO('s',20)
475 #define	STL_BSTART	_IO('s',21)
476 #define	STL_BSTOP	_IO('s',22)
477 #define	STL_BRESET	_IO('s',23)
478 
479 /*
480  *	Define a set of ioctl extensions, used to get at special stuff.
481  */
482 #define	STL_GETPFLAG	_IO('s',80)
483 #define	STL_SETPFLAG	_IO('s',81)
484 
485 /*****************************************************************************/
486 #endif
487