/* Line printer stuff mostly follows the original Centronics printers. See
IEEE Std.1284-1994 Standard Signaling Method for a Bi-directional Parallel
Peripheral Interface for Personal Computers for 5 modes of data transfer. */
/* Parallel port registers: data (0x3bc, 0x378, 0x278), status=data+1, control=data+2 */
/* Parallel port status register (read only):
bit 7: NBSY (1: ready, 0: busy or error or off-line)
bit 6: NACK (if NBSY=1, then 1; if NBSY=0 then 1: sending data, 0: ready with data)
bit 5: PAP (1: out-of-paper)
bit 4: OFON (1: on-line)
bit 3: NFEH (1: OK, 0: printer error)
bits 2-0: 07
On out-of-paper: PAP=1, OFON=0, NFEH=1.
"When reading the busy status, read twice in a row and use the value
obtained from the second read. This improves the reliability on some
parallel ports when the busy line may not be connected and is floating."
"On some Okidata printers when the busy signal switches from high to low,
the printer sends a 50 ns glitch on the paper out signal line. Before
declaring a paper out condition, check the status again."
(The Undocumented PC, F. van Gilluwe, p. 711)
*/
/* Parallel port control register (read/write):
bit 4: IRQ (1: we want an interrupt when NACK goes from 1 to 0)
bit 3: DSL (1: activate printer)
bit 2: NINI (0: initialise printer)
bit 1: ALF (1: printer performs automatic linefeed after each line)
bit 0: STR (0->1: generate a Strobe pulse: transport data to printer)
*/
/* Parallel port timing:
1. wait for NBSY=1
2. outb(data byte, data port)
3. wait for at least 0.5us
4. read control port, OR with STR=0x1, output to control port - purpose:
generate strobe pulse; this will make the busy line go high
5. wait for at least 0.5us
6. read control port, AND with !STR, output to control port
7. wait for at least 0.5us
8. in a loop: read status register until NACK bit is 0 or NBSY=1
(the printer will keep NACK=0 for at least 0.5us, then NACK=NBSY=1).
*/
/* lp ioctls */
#define LPCHAR 0x0601 /* specify the number of times we ask for the status
(waiting for ready) before giving up with a timeout
The duration may mainly depend on the timing of an inb. */
#define LPTIME 0x0602 /* time to sleep after each timeout (in units of 0.01 sec) */
#define LPABORT 0x0604 /* call with TRUE arg to abort on error,
FALSE to retry. Default is retry. */
#define LPSETIRQ 0x0605 /* call with new IRQ number,
or 0 for polling (no IRQ) */
#define LPGETIRQ 0x0606 /* get the current IRQ number */
#define LPWAIT 0x0608 /* #of loops to wait before taking strobe high */
#define LPCAREFUL 0x0609 /* call with TRUE arg to require out-of-paper, off-
line, and error indicators good on all writes,
FALSE to ignore them. Default is ignore. */
#define LPABORTOPEN 0x060a /* call with TRUE arg to abort open() on error,
FALSE to ignore error. Default is ignore. */
#define LPGETSTATUS 0x060b /* return LP_S(minor) */
#define LPRESET 0x060c /* reset printer */
#define LPGETFLAGS 0x060e /* get status flags */
#define LPSTRICT 0x060f /* enable/disable strict compliance (2.0.36) */
/* Strict: wait until !READY before taking strobe low;
this may be bad for the Epson Stylus 800.
Not strict: wait a constant time as given by LPWAIT */
#define LPTRUSTIRQ 0x060f /* set/unset the LP_TRUST_IRQ flag (2.1.131) */
/*
* bit defines for 8255 status port
* base + 1
* accessed with LP_S(minor), which gets the byte...
*/
#define LP_PBUSY 0x80 /* inverted input, active high */
#define LP_PACK 0x40 /* unchanged input, active low */
#define LP_POUTPA 0x20 /* unchanged input, active high */
#define LP_PSELECD 0x10 /* unchanged input, active high */
#define LP_PERRORP 0x08 /* unchanged input, active low */