diff --git a/src/mouse_bus.c b/src/mouse_bus.c index 0aeeb2f..3edcbc5 100644 --- a/src/mouse_bus.c +++ b/src/mouse_bus.c @@ -49,7 +49,7 @@ * * Based on an early driver for MINIX 1.5. * - * Version: @(#)mouse_bus.c 1.0.4 2018/04/19 + * Version: @(#)mouse_bus.c 1.0.5 2018/04/20 * * Author: Fred N. van Kempen, * @@ -624,8 +624,10 @@ bm_poll(int x, int y, int z, int b, void *priv) return(1); /* If we are not enabled, return. */ - if (! (dev->flags & FLAG_ENABLED)) + if (! (dev->flags & FLAG_ENABLED)) { pclog("bm_poll(): Mouse not enabled\n"); + return(1); + } #if 0 pclog("%s: poll(%d,%d,%d,%02x) %d\n", @@ -679,7 +681,7 @@ bm_poll(int x, int y, int z, int b, void *priv) picint(1 << dev->irq); } - return(0); + return(1); } diff --git a/src/mouse_ps2.c b/src/mouse_ps2.c index 9578aa2..6d856c9 100644 --- a/src/mouse_ps2.c +++ b/src/mouse_ps2.c @@ -8,7 +8,7 @@ * * Implementation of PS/2 series Mouse devices. * - * Version: @(#)mouse_ps2.c 1.0.4 2018/04/19 + * Version: @(#)mouse_ps2.c 1.0.5 2018/04/20 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -192,11 +192,11 @@ ps2_poll(int x, int y, int z, int b, void *priv) mouse_t *dev = (mouse_t *)priv; uint8_t buff[3]; - if (!x && !y && !z && b == dev->b) return(0xff); + if (!x && !y && !z && b == dev->b) return(1); - if (! (dev->flags & FLAG_ENABLED)) return(0xff); + if (! (dev->flags & FLAG_ENABLED)) return(1); - if (! mouse_scan) return(0xff); + if (! mouse_scan) return(1); dev->x += x; dev->y -= y; @@ -238,7 +238,7 @@ ps2_poll(int x, int y, int z, int b, void *priv) dev->x = dev->y = dev->z = 0; } - return(0); + return(1); } diff --git a/src/mouse_serial.c b/src/mouse_serial.c index c744139..8fbabba 100644 --- a/src/mouse_serial.c +++ b/src/mouse_serial.c @@ -10,7 +10,7 @@ * * TODO: Add the Genius Serial Mouse. * - * Version: @(#)mouse_serial.c 1.0.4 2018/04/19 + * Version: @(#)mouse_serial.c 1.0.6 2018/04/20 * * Author: Fred N. van Kempen, * @@ -97,6 +97,7 @@ static void ser_timer(void *priv) { mouse_t *dev = (mouse_t *)priv; + uint8_t b[2]; dev->delay = 0LL; @@ -106,27 +107,24 @@ ser_timer(void *priv) switch(dev->type) { case MOUSE_MSYSTEMS: /* Identifies Mouse Systems serial mouse. */ - dev->serial->write_fifo(dev->serial, 'H'); + b[0] = 'H'; + dev->serial->write_fifo(dev->serial, b, 1); break; case MOUSE_MICROSOFT: - /* Identifies a Microsoft Serial mouse. */ - dev->serial->write_fifo(dev->serial, 'M'); - if (dev->flags & FLAG_3BTN) - dev->serial->write_fifo(dev->serial, '3'); - break; - case MOUSE_LOGITECH: - /* Identifies a Logitech Serial mouse. */ - dev->serial->write_fifo(dev->serial, 'M'); + /* Identifies a Microsoft/Logitech Serial mouse. */ + b[0] = 'M'; b[1] = '3'; if (dev->flags & FLAG_3BTN) - dev->serial->write_fifo(dev->serial, '3'); + dev->serial->write_fifo(dev->serial, b, 2); + else + dev->serial->write_fifo(dev->serial, b, 1); break; case MOUSE_MSWHEEL: /* Identifies multi-button Microsoft Wheel Mouse. */ - dev->serial->write_fifo(dev->serial, 'M'); - dev->serial->write_fifo(dev->serial, 'Z'); + b[0] = 'M'; b[1] = 'Z'; + dev->serial->write_fifo(dev->serial, b, 2); break; default: @@ -196,12 +194,10 @@ ser_poll(int x, int y, int z, int b, void *priv) } /* Send the packet to the bottom-half of the attached port. */ - if (dev->serial != NULL) { - for (b = 0; b < len; b++) - dev->serial->write_fifo(dev->serial, buff[b]); - } + if (dev->serial != NULL) + dev->serial->write_fifo(dev->serial, buff, len); - return(0); + return(1); } @@ -211,10 +207,8 @@ ser_close(void *priv) mouse_t *dev = (mouse_t *)priv; /* Detach serial port from the mouse. */ - if ((dev != NULL) && (dev->serial != NULL)) { - dev->serial->rts_callback = NULL; - dev->serial->rts_callback_p = NULL; - } + if ((dev != NULL) && (dev->serial != NULL)) + (void)serial_attach(dev->port + 1, NULL, NULL); free(dev); } diff --git a/src/serial.c b/src/serial.c index 3804564..a3402be 100644 --- a/src/serial.c +++ b/src/serial.c @@ -8,7 +8,7 @@ * * Implementation of 8250-style serial port. * - * Version: @(#)serial.c 1.0.2 2018/04/19 + * Version: @(#)serial.c 1.0.3 2018/04/20 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -117,10 +117,14 @@ clear_fifo(SERIAL *dev) static void -write_fifo(SERIAL *dev, uint8_t dat) +write_fifo(SERIAL *dev, uint8_t *ptr, uint8_t len) { - dev->fifo[dev->fifo_write] = dat; - dev->fifo_write = (dev->fifo_write + 1) & 0xff; + while (len-- > 0) { + dev->fifo[dev->fifo_write] = *ptr++; + dev->fifo_write = (dev->fifo_write + 1) & 0xff; + /*OVERFLOW NOT DETECTED*/ + } + if (! (dev->lsr & 1)) { dev->lsr |= 1; dev->int_status |= SERIAL_INT_RECEIVE; @@ -182,7 +186,7 @@ serial_write(uint16_t addr, uint8_t val, void *priv) dev->int_status |= SERIAL_INT_TRANSMIT; update_ints(dev); if (dev->mcr & 0x10) - write_fifo(dev, val); + write_fifo(dev, &val, 1); break; case 1: diff --git a/src/serial.h b/src/serial.h index ad54a07..f9b3baf 100644 --- a/src/serial.h +++ b/src/serial.h @@ -8,7 +8,7 @@ * * Definitions for the SERIAL card. * - * Version: @(#)serial.h 1.0.3 2018/04/19 + * Version: @(#)serial.h 1.0.4 2018/04/20 * * Author: Fred N. van Kempen, * @@ -83,11 +83,7 @@ typedef struct SERIAL { /* Access to internal functions. */ void (*clear_fifo)(struct SERIAL *); -#ifdef WALTJE_SERIAL - void (*write_fifo)(struct SERIAL *, uint8_t, int); -#else - void (*write_fifo)(struct SERIAL *, uint8_t); -#endif + void (*write_fifo)(struct SERIAL *, uint8_t *, uint8_t); /* Data for the RTS-toggle callback. */ void (*rts_callback)(struct SERIAL *, void *);