From 82c27152e47ae95a68d165c23a5fe4e3f47d5caf Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Sat, 17 Nov 2018 15:41:28 +0000 Subject: [PATCH] sam: printer support --- Kernel/platform-sam/devlpr.c | 72 +++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/Kernel/platform-sam/devlpr.c b/Kernel/platform-sam/devlpr.c index 65d8c439..a6cc0472 100644 --- a/Kernel/platform-sam/devlpr.c +++ b/Kernel/platform-sam/devlpr.c @@ -3,36 +3,66 @@ #include #include -__sfr __at 0x02 lpstat; /* I/O 2 and 3 */ -__sfr __at 0x03 lpdata; +__sfr __at 232 lpdata; +__sfr __at 233 lpstrobe; +__sfr __at 233 lpbusy; +__sfr __at 234 lpmode; int lpr_open(uint8_t minor, uint16_t flag) { - minor; flag; // shut up compiler - return 0; + used(flag); + + if (minor) { + udata.u_error = ENODEV; + return -1; + } + lpmode = 0; + return 0; } int lpr_close(uint8_t minor) { - minor; // shut up compiler - return 0; + used(minor); + return 0; } +/* FIXME: review strobe delay requirement */ +static void nap(void) +{ +} + +static uint8_t iopoll(void) +{ + /* Ought to be a core helper for this lot ? */ + if (need_reschedule()) + _sched_yield(); + if (chksigs()) { + if (!udata.u_done) { + udata.u_error = EINTR; + udata.u_done = (usize_t) - 1; + } + return 1; + } + return 0; +} + + 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 - - 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; - } - /* FIXME: tidy up ugetc and sysio checks globally */ - lpdata = ugetc(p++); - } - return (-1); + minor; + rawflag; + flag; + + while (udata.u_done < udata.u_count) { + while (lpbusy) { + if (iopoll()) + return udata.u_done; + } + lpdata = ugetc(udata.u_base++); + lpstrobe = 1; + nap(); + lpstrobe = 0; + udata.u_done++; + } + return (-1); } -- 2.34.1