another lp driver
This commit is contained in:
parent
aefc5e7184
commit
86236f442f
|
|
@ -0,0 +1,247 @@
|
|||
/******************************************************************************
|
||||
*******************************************************************************
|
||||
|
||||
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1987
|
||||
|
||||
KERN 3.2 Modul: lp.c
|
||||
|
||||
Bearbeiter: P. Hoge
|
||||
Datum: 13.2.89
|
||||
Version: 1.3
|
||||
|
||||
Modifiziert: AFIO, jg, 23.02.94
|
||||
dev-bit 0x10 : kein 0x0c beim close
|
||||
0x20 : keine Umschaltung auf raw-Mode
|
||||
0x40 : permanenter raw-Mode
|
||||
0x80 : lp2-Parameter, (veraendert)
|
||||
|
||||
*******************************************************************************
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/dir.h>
|
||||
#include <sys/mmu.h>
|
||||
#include <sys/s.out.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/user.h>
|
||||
|
||||
#define LPOUT ESC /* ESC-Bit siehe tty.h */
|
||||
|
||||
extern struct tty sio[];
|
||||
extern struct tty * sioopen();
|
||||
|
||||
struct lprint
|
||||
{
|
||||
struct lparms max;
|
||||
int curline;
|
||||
int curcol;
|
||||
int raw;
|
||||
int indflg;
|
||||
};
|
||||
|
||||
struct lprint lp1_dt = {66, 128, 0, 0, 0, 0, 0};
|
||||
struct lprint lp2_dt = {90, 160, 0, 0, 0, 0, 0};
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
*lpopen
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
lpopen(dev)
|
||||
register dev_t dev;
|
||||
{
|
||||
register struct tty *tp;
|
||||
|
||||
if ((tp = sioopen(dev & 0xff0f, -1)) == 0)
|
||||
return;
|
||||
|
||||
/* Verriegeln des Treibers fuer weiteres Open */
|
||||
/* tp->t_state |= XCLUSE; */
|
||||
|
||||
if ((tp->t_state & LP) == 0) {
|
||||
tp->t_state |= LP;
|
||||
tp->t_cflag &= ~HUPCL;
|
||||
tp->t_lflag = 0;
|
||||
tp->t_iflag = IGNPAR|ISTRIP|IXON;
|
||||
}
|
||||
tp->t_oflag = 0;
|
||||
sioparam(dev & 0x0f);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
*lpclose
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
lpclose(dev)
|
||||
register dev_t dev;
|
||||
{
|
||||
register struct tty *tp;
|
||||
|
||||
tp = &sio[dev & 0x0f];
|
||||
if (tp->t_state & LPOUT) {
|
||||
if ((dev & 0x40) == 0)
|
||||
lpoutput(0x80, tp, dev);
|
||||
if ((dev & 0x10) == 0) /* @ */
|
||||
lpoutput(0x0c, tp, dev);
|
||||
}
|
||||
sioclose(dev & 0x0f);
|
||||
dvi();
|
||||
tp->t_state &= ~(XCLUSE | LPOUT);
|
||||
evi();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
*lpwrite
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
lpwrite(dev)
|
||||
register dev_t dev;
|
||||
{
|
||||
register struct tty *tp;
|
||||
register c;
|
||||
|
||||
tp = &sio[dev & 0x0f];
|
||||
while (u.u_count) {
|
||||
dvi();
|
||||
tp->t_state |= LPOUT;
|
||||
while (tp->t_outq.c_cc > tthiwat[tp->t_cflag & CBAUD]) {
|
||||
sioproc(tp, T_OUTPUT);
|
||||
tp->t_state |= OASLP;
|
||||
sleep(&tp->t_outq, TTOPRI);
|
||||
}
|
||||
evi();
|
||||
if ((c = cpass()) < 0)
|
||||
break;
|
||||
lpoutput(c, tp, dev);
|
||||
}
|
||||
dvi();
|
||||
sioproc(tp, T_OUTPUT);
|
||||
evi();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
*lpoutput
|
||||
* 1B hex Einschalten Raw-Mode
|
||||
* 80 hex Ausschalten Raw-Mode
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
lpoutput(c, tp, dev)
|
||||
register c;
|
||||
struct tty *tp;
|
||||
dev_t dev;
|
||||
{
|
||||
register n;
|
||||
register struct lprint *plp;
|
||||
register struct clist *poutq = &tp->t_outq;
|
||||
|
||||
if (dev & 0x40) { /* permanenter raw-Mode */
|
||||
putc(c, poutq);
|
||||
return;
|
||||
}
|
||||
if (dev & 0x0080)
|
||||
plp = &lp2_dt;
|
||||
else
|
||||
plp = &lp1_dt;
|
||||
|
||||
if (c==0x80) { /* reset lp raw mode */
|
||||
plp->raw = 0;
|
||||
return;
|
||||
}
|
||||
if (plp->raw) {
|
||||
putc(c, poutq);
|
||||
return;
|
||||
}
|
||||
if (dev & 0x20) /* keine autom. Umschaltung auf Raw-Mode */
|
||||
goto noraw;
|
||||
if (c == 0x1b) { /* set lp raw mode */
|
||||
plp->raw = 1;
|
||||
putc(c, poutq);
|
||||
return;
|
||||
}
|
||||
noraw:
|
||||
if (c == '\n') {
|
||||
lpoutput('\r', tp, dev);
|
||||
plp->curline++;
|
||||
if (plp->max.lines && plp->curline >= plp->max.lines)
|
||||
c = 0x0c;
|
||||
}
|
||||
if (c == 0x0c) {
|
||||
if (plp->curline == 0 && plp->curcol == 0)
|
||||
return;
|
||||
plp->curline = 0;
|
||||
putc(c, poutq);
|
||||
c = '\r';
|
||||
}
|
||||
if (c == '\r') {
|
||||
plp->indflg = 0;
|
||||
plp->curcol = 0;
|
||||
putc(c, poutq);
|
||||
return;
|
||||
}
|
||||
if (c == '\t') {
|
||||
do
|
||||
lpoutput(' ', tp, dev);
|
||||
while (plp->curcol & 07);
|
||||
return;
|
||||
}
|
||||
if (c == 0x08) {
|
||||
if (plp->curcol) {
|
||||
plp->curcol--;
|
||||
putc(c, poutq);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (c == '\n' || c == 0x07) {
|
||||
putc(c, poutq);
|
||||
return;
|
||||
}
|
||||
if (plp->indflg == 0) {
|
||||
plp->indflg++;
|
||||
for (n = plp->max.indent; n > 0; n--)
|
||||
putc(' ', poutq);
|
||||
}
|
||||
plp->curcol++;
|
||||
if (plp->max.cols == 0 || plp->curcol <= plp->max.cols+plp->max.indent)
|
||||
putc(c, poutq);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
*lpioctl
|
||||
* Lesen und Setzen der lparms Struktur
|
||||
* und Aufruf ttiocco (tty.c)
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
lpioctl(dev, cmd, addr, flag)
|
||||
register dev_t dev;
|
||||
register cmd;
|
||||
register caddr_t addr;
|
||||
int flag;
|
||||
{
|
||||
register struct lparms *plp;
|
||||
|
||||
if ((dev & 0x0080) == 0)
|
||||
plp = &lp1_dt.max;
|
||||
else
|
||||
plp = &lp2_dt.max;
|
||||
|
||||
if (cmd == SHOWLPR) {
|
||||
if ((copyout(plp, addr, sizeof(struct lparms))) < 0)
|
||||
u.u_error = EFAULT;
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd == SETLPR) {
|
||||
if ((copyin(addr, plp, sizeof(struct lparms))) < 0)
|
||||
u.u_error = EFAULT;
|
||||
if (plp->cols <= plp->indent)
|
||||
plp->indent = 0;
|
||||
return;
|
||||
}
|
||||
sioioctl((dev & 0xff0f), cmd, addr, flag);
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
lpn ist der erweiterte lp-Treiber fuer wega 3.2
|
||||
Mit mknod <lp> c 9 <min>
|
||||
sind die gewuenschten Eigenschaften und lp-namen zu installieren.
|
||||
Dabei sind Kombinationen moeglich:
|
||||
Fuer <min> gilt
|
||||
0x00 normal lp Parameter (66 Z, 128 Sp, 0)
|
||||
0x10 kein Seitenvorschub (0x0c) beim close
|
||||
0x20 keine Umschaltung auf raw-Mode bei ESC
|
||||
0x40 permanenter raw-Mode
|
||||
0x80 lp2 Parameter (90 Z, 160 Sp, 0)
|
||||
+3 (bei tty3 als Druckerkanal)
|
||||
Das Objekt lpn.o ist nach /usr/sys/dev/lp.o zu kopieren (moven) und mit
|
||||
ar rv LIB2 lp.o das alte lp.o zu ersetzen.
|
||||
Die beiden lp-Parameterfelder koennen mit setlp [-d /dev/lpx] angezeigt
|
||||
und veraendert werden.
|
||||
Zum Test fuer lx kann der Druckauftrag io3sys* dienen.
|
||||
Loading…
Reference in New Issue