From 86236f442fa4a34085f9125da3a59a60e5118216 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Thu, 13 Aug 2009 11:12:02 +0000 Subject: [PATCH] another lp driver --- WEGA/src/uts/dev/lpn/lpn.c | 247 ++++++++++++++++++++++++++++++++++ WEGA/src/uts/dev/lpn/lpn.note | 16 +++ 2 files changed, 263 insertions(+) create mode 100644 WEGA/src/uts/dev/lpn/lpn.c create mode 100644 WEGA/src/uts/dev/lpn/lpn.note diff --git a/WEGA/src/uts/dev/lpn/lpn.c b/WEGA/src/uts/dev/lpn/lpn.c new file mode 100644 index 0000000..ec1a938 --- /dev/null +++ b/WEGA/src/uts/dev/lpn/lpn.c @@ -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 +#include +#include +#include +#include +#include +#include + +#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); +} diff --git a/WEGA/src/uts/dev/lpn/lpn.note b/WEGA/src/uts/dev/lpn/lpn.note new file mode 100644 index 0000000..41644e2 --- /dev/null +++ b/WEGA/src/uts/dev/lpn/lpn.note @@ -0,0 +1,16 @@ +lpn ist der erweiterte lp-Treiber fuer wega 3.2 +Mit mknod c 9 +sind die gewuenschten Eigenschaften und lp-namen zu installieren. +Dabei sind Kombinationen moeglich: +Fuer 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.