*BSD News Article 1610


Return to BSD News archive

Path: sserve!manuel!munnari.oz.au!spool.mu.edu!uunet!darwin.sura.net!Sirius.dfn.de!fauern!btr0x1!mb3.tu-chemnitz.de!hrz.tu-chemnitz.de!wutcd
From: wutcd@hrz.tu-chemnitz.de (Wunsch)
Newsgroups: comp.unix.bsd
Subject: 386BSD line printer driver
Summary: simple line printer driver for 386BSD
Keywords: 386BSD,lp()
Message-ID: <wutcd.708090976@hrz.tu-chemnitz.de>
Date: 9 Jun 92 11:56:16 GMT
Article-I.D.: hrz.wutcd.708090976
Sender: bin@hrz.tu-chemnitz.de (Owner of all binaries)
Organization: tu-chemnitz
Lines: 273


Hi, 386bsd-world,

here's my lp driver in its first (surely preliminary) version.
This is my first driver for a BSD, so I'm sure there are still
bugs in it. Any fixes and remarks are welcome.
The driver has been developed and tested on a slow SX machine
with 16 MHz clock together with an Epson LQ-550 printer. Maybe
the delay algorithm is weak enough to fail on fast machines (the
Centronics interface needs some distinct delays between the pulse
edges, but short enough not to tsleep() the process). But if you
experience this: first try increasing the system variable cpuspeed.
(This variable is normally set to 1 [or to 0 in the distribution
version of locore.s!]) So the DELAY macros will compute to more
time.
The boot time messages aren't quiet correct, the ioctl's propably
don't return their values... but the driver sends characters to
the printer, and the interrupt/context switch code seems to be
okay. So test it yourself.

Mail any suggestions and bug reports to

	joerg_wunsch%bonnie@hadrian.hrz.tu-chemnitz.de

------------------------------------------------------------------------
To install the driver you need to do the following:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Extract the files lpreg.h and lp.c from the text below and put
  them into /sys/i386/isa; lp.c is compressed and uu-encoded, so
  you must save the appropriate part of text into tempfile, then
  ``uudecode tempfile'' and ``uncompress lp.c''

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ edit /sys/i386/i386/conf.c according to the following diff script

151a152,162
> #include "lp.h"
> #if NLP > 0
> int	lpopen(),lpclose(),lpread(),lpwrite(), lpioctl();
> #else
> #define lpopen		enxio
> #define lpclose		enxio
> #define lpread		enxio
> #define lpwrite		enxio
> #define lpioctl		enxio
> #endif
> 
197a209,211
> 	{ lpopen,	lpclose,	lpread,		lpwrite,	/*D*/
> 	  lpioctl,	enodev,		nullop,		NULL,
> 	  seltrue,	enodev,		NULL },

  (NOTE: if you've already assigned a driver to character device major
  number 13 [``D''], choose a new one. The only place you need this in-
  formation is when creating the device special file[s].)


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ go to /sys/i386/conf and edit the following files

  append the line

i386/isa/lp.c		optional lp device-driver

  to ``files.i386'', and

  insert the device definition

device		lp0	at isa? port "IO_LPT1" bio irq 7 vector lpintr

  into the configuration file (normally the file SMALL)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ ``config SMALL''

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ go to /sys/compile/SMALL, ``make depend'' then ``make''

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ install the system [ ``mv /386bsd /386bsd.alt; cp 386bsd /'' ]
  and reboot

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ create the required device special files

  mknod /dev/lp0 c 13 0; ln /dev/lp0 /dev/lp; chmod 222 /dev/lp0

  The link for /dev/lp is optional, of course. It should be assigned
  to the default printer, I guess. In addition, you may link also

  ln -s ../i386/isa/lpreg.h /usr/include/sys/lpreg.h

  so user programs can refers to the definitons by including <sys/lpreg.h>

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ try ``ls -l > /dev/lp''

			That's all for today :-)
			J"org

--------------------------File lpreg.h--------------------------------
/*
 * Copyright (c) 1992 Joerg Wunsch, Dresden
 *
 * This software is part of 386BSD (Copyright by W. F. Jolitz), and
 * is provided with the same Copyright regulations as 386BSD except
 * the actual copyright holder.
 * See the file COPYRIGHT in root directory.
 *
 * Mail suggestions and bug reports to:
 *   joerg_wunsch%bonnie@hadrian.hrz.tu-chemnitz.de
 *
 */


/*
 * $Header: /usr/joerg/lp.drv/RCS/lpreg.h,v 1.1 1992/06/07 21:45:38 j Exp $
 *
 * definitions for (parallel) line printer driver
 */

#define LPPRI PZERO	/* any better solution??? PZERO is still interruptible */
#define LPBUFFSIZE 64	/* It isn't very useful to allocate a large buffer:
			 * most printers have buffer space enough to keep
			 * a small file, and large amounts of data will
			 * defer the caller anyway... The only sense to buffer
			 * data is to reduce the user -> kernel space transfer */

#define LPTIMEOUT (hz / 2) /* time to sleep for an interrupt till we declare
			    * the interrupt beeing lost and check status agn. */

#define LP_RESET_TMO 1000 /* # of cycles to check for printer is ready
			   * (ideally, this should be microsec's) */


/*
 * ioctl's for lp
 */

#define LP_IOCTL	('L' << 8)

#define LPI_RESET	(LP_IOCTL + 1)	/* hdwr reset printer */
#define LPI_STATUS	(LP_IOCTL + 2)	/* fetch status port */



/*
 * define lp (parallel) registers
 */

/*
 * register names
 */

#define	LP_DATA	0	/* outb() send to lp; inb() fetch last byte sent */


#define	LP_CTRL	2	/* lp controls, as follows: */

#define	LPC_STRB	001	/* strobe; set when sending byte */
#define	LPC_ALF		002	/* auto-LF; when set lp LF's after CR */
#define	LPC_INIT	004	/* /init; when clear reset lp */
#define	LPC_SLCTIN	010	/* select in; set to select lp */
#define	LPC_IRQEN	020	/* irq enable; enables hdwr int on ack */

/* all bits to be set when LP_CTRL is beeing enabled */
#define	LPC_ENABLED	(LPC_INIT + LPC_SLCTIN + LPC_IRQEN)

#define	LP_STAT	1	/* lp status, read/only */

#define	LPS_ERR		010	/* clear: lp signals error */
#define	LPS_SLCT	020	/* set: lp is selected */
#define	LPS_PE		040	/* set: lp out of paper */
#define	LPS_ACK		0100	/* cleared during acknowledgment */
#define	LPS_BUSY	0200	/* clear: lp is busy (or error) */

#define	LPS_MASK	(LPS_ERR + LPS_SLCT + LPS_PE + LPS_ACK + LPS_BUSY)

--------------------------File lp.c.Z.uuencoded------------------------
begin 644 lp.c.Z
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
LZD@`AU4>LVJOY[T#%K[/BINZZ@2\R@2^2E'NN+GP-0)H]2;V&B=99R<S(D)R
`
end
------------------end of lp device driver--------------------------