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