Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/luna68k Refactor and cleanup sio (uPD7201) drivers.



details:   https://anonhg.NetBSD.org/src/rev/71a35dd6365f
branches:  trunk
changeset: 987386:71a35dd6365f
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sat Sep 25 15:18:38 2021 +0000

description:
Refactor and cleanup sio (uPD7201) drivers.

- remove confusing syscn*() functions (and its header) and prepare
  explicit siottycninit(), siottycnget() and siottycnput() functions
- use exported struct consdev and cn_tab to initialize siotty console
- enable and handle E/S interrupts to make BREAK signal detected properly
- make CSR (status regsiters) access functions inline static
- make single byte read/write (i.e. cnputc() and cngetc()) functions
  static inline and take struct sio_register rather than sio channel
- use proper integer type (uint16_t) for getsiocsr() as siotty.c
- handle channel dependent CR2A and CR2B registers properly
- use more explicit definitions for RR_* macro used by getsiocsr()
- define and use proper RR0 (read register) values
  (there is no isStatusReg(r) macro used on 4.4BSD/luna68k)

Tested on LUNA with both wscons console and serial console.

diffstat:

 sys/arch/luna68k/dev/lunaws.c      |  25 ++++++---
 sys/arch/luna68k/dev/sio.c         |   5 +-
 sys/arch/luna68k/dev/sioreg.h      |  52 +++++++++----------
 sys/arch/luna68k/dev/siotty.c      |  99 +++++++++++++------------------------
 sys/arch/luna68k/dev/siottyvar.h   |   3 +
 sys/arch/luna68k/dev/siovar.h      |  57 ++++++++++++++++++++-
 sys/arch/luna68k/dev/syscn.h       |   6 --
 sys/arch/luna68k/luna68k/machdep.c |  16 +++---
 8 files changed, 146 insertions(+), 117 deletions(-)

diffs (truncated from 516 to 300 lines):

diff -r 20d290bace12 -r 71a35dd6365f sys/arch/luna68k/dev/lunaws.c
--- a/sys/arch/luna68k/dev/lunaws.c     Sat Sep 25 15:16:36 2021 +0000
+++ b/sys/arch/luna68k/dev/lunaws.c     Sat Sep 25 15:18:38 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lunaws.c,v 1.38 2021/09/20 08:31:09 tsutsui Exp $ */
+/* $NetBSD: lunaws.c,v 1.39 2021/09/25 15:18:38 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: lunaws.c,v 1.38 2021/09/20 08:31:09 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lunaws.c,v 1.39 2021/09/25 15:18:38 tsutsui Exp $");
 
 #include "opt_wsdisplay_compat.h"
 #include "wsmouse.h"
@@ -50,7 +50,8 @@
 #include <luna68k/dev/omkbdmap.h>
 #include <luna68k/dev/sioreg.h>
 #include <luna68k/dev/siovar.h>
-#include <luna68k/dev/syscn.h>
+
+#include <machine/board.h>
 
 #include "ioconf.h"
 
@@ -261,7 +262,7 @@
        struct ws_softc *sc = arg;
        struct sioreg *sio = sc->sc_ctl;
        uint8_t code;
-       int rr;
+       uint16_t rr;
        bool handled = false;
 
        rr = getsiocsr(sio);
@@ -513,10 +514,14 @@
 static void
 ws_cngetc(void *cookie, u_int *type, int *data)
 {
-       struct ws_softc *sc = cookie;
+       struct ws_softc *sc = cookie;   /* currently unused */
+       struct sioreg *sio, *sio_base;
        int code;
 
-       code = syscngetc((dev_t)1);
+       sio_base = (struct sioreg *)OBIO_SIO;
+       sio = &sio_base[1];     /* channel B */
+
+       code = siogetc(sio);
        omkbd_decode(sc, code, type, data);
 }
 
