Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/luna68k/dev Handle wskbd(9) .set_leds op in cngetc(...



details:   https://anonhg.NetBSD.org/src/rev/c35e96d17a2b
branches:  trunk
changeset: 989013:c35e96d17a2b
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Sat Oct 09 20:59:47 2021 +0000

description:
Handle wskbd(9) .set_leds op in cngetc(9) using wskbd_cnattach(9) cookie.

XXX1: LUNA's keyboards emulate "mechanical lock" for CAP and Kana keys,
      i.e. it sends "DOWN" code only when CAP/Kana LEDs are turned on
      and send "UP" code only when the LEDs are turned off.
      The MD omkbd_input() via wskbd_input(9) for the normal wskbd(4)
      (i.e. ttyE0) devices handles this quirk, but MI wskbd_cngetc()
      in sys/dev/wscons/wskbd.c can do nothing for this.

XXX2: I wonder if we should have an independent .set_leds op for cons(9)
      as cnbell(9), rather than referring a device specific softc stuff
      during .set_leds op in struct wskbd_accessop (registered during
      autoconf(9) via struct wskbddev_attach_args passed to config_found(9))
      even for wskbd cngetc(9) op in struct wskbd_consops (registered
      via early wskbd_cnattach(9)).

diffstat:

 sys/arch/luna68k/dev/lunaws.c |  81 +++++++++++++++++++++++++++---------------
 1 files changed, 51 insertions(+), 30 deletions(-)

diffs (177 lines):

diff -r d3384444667e -r c35e96d17a2b sys/arch/luna68k/dev/lunaws.c
--- a/sys/arch/luna68k/dev/lunaws.c     Sat Oct 09 20:44:55 2021 +0000
+++ b/sys/arch/luna68k/dev/lunaws.c     Sat Oct 09 20:59:47 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lunaws.c,v 1.39 2021/09/25 15:18:38 tsutsui Exp $ */
+/* $NetBSD: lunaws.c,v 1.40 2021/10/09 20:59:47 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.39 2021/09/25 15:18:38 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lunaws.c,v 1.40 2021/10/09 20:59:47 tsutsui Exp $");
 
 #include "opt_wsdisplay_compat.h"
 #include "wsmouse.h"
@@ -101,6 +101,12 @@
        WR5_TX8BIT | WR5_TXENBL,                /* Tx */
 };
 
+struct ws_conscookie {
+       struct sioreg   *cc_sio;
+       int             cc_polling;
+       struct ws_softc *cc_sc;
+};
+
 struct ws_softc {
        device_t        sc_dev;
        struct sioreg   *sc_ctl;
@@ -122,6 +128,8 @@
        int             sc_msreport;
        void            *sc_si;
        int             sc_rawkbd;
+
+       struct ws_conscookie *sc_conscookie;
 };
 
 static void omkbd_input(struct ws_softc *, int);
@@ -155,6 +163,7 @@
        .pollc = ws_cnpollc,
        .bell  = ws_cnbell,
 };
+static struct ws_conscookie ws_conscookie;
 
 #if NWSMOUSE > 0
 static int  omms_enable(void *);
@@ -214,6 +223,10 @@
        siosc->sc_intrhand[channel].ih_func = wsintr;
        siosc->sc_intrhand[channel].ih_arg = sc;
 
+       sc->sc_conscookie = &ws_conscookie;
+       sc->sc_conscookie->cc_sc = sc;
+       sc->sc_conscookie->cc_polling = 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]);
@@ -514,13 +527,11 @@
 static void
 ws_cngetc(void *cookie, u_int *type, int *data)
 {
-       struct ws_softc *sc = cookie;   /* currently unused */
-       struct sioreg *sio, *sio_base;
+       struct ws_conscookie *conscookie = cookie;
+       struct sioreg *sio = conscookie->cc_sio;
+       struct ws_softc *sc = conscookie->cc_sc;        /* currently unused */
        int code;
 
-       sio_base = (struct sioreg *)OBIO_SIO;
-       sio = &sio_base[1];     /* channel B */
-
        code = siogetc(sio);
        omkbd_decode(sc, code, type, data);
 }
@@ -528,19 +539,20 @@
 static void
 ws_cnpollc(void *cookie, int on)
 {
+       struct ws_conscookie *conscookie = cookie;
+
+       conscookie->cc_polling = on;
 }
 
 static void
 ws_cnbell(void *cookie, u_int pitch, u_int period, u_int volume)
 {
-       struct ws_softc *sc = cookie;   /* currently unused */
-       struct sioreg *sio, *sio_base;
+       struct ws_conscookie *conscookie = cookie;
+       struct sioreg *sio = conscookie->cc_sio;
+       struct ws_softc *sc = conscookie->cc_sc;        /* currently unused */
        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)
@@ -560,11 +572,14 @@
 /* EXPORT */ void
 ws_cnattach(void)
 {
-       static int voidfill;
+       struct sioreg *sio_base;
+
+       sio_base = (struct sioreg *)OBIO_SIO;
+       ws_conscookie.cc_sio = &sio_base[1];    /* channel B */
 
        /* XXX need CH.B initialization XXX */
 
-       wskbd_cnattach(&ws_consops, &voidfill, &omkbd_keymapdata);
+       wskbd_cnattach(&ws_consops, &ws_conscookie, &omkbd_keymapdata);
 }
 
 static int
@@ -578,35 +593,41 @@
 omkbd_set_leds(void *cookie, int leds)
 {
        struct ws_softc *sc = cookie;
-       uint8_t ledcmd;
+       uint8_t capsledcmd, kanaledcmd;
 
-       /*
-        * XXX:
-        *  Why does MI wskbd(4) use a common .set_leds function
-        *  for both kernel cons(9) and normal tty devices!?
-        *
-        *  When CAP key is pressed in cngetc(9) (like ddb(4) etc.)
-        *  after wskbd(4) is attached, all LED commands are queued
-        *  into txq[] and will never be sent until ddb(4) returns.
-        */
+       if (sc == NULL) {
+               /*
+                * This has been checked by the caller in wskbd(9) layer
+                * for the early console, but just for sanity.
+                */
+               return;
+       }
 
        sc->sc_leds = leds;
        if ((leds & WSKBD_LED_CAPS) != 0) {
-               ledcmd = OMKBD_LED_ON_CAPS;
+               capsledcmd = OMKBD_LED_ON_CAPS;
        } else {
-               ledcmd = OMKBD_LED_OFF_CAPS;
+               capsledcmd = OMKBD_LED_OFF_CAPS;
        }
-       omkbd_send(sc, ledcmd);
 
 #if 0  /* no KANA lock support in wskbd */
        if ((leds & WSKBD_LED_KANA) != 0) {
-               ledcmd = OMKBD_LED_ON_KANA;
+               kanaledcmd = OMKBD_LED_ON_KANA;
        } else
 #endif
        {
-               ledcmd = OMKBD_LED_OFF_KANA;
+               kanaledcmd = OMKBD_LED_OFF_KANA;
        }
-       omkbd_send(sc, ledcmd);
+
+       if (sc->sc_conscookie->cc_polling != 0) {
+               struct sioreg *sio = sc->sc_ctl;
+
+               sioputc(sio, capsledcmd);
+               sioputc(sio, kanaledcmd);
+       } else {
+               omkbd_send(sc, capsledcmd);
+               omkbd_send(sc, kanaledcmd);
+       }
 }
 
 static int



Home | Main Index | Thread Index | Old Index