From f96594affe0731a81679795f5b8e40a173a05e47 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 30 Jan 2018 00:23:59 +0000 Subject: [PATCH] ubee: first draft of printer driver --- Kernel/platform-ubee/devlpr.c | 47 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/Kernel/platform-ubee/devlpr.c b/Kernel/platform-ubee/devlpr.c index 65d8c439..906a3e34 100644 --- a/Kernel/platform-ubee/devlpr.c +++ b/Kernel/platform-ubee/devlpr.c @@ -3,36 +3,51 @@ #include #include -__sfr __at 0x02 lpstat; /* I/O 2 and 3 */ -__sfr __at 0x03 lpdata; +__sfr __at 0x00 lpdata; /* I/O 0 PIO A data */ int lpr_open(uint8_t minor, uint16_t flag) { - minor; flag; // shut up compiler + used(flag); + if (minor) { + udata.u_error = ENODEV; + return -1; + } return 0; } int lpr_close(uint8_t minor) { - minor; // shut up compiler + used(minor); return 0; } +static volatile uint8_t lpready = 1; + +void lpr_interrupt(void) +{ + lpready = 1; + wakeup(&lpready); +} + int lpr_write(uint8_t minor, uint8_t rawflag, uint8_t flag) { - int c = udata.u_count; - char *p = udata.u_base; - minor; rawflag; flag; // shut up compiler + used(minor); + used(rawflag); - while(c) { - /* Note; on real hardware it might well be necessary to - busy wait a bit just to get acceptable performance */ - while (lpstat != 0xFF) { -// if (psleep_flags(&clocktick, flag)) -// return -1; + /* Unusually for an 8bit micro the MicroBee has interrupt driven + parallel managed via the Z80PIOA. It's not always used for a printer + so we do need to fix interactions if we add other devices for that + port and interlock them */ + while(udata.u_done < udata.u_count) { + /* Avoid IRQ race */ + irqflags_t irq = di(); + if (!lpready && psleep_flags_io(&lpready, flag)) { + irqrestore(irq); + break; } - /* FIXME: tidy up ugetc and sysio checks globally */ - lpdata = ugetc(p++); + irqrestore(irq); + lpready = 0; + lpdata = ugetc(udata.u_base++); } - return (-1); + return udata.u_done; } -- 2.34.1