ppbconf.h revision 185003
1117610Sdes/*-
2117610Sdes * Copyright (c) 1997, 1998, 1999 Nicolas Souchu
3141098Sdes * All rights reserved.
4228692Sdes *
5141098Sdes * Redistribution and use in source and binary forms, with or without
6141098Sdes * modification, are permitted provided that the following conditions
7141098Sdes * are met:
8141098Sdes * 1. Redistributions of source code must retain the above copyright
9117610Sdes *    notice, this list of conditions and the following disclaimer.
10141098Sdes * 2. Redistributions in binary form must reproduce the above copyright
11117610Sdes *    notice, this list of conditions and the following disclaimer in the
12141098Sdes *    documentation and/or other materials provided with the distribution.
13141098Sdes *
14141098Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15141098Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16141098Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17141098Sdes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18117610Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19141098Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20141098Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21141098Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22141098Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23141098Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24141098Sdes * SUCH DAMAGE.
25141098Sdes *
26141098Sdes * $FreeBSD: head/sys/dev/ppbus/ppbconf.h 185003 2008-11-16 17:42:02Z jhb $
27141098Sdes *
28141098Sdes */
29141098Sdes#ifndef __PPBCONF_H
30141098Sdes#define __PPBCONF_H
31141098Sdes
32141098Sdes#include <sys/queue.h>
33141098Sdes
34141098Sdes/*
35141098Sdes * Parallel Port Bus sleep/wakeup queue.
36141098Sdes */
37117610Sdes#define PPBPRI	(PZERO+8)
38117610Sdes
39117610Sdes/*
40117610Sdes * Parallel Port Chipset mode masks.
41117610Sdes * NIBBLE mode is supposed to be available under each other modes.
42228692Sdes */
43117610Sdes#define PPB_COMPATIBLE	0x0	/* Centronics compatible mode */
44228692Sdes
45228692Sdes#define PPB_NIBBLE	0x1	/* reverse 4 bit mode */
46228692Sdes#define PPB_PS2		0x2	/* PS/2 byte mode */
47228692Sdes#define PPB_EPP		0x4	/* EPP mode, 32 bit */
48117610Sdes#define PPB_ECP		0x8	/* ECP mode */
49117610Sdes
50117610Sdes/* mode aliases */
51228692Sdes#define PPB_SPP		PPB_NIBBLE|PPB_PS2
52228692Sdes#define PPB_BYTE	PPB_PS2
53228692Sdes
54228692Sdes#define PPB_MASK		0x0f
55228692Sdes#define PPB_OPTIONS_MASK	0xf0
56228692Sdes
57117610Sdes#define PPB_IS_EPP(mode) (mode & PPB_EPP)
58228692Sdes#define PPB_IN_EPP_MODE(bus) (PPB_IS_EPP (ppb_get_mode (bus)))
59228692Sdes#define PPB_IN_NIBBLE_MODE(bus) (ppb_get_mode (bus) & PPB_NIBBLE)
60117610Sdes#define PPB_IN_PS2_MODE(bus) (ppb_get_mode (bus) & PPB_PS2)
61228692Sdes
62228692Sdes#define n(flags) (~(flags) & (flags))
63228692Sdes
64228692Sdes/*
65228692Sdes * Parallel Port Chipset control bits.
66228692Sdes */
67228692Sdes#define STROBE		0x01
68228692Sdes#define AUTOFEED	0x02
69228692Sdes#define nINIT		0x04
70117610Sdes#define SELECTIN	0x08
71228692Sdes#define IRQENABLE	0x10
72228692Sdes#define PCD		0x20
73228692Sdes
74228692Sdes#define nSTROBE		n(STROBE)
75228692Sdes#define nAUTOFEED	n(AUTOFEED)
76228692Sdes#define INIT		n(nINIT)
77228692Sdes#define nSELECTIN	n(SELECTIN)
78228692Sdes#define nPCD		n(PCD)
79228692Sdes
80228692Sdes/*
81228692Sdes * Parallel Port Chipset status bits.
82228692Sdes */
83228692Sdes#define TIMEOUT		0x01
84228692Sdes#define nFAULT		0x08
85228692Sdes#define SELECT		0x10
86228692Sdes#define PERROR		0x20
87228692Sdes#define nACK		0x40
88228692Sdes#define nBUSY		0x80
89141098Sdes
90228692Sdes/*
91228692Sdes * Structure to store status information.
92141098Sdes */
93228692Sdesstruct ppb_status {
94141098Sdes	unsigned char status;
95141098Sdes
96141098Sdes	unsigned int timeout:1;
97228692Sdes	unsigned int error:1;
98228692Sdes	unsigned int select:1;
99228692Sdes	unsigned int paper_end:1;
100174832Sdes	unsigned int ack:1;
101117610Sdes	unsigned int busy:1;
102228692Sdes};
103228692Sdes
104141098Sdes/* Parallel port bus I/O opcodes */
105174832Sdes#define PPB_OUTSB_EPP	1
106174832Sdes#define PPB_OUTSW_EPP	2
107117610Sdes#define PPB_OUTSL_EPP	3
108174832Sdes#define PPB_INSB_EPP	4
109174832Sdes#define PPB_INSW_EPP	5
110174832Sdes#define PPB_INSL_EPP	6
111117610Sdes#define PPB_RDTR	7
112141098Sdes#define PPB_RSTR	8
113228692Sdes#define PPB_RCTR	9
114228692Sdes#define PPB_REPP_A	10
115117610Sdes#define PPB_REPP_D	11
116228692Sdes#define PPB_RECR	12
117228692Sdes#define PPB_RFIFO	13
118228692Sdes#define PPB_WDTR	14
119228692Sdes#define PPB_WSTR	15
120228692Sdes#define PPB_WCTR	16
121228692Sdes#define PPB_WEPP_A	17
122228692Sdes#define PPB_WEPP_D	18
123228692Sdes#define PPB_WECR	19
124228692Sdes#define PPB_WFIFO	20
125228692Sdes
126141098Sdes/*
127228692Sdes * How tsleep() is called in ppb_request_bus().
128228692Sdes */
129141098Sdes#define PPB_DONTWAIT	0
130117610Sdes#define PPB_NOINTR	0
131228692Sdes#define PPB_WAIT	0x1
132141098Sdes#define PPB_INTR	0x2
133228692Sdes#define PPB_POLL	0x4
134117610Sdes#define PPB_FOREVER	-1
135228692Sdes
136117610Sdes/*
137228692Sdes * Microsequence stuff.
138228692Sdes */
139141098Sdes#define PPB_MS_MAXLEN	64		/* XXX according to MS_INS_MASK */
140228692Sdes#define PPB_MS_MAXARGS	3		/* according to MS_ARG_MASK */
141117610Sdes
142174832Sdes/* maximum number of mode dependent
143117610Sdes * submicrosequences for in/out operations
144228692Sdes */
145228692Sdes#define PPB_MAX_XFER	6
146228692Sdes
147228692Sdesunion ppb_insarg {
148228692Sdes	int	i;
149228692Sdes	void	*p;
150228692Sdes	char	*c;
151228692Sdes	int	(* f)(void *, char *);
152117610Sdes};
153141098Sdes
154228692Sdesstruct ppb_microseq {
155117610Sdes	int			opcode;			/* microins. opcode */
156228692Sdes	union ppb_insarg	arg[PPB_MS_MAXARGS];	/* arguments */
157117610Sdes};
158228692Sdes
159228692Sdes/* microseqences used for GET/PUT operations */
160117610Sdesstruct ppb_xfer {
161228692Sdes	struct ppb_microseq *loop;		/* the loop microsequence */
162117610Sdes};
163174832Sdes
164174832Sdes/*
165228692Sdes * Parallel Port Bus Device structure.
166141098Sdes */
167228692Sdesstruct ppb_data;			/* see below */
168228692Sdes
169228692Sdesstruct ppb_context {
170228692Sdes	int valid;			/* 1 if the struct is valid */
171228692Sdes	int mode;			/* XXX chipset operating mode */
172141098Sdes
173228692Sdes	struct microseq *curpc;		/* pc in curmsq */
174141098Sdes	struct microseq *curmsq;	/* currently executed microseqence */
175141098Sdes};
176228692Sdes
177228692Sdes/*
178228692Sdes * List of IVARS available to ppb device drivers
179228692Sdes */
180228692Sdes#define PPBUS_IVAR_MODE 0
181228692Sdes
182228692Sdes/* other fields are reserved to the ppbus internals */
183228692Sdes
184228692Sdesstruct ppb_device {
185228692Sdes
186228692Sdes	const char *name;		/* name of the device */
187228692Sdes
188228692Sdes	u_int flags;			/* flags */
189228692Sdes
190228692Sdes	struct ppb_context ctx;		/* context of the device */
191228692Sdes
192228692Sdes					/* mode dependent get msq. If NULL,
193141098Sdes					 * IEEE1284 code is used */
194141098Sdes	struct ppb_xfer
195141098Sdes		get_xfer[PPB_MAX_XFER];
196141098Sdes
197141098Sdes					/* mode dependent put msq. If NULL,
198141098Sdes					 * IEEE1284 code is used */
199141098Sdes	struct ppb_xfer
200117610Sdes		put_xfer[PPB_MAX_XFER];
201117610Sdes
202228692Sdes 	struct resource *intr_resource;
203228692Sdes 	void *intr_cookie;
204228692Sdes};
205228692Sdes
206228692Sdes/* EPP standards */
207228692Sdes#define EPP_1_9		0x0			/* default */
208228692Sdes#define EPP_1_7		0x1
209228692Sdes
210228692Sdes/* Parallel Port Chipset IVARS */		/* elsewhere XXX */
211228692Sdes#define PPC_IVAR_EPP_PROTO	0
212228692Sdes
213228692Sdes/*
214228692Sdes * Maximum size of the PnP info string
215228692Sdes */
216228692Sdes#define PPB_PnP_STRING_SIZE	256			/* XXX */
217228692Sdes
218228692Sdes/*
219228692Sdes * Parallel Port Bus structure.
220228692Sdes */
221228692Sdesstruct ppb_data {
222228692Sdes
223228692Sdes#define PPB_PnP_PRINTER	0
224228692Sdes#define PPB_PnP_MODEM	1
225228692Sdes#define PPB_PnP_NET	2
226228692Sdes#define PPB_PnP_HDC	3
227228692Sdes#define PPB_PnP_PCMCIA	4
228228692Sdes#define PPB_PnP_MEDIA	5
229141098Sdes#define PPB_PnP_FDC	6
230141098Sdes#define PPB_PnP_PORTS	7
231141098Sdes#define PPB_PnP_SCANNER	8
232141098Sdes#define PPB_PnP_DIGICAM	9
233228692Sdes#define PPB_PnP_UNKNOWN	10
234141098Sdes	int class_id;		/* not a PnP device if class_id < 0 */
235117610Sdes
236141098Sdes	int state;		/* current IEEE1284 state */
237141098Sdes	int error;		/* last IEEE1284 error */
238228692Sdes
239228692Sdes	int mode;		/* IEEE 1284-1994 mode
240228692Sdes				 * NIBBLE, PS2, EPP or ECP */
241228692Sdes
242117610Sdes	void *ppb_owner;	/* device which owns the bus */
243174832Sdes};
244141098Sdes
245141098Sdes#ifdef _KERNEL
246141098Sdesextern int ppb_attach_device(device_t);
247141098Sdesextern int ppb_request_bus(device_t, device_t, int);
248141098Sdesextern int ppb_release_bus(device_t, device_t);
249141098Sdes
250117610Sdes/* bus related functions */
251228692Sdesextern int ppb_get_status(device_t, struct ppb_status *);
252141098Sdesextern int ppb_poll_bus(device_t, int, char, char, int);
253141098Sdesextern int ppb_reset_epp_timeout(device_t);
254141098Sdesextern int ppb_ecp_sync(device_t);
255117610Sdesextern int ppb_get_epp_protocol(device_t);
256228692Sdesextern int ppb_set_mode(device_t, int);		/* returns old mode */
257141098Sdesextern int ppb_get_mode(device_t);		/* returns current mode */
258141098Sdesextern int ppb_write(device_t, char *, int, int);
259228692Sdes#endif /* _KERNEL */
260141098Sdes
261117610Sdes/*
262141098Sdes * These are defined as macros for speedup.
263141098Sdes#define ppb_get_base_addr(dev) ((dev)->ppb->ppb_link->base)
264141098Sdes#define ppb_get_epp_protocol(dev) ((dev)->ppb->ppb_link->epp_protocol)
265174832Sdes */
266228692Sdes
267174832Sdes#endif
268174832Sdes