upd7210.h revision 141398
1/*-
2 * Copyright (c) 2005 Poul-Henning Kamp <phk@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/dev/ieee488/upd7210.h 141398 2005-02-06 15:22:23Z phk $
27 *
28 * Locating an actual �PD7210 data book has proven quite impossible for me.
29 * There are a fair number of newer chips which are supersets of the �PD7210
30 * but they are particular eager to comprehensively mark what the extensions
31 * are and what is in the base set.  Some even give the registers and their
32 * bits new names.
33 *
34 * The following information is based on a description of the �PD7210 found
35 * in an old manual for a VME board which used the chip.
36 */
37
38/* upd7210 interface definitions */
39
40struct upd7210;
41
42struct ibfoo;
43
44void upd7210intr(void *);
45void upd7210attach(struct upd7210 *);
46
47typedef int upd7210_irq_t(struct upd7210 *);
48
49struct upd7210 {
50	bus_space_handle_t	reg_handle[8];
51	bus_space_tag_t		reg_tag[8];
52	u_int			reg_offset[8];
53	u_int			dmachan;
54
55	/* private stuff */
56	struct timeval		deadline;
57	struct mtx		mutex;
58	uint8_t			rreg[8];
59	uint8_t			wreg[8 + 8];
60
61	upd7210_irq_t		*irq;
62
63	int			busy;
64	u_char			*buf;
65	size_t			bufsize;
66	u_int			buf_wp;
67	u_int			buf_rp;
68	struct cdev		*cdev;
69
70	struct ibfoo		*ibfoo;
71};
72
73/* upd7210 hardware definitions. */
74
75/* Write registers */
76enum upd7210_wreg {
77	CDOR	= 0,			/* Command/Data Out Register	*/
78	IMR1	= 1,			/* Interrupt Mask Register 1	*/
79	IMR2	= 2,			/* Interrupt Mask Register 2	*/
80	SPMR	= 3,			/* Serial Poll Mode Register	*/
81	ADMR	= 4,			/* ADdress Mode Register	*/
82	AUXMR	= 5,			/* AUXilliary Mode Register	*/
83	ICR	= 5,			/* Internal Counter Register	*/
84	PPR	= 5,			/* Parallel Poll Register	*/
85	AUXRA	= 5,			/* AUXilliary Register A	*/
86	AUXRB	= 5,			/* AUXilliary Register B	*/
87	AUXRE	= 5,			/* AUXilliary Register E	*/
88	ADR	= 6,			/* ADdress Register		*/
89	EOSR	= 7,			/* End-Of-String Register	*/
90};
91
92/* Read registers */
93enum upd7210_rreg {
94	DIR	= 0,			/* Data In Register		*/
95	ISR1	= 1,			/* Interrupt Status Register 1	*/
96	ISR2	= 2,			/* Interrupt Status Register 2	*/
97	SPSR	= 3,			/* Serial Poll Status Register	*/
98	ADSR	= 4,			/* ADdress Status Register	*/
99	CPTR	= 5,			/* Command Pass Though Register	*/
100	ADR0	= 6,			/* ADdress Register 0		*/
101	ADR1	= 7,			/* ADdress Register 1		*/
102};
103
104/* Bits for ISR1 and IMR1 */
105#define IXR1_DI		(1 << 0)	/* Data In			*/
106#define IXR1_DO		(1 << 1)	/* Data Out			*/
107#define IXR1_ERR	(1 << 2)	/* Error			*/
108#define IXR1_DEC	(1 << 3)	/* Device Clear			*/
109#define IXR1_ENDRX	(1 << 4)	/* End Received			*/
110#define IXR1_DET	(1 << 5)	/* Device Execute Trigger	*/
111#define IXR1_APT	(1 << 6)	/* Address Pass-Through		*/
112#define IXR1_CPT	(1 << 7)	/* Command Pass-Through		*/
113
114/* Bits for ISR2 and IMR2 */
115#define IXR2_ADSC	(1 << 0)	/* Addressed Status Change	*/
116#define IXR2_REMC	(1 << 1)	/* Remote Change		*/
117#define IXR2_LOKC	(1 << 2)	/* Lockout Change		*/
118#define IXR2_CO		(1 << 3)	/* Command Out			*/
119#define ISR2_REM	(1 << 4)	/* Remove			*/
120#define IMR2_DMAI	(1 << 4)	/* DMA In Enable		*/
121#define ISR2_LOK	(1 << 5)	/* Lockout			*/
122#define IMR2_DMAO	(1 << 5)	/* DMA Out Enable		*/
123#define IXR2_SRQI	(1 << 6)	/* Service Request Input	*/
124#define ISR2_INT	(1 << 7)	/* Interrupt			*/
125
126#define SPSR_PEND	(1 << 6)	/* Pending			*/
127#define SPMR_RSV	(1 << 6)	/* Request SerVice		*/
128
129#define ADSR_MJMN	(1 << 0)	/* MaJor MiNor			*/
130#define ADSR_TA		(1 << 1)	/* Talker Active		*/
131#define ADSR_LA		(1 << 2)	/* Listener Active		*/
132#define ADSR_TPAS	(1 << 3)	/* Talker Primary Addr. State	*/
133#define ADSR_LPAS	(1 << 4)	/* Listener Primary Addr. State	*/
134#define ADSR_SPMS	(1 << 5)	/* Serial Poll Mode State	*/
135#define ADSR_ATN	(1 << 6)	/* Attention			*/
136#define ADSR_CIC	(1 << 7)	/* Controller In Charge		*/
137
138#define ADMR_ADM0	(1 << 0)	/* Address Mode 0		*/
139#define ADMR_ADM1	(1 << 1)	/* Address Mode 1		*/
140#define ADMR_TRM0	(1 << 4)	/* Transmit/Receive Mode 0	*/
141#define ADMR_TRM1	(1 << 5)	/* Transmit/Receive Mode 1	*/
142#define ADMR_LON	(1 << 6)	/* Listen Only			*/
143#define ADMR_TON	(1 << 7)	/* Talk Only			*/
144
145/* Constant part of overloaded write registers */
146#define	C_ICR		0x20
147#define	C_PPR		0x60
148#define	C_AUXA		0x80
149#define	C_AUXB		0xa0
150#define	C_AUXE		0xc0
151
152#define AUXMR_PON	0x00		/* Immediate Execute pon	*/
153#define AUXMR_CPP	0x01		/* Clear Parallel Poll		*/
154#define AUXMR_CRST	0x02		/* Chip Reset			*/
155#define AUXMR_RFD	0x03		/* Finish Handshake		*/
156#define AUXMR_TRIG	0x04		/* Trigger			*/
157#define AUXMR_RTL	0x05		/* Return to local		*/
158#define AUXMR_SEOI	0x06		/* Send EOI			*/
159#define AUXMR_NVSA	0x07		/* Non-Valid Secondary cmd/addr	*/
160					/* 0x08 undefined/unknown	*/
161#define AUXMR_SPP	0x09		/* Set Parallel Poll		*/
162					/* 0x0a undefined/unknown	*/
163					/* 0x0b undefined/unknown	*/
164					/* 0x0c undefined/unknown	*/
165					/* 0x0d undefined/unknown	*/
166					/* 0x0e undefined/unknown	*/
167#define AUXMR_VSA	0x0f		/* Valid Secondary cmd/addr	*/
168#define AUXMR_GTS	0x10		/* Go to Standby		*/
169#define AUXMR_TCA	0x11		/* Take Control Async (pulsed)	*/
170#define AUXMR_TCS	0x12		/* Take Control Synchronously	*/
171#define AUXMR_LISTEN	0x13		/* Listen			*/
172#define AUXMR_DSC	0x14		/* Disable System Control	*/
173					/* 0x15 undefined/unknown	*/
174#define AUXMR_SIFC	0x16		/* Set IFC			*/
175#define AUXMR_CREN	0x17		/* Clear REN			*/
176					/* 0x18 undefined/unknown	*/
177					/* 0x19 undefined/unknown	*/
178#define AUXMR_TCSE	0x1a		/* Take Control Sync on End	*/
179#define AUXMR_LCM	0x1b		/* Listen Continuously Mode	*/
180#define AUXMR_LUNL	0x1c		/* Local Unlisten		*/
181#define AUXMR_EPP	0x1d		/* Execute Parallel Poll	*/
182#define AUXMR_CIFC	0x1e		/* Clear IFC			*/
183#define AUXMR_SREN	0x1f		/* Set REN			*/
184
185#define PPR_U		(1 << 4)	/* Unconfigure			*/
186#define PPR_S		(1 << 3)	/* Status Polarity		*/
187
188#define AUXA_HLDA	(1 << 0)	/* Holdoff on All		*/
189#define AUXA_HLDE	(1 << 1)	/* Holdoff on END		*/
190#define AUXA_REOS	(1 << 2)	/* End on EOS received		*/
191#define AUXA_XEOS	(1 << 3)	/* Transmit END with EOS	*/
192#define AUXA_BIN	(1 << 4)	/* Binary			*/
193
194#define AUXB_CPTE	(1 << 0)	/* Cmd Pass Through Enable	*/
195#define AUXB_SPEOI	(1 << 1)	/* Send Serial Poll EOI		*/
196#define AUXB_TRI	(1 << 2)	/* Three-State Timing		*/
197#define AUXB_INV	(1 << 3)	/* Invert			*/
198#define AUXB_ISS	(1 << 4)	/* Individual Status Select	*/
199
200#define AUXE_DHDT	(1 << 0)	/* DAC Holdoff on DTAS		*/
201#define AUXE_DHDC	(1 << 1)	/* DAC Holdoff on DCAS		*/
202
203#define ADR0_DL0	(1 << 5)	/* Disable Listener 0		*/
204#define ADR0_DT0	(1 << 6)	/* Disable Talker 0		*/
205
206#define ADR_DL		(1 << 5)	/* Disable Listener		*/
207#define ADR_DT		(1 << 6)	/* Disable Talker		*/
208#define ADR_ARS		(1 << 7)	/* Address Register Select	*/
209
210#define ADR1_DL1	(1 << 5)	/* Disable Listener 1		*/
211#define ADR1_DT1	(1 << 6)	/* Disable Talker 1		*/
212#define ADR1_EOI	(1 << 7)	/* End or Identify		*/
213
214