another lp driver

This commit is contained in:
Oliver Lehmann 2009-08-13 11:12:02 +00:00
parent aefc5e7184
commit 86236f442f
2 changed files with 263 additions and 0 deletions

247
WEGA/src/uts/dev/lpn/lpn.c Normal file
View File

@ -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);
}

View File

@ -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.