@@ -528,10 +533,14 @@
 static void
 ws_cnbell(void *cookie, u_int pitch, u_int period, u_int volume)
 {
-       struct ws_softc *sc = cookie;
+       struct ws_softc *sc = cookie;   /* currently unused */
+       struct sioreg *sio, *sio_base;
        struct wskbd_bell_data wbd;
        uint8_t buzcmd;
 
+       sio_base = (struct sioreg *)OBIO_SIO;
+       sio = &sio_base[1];     /* channel B */
+
        /*
         * XXX cnbell(9) man page should describe each args..
         *     (it looks similar to the struct wskbd_bell_data)
@@ -545,7 +554,7 @@
        wbd.volume = volume;
        buzcmd = omkbd_get_buzcmd(sc, &wbd, OMKBD_BUZZER_DEFAULT);
 
-       syscnputc((dev_t)1, buzcmd);
+       sioputc(sio, buzcmd);
 }
 
 /* EXPORT */ void
diff -r 20d290bace12 -r 71a35dd6365f sys/arch/luna68k/dev/sio.c
--- a/sys/arch/luna68k/dev/sio.c        Sat Sep 25 15:16:36 2021 +0000
+++ b/sys/arch/luna68k/dev/sio.c        Sat Sep 25 15:18:38 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sio.c,v 1.15 2021/08/07 16:18:57 thorpej Exp $ */
+/* $NetBSD: sio.c,v 1.16 2021/09/25 15:18:38 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: sio.c,v 1.15 2021/08/07 16:18:57 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sio.c,v 1.16 2021/09/25 15:18:38 tsutsui Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -41,6 +41,7 @@
 #include <machine/autoconf.h>
 
 #include <luna68k/luna68k/isr.h>
+#include <luna68k/dev/sioreg.h>
 #include <luna68k/dev/siovar.h>
 
 #include "ioconf.h"
diff -r 20d290bace12 -r 71a35dd6365f sys/arch/luna68k/dev/sioreg.h
--- a/sys/arch/luna68k/dev/sioreg.h     Sat Sep 25 15:16:36 2021 +0000
+++ b/sys/arch/luna68k/dev/sioreg.h     Sat Sep 25 15:18:38 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sioreg.h,v 1.4 2011/07/27 14:17:54 tsutsui Exp $ */
+/* $NetBSD: sioreg.h,v 1.5 2021/09/25 15:18:38 tsutsui Exp $ */
 /*
  * Copyright (c) 1992, 1993
  *     The Regents of the University of California.  All rights reserved.
@@ -79,17 +79,12 @@
 #define WR6            0x06
 #define WR7            0x07
 
-#define WR2A           WR2
-#define WR2B           (WR2|0x10)
+#define WR2A           WR2     /* on channel A */
+#define WR2B           WR2     /* on channel B */
 
-#define RR0            0x08
-#define RR1            0x09
-#define RR2            0x0A
-#define RR3            0x0B
-#define RR4            0x0C
-
-#define RR2A           RR2
-#define RR2B           (RR2|0x10)
+#define RR0            0x00
+#define RR1            0x01
+#define RR2            0x02    /* only on channel B */
 
 #define WR0_NOP                0x00    /* No Operation */
 #define WR0_SNDABRT    0x08    /* Send Abort (HDLC) */
@@ -108,12 +103,14 @@
 #define WR1_RXALLS     0x10    /* Interrupt Every Characters Received (with Special Char.) */
 #define WR1_RXALL      0x18    /* Interrupt Every Characters Received (without Special Char.) */
 
-#define WR2_INTR_0     0x00    /* Interrupt Priority: RxA TxA RxB TxB E/SA E/SA */
-#define WR2_INTR_1     0x04    /* Interrupt Priority: RxA RxB TxA TxB E/SA E/SA */
-#define WR2_VEC85_1    0x00    /* 8085 Vectored Mode - 1 */
-#define WR2_VEC85_2    0x08    /* 8085 Vectored Mode - 2 */
-#define WR2_VEC86      0x10    /* 8086 Vectored */
-#define WR2_VEC85_3    0x18    /* 8085 Vectored Mode - 3 */
+#define WR2A_INTR_0    0x00    /* Interrupt Priority: RxA TxA RxB TxB E/SA E/SA */
+#define WR2A_INTR_1    0x04    /* Interrupt Priority: RxA RxB TxA TxB E/SA E/SA */
+#define WR2A_VEC85_1   0x00    /* 8085 Vectored Mode - 1 */
+#define WR2A_VEC85_2   0x08    /* 8085 Vectored Mode - 2 */
+#define WR2A_VEC86     0x10    /* 8086 Vectored */
+#define WR2A_VEC85_3   0x18    /* 8085 Vectored Mode - 3 */
+
+/* WR2B has interrupt vector value */
 
 #define WR3_RXENBL     0x01    /* Rx Enable */
 #define WR3_RXCRC      0x08    /* Rx CRC Check */
@@ -156,13 +153,14 @@
 #define RR1_OVERRUN    0x20    /* Data Over Run */
 #define RR1_FRAMING    0x40    /* Framing Error */
 
-#define RR_RXRDY       0x0100  /* Rx Character Available */
-#define RR_INTRPEND    0x0200  /* Interrupt Pending (Channel-A Only) */
-#define RR_TXRDY       0x0400  /* Tx Buffer Empty */
-#define RR_DCD         0x0800  /* Data Carrier Detect [DCD] */
-#define RR_SYNC                0x1000  /* Synchronization */
-#define RR_CTS         0x2000  /* Clear To Send       [CTS] */
-#define RR_BREAK       0x8000  /* Break Detected */
-#define RR_PARITY      0x0010  /* Parity Error */
-#define RR_OVERRUN     0x0020  /* Data Over Run */
-#define RR_FRAMING     0x0040  /* Framing Error */
+/* for getsiocsr() */
+#define RR_RXRDY       (RR0_RXAVAIL  << 8)
+#define RR_INTRPEND    (RR0_INTRPEND << 8)
+#define RR_TXRDY       (RR0_TXEMPTY  << 8)
+#define RR_DCD         (RR0_DCD      << 8)
+#define RR_SYNC                (RR0_SYNC     << 8)
+#define RR_CTS         (RR0_CTS      << 8)
+#define RR_BREAK       (RR0_BREAK    << 8)
+#define RR_PARITY      (RR1_PARITY)
+#define RR_OVERRUN     (RR1_OVERRUN)
+#define RR_FRAMING     (RR1_FRAMING)
diff -r 20d290bace12 -r 71a35dd6365f sys/arch/luna68k/dev/siotty.c
--- a/sys/arch/luna68k/dev/siotty.c     Sat Sep 25 15:16:36 2021 +0000
+++ b/sys/arch/luna68k/dev/siotty.c     Sat Sep 25 15:18:38 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: siotty.c,v 1.50 2021/09/04 12:54:19 tsutsui Exp $ */
+/* $NetBSD: siotty.c,v 1.51 2021/09/25 15:18:38 tsutsui Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: siotty.c,v 1.50 2021/09/04 12:54:19 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: siotty.c,v 1.51 2021/09/25 15:18:38 tsutsui Exp $");
 
 #include "opt_ddb.h"
 #include "siotty.h"
@@ -55,7 +55,6 @@
 
 #include <luna68k/dev/sioreg.h>
 #include <luna68k/dev/siovar.h>
-#include <luna68k/dev/syscn.h>
 
 #include "ioconf.h"
 
@@ -63,7 +62,7 @@
 
 static const uint8_t ch0_regs[6] = {
        WR0_RSTINT,                             /* reset E/S interrupt */
-       WR1_RXALLS | WR1_TXENBL,                /* Rx per char, Tx */
+       WR1_RXALLS | WR1_TXENBL | WR1_ESENBL,   /* Rx per char, Tx, E/S */
        0,                                      /* */
        WR3_RX8BIT | WR3_RXENBL,                /* Rx */
        WR4_BAUD96 | WR4_STOP1,                 /* Tx/Rx */
@@ -129,6 +128,10 @@
 static dev_type_tty(siotty);
 static dev_type_poll(siopoll);
 
+static dev_type_cninit(siottycninit);
+static dev_type_cngetc(siottycngetc);
+static dev_type_cnputc(siottycnputc);
+
 const struct cdevsw siotty_cdevsw = {
        .d_open = sioopen,
        .d_close = sioclose,
@@ -177,8 +180,8 @@
                sc->sc_flags = TIOCFLAG_SOFTCAR;
        } else {
                setsioreg(sc->sc_ctl, WR0, WR0_CHANRST);
-               setsioreg(sc->sc_ctl, WR2A, WR2_VEC86 | WR2_INTR_1);
-               setsioreg(sc->sc_ctl, WR2B, 0);
+               setsioreg(&siosc->sc_ctl[0], WR2A, WR2A_VEC86 | WR2A_INTR_1);
+               setsioreg(&siosc->sc_ctl[1], WR2B, 0);
                setsioreg(sc->sc_ctl, WR0, sc->sc_wr[WR0]);
                setsioreg(sc->sc_ctl, WR4, sc->sc_wr[WR4]);
                setsioreg(sc->sc_ctl, WR3, sc->sc_wr[WR3]);
@@ -227,9 +230,11 @@
        sio = sc->sc_ctl;
        rr = getsiocsr(sio);
        if ((rr & RR_BREAK) != 0) {
-               sio->sio_cmd = WR0_RSTINT;
                cn_check_magic(sc->sc_tty->t_dev, CNC_BREAK, siotty_cnm_state);
        }
+       /* XXX should handle RR_DCD and RR_CTS */
+       sio->sio_cmd = WR0_RSTINT;
+
        if ((rr & RR_RXRDY) != 0) {
                do {
                        if (cc > 0) {
@@ -669,35 +674,13 @@
        return sc->sc_tty;
 }
 
-/*--------------------  miscelleneous routine --------------------*/
-
-/* EXPORT */ void
-setsioreg(struct sioreg *sio, int regno, int val)
-{
-
-       if (regno != 0)
-               sio->sio_cmd = regno;   /* DELAY(); */
-       sio->sio_cmd = val;             /* DELAY(); */
-}
-
-/* EXPORT */ uint16_t
-getsiocsr(struct sioreg *sio)
-{
-       int val;
-
-       val = sio->sio_stat << 8;       /* DELAY(); */
-       sio->sio_cmd = 1;               /* DELAY(); */
-       val |= sio->sio_stat;           /* DELAY(); */
-       return val;
-}
-
 /*---------------------  console interface ----------------------*/
 
-struct consdev syscons = {
+struct consdev siottycons = {
        .cn_probe = NULL,
-       .cn_init  = NULL,
-       .cn_getc  = syscngetc,
-       .cn_putc  = syscnputc,
+       .cn_init  = siottycninit,
+       .cn_getc  = siottycngetc,
+       .cn_putc  = siottycnputc,
        .cn_pollc = nullcnpollc,
        .cn_bell  = NULL,
        .cn_halt  = NULL,
@@ -706,25 +689,28 @@
        .cn_pri   = CN_REMOTE,
 };
 
-/* EXPORT */ void
-syscninit(int channel)
+static void



Home | Main Index | Thread Index | Old Index