Module Name:    src
Committed By:   tsutsui
Date:           Thu Apr 24 11:58:04 UTC 2014

Modified Files:
        src/sys/arch/hp300/dev: dnkbd.c

Log Message:
Make the Apollo Domain keyboard actually work.

Tested on HP9000/425e and the keyboard model A1630-82001 R2 (RX-60857-HW)
provided by Miod Vallat.  Mouse support needs more work.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/hp300/dev/dnkbd.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/hp300/dev/dnkbd.c
diff -u src/sys/arch/hp300/dev/dnkbd.c:1.5 src/sys/arch/hp300/dev/dnkbd.c:1.6
--- src/sys/arch/hp300/dev/dnkbd.c:1.5	Fri Feb 18 19:15:43 2011
+++ src/sys/arch/hp300/dev/dnkbd.c	Thu Apr 24 11:58:04 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dnkbd.c,v 1.5 2011/02/18 19:15:43 tsutsui Exp $	*/
+/*	$NetBSD: dnkbd.c,v 1.6 2014/04/24 11:58:04 tsutsui Exp $	*/
 /*	$OpenBSD: dnkbd.c,v 1.17 2009/07/23 21:05:56 blambert Exp $	*/
 
 /*
@@ -210,6 +210,8 @@ static struct wskbd_mapdata dnkbd_keymap
 
 typedef enum { EVENT_NONE, EVENT_KEYBOARD, EVENT_MOUSE } dnevent;
 
+#define APCIBRD(x)	(500000 / (x))
+
 static void	dnevent_kbd(struct dnkbd_softc *, int);
 static void	dnevent_kbd_internal(struct dnkbd_softc *, int);
 static void	dnevent_mouse(struct dnkbd_softc *, uint8_t *);
@@ -225,8 +227,6 @@ static int	dnkbd_probe(struct dnkbd_soft
 static void	dnkbd_rawrepeat(void *);
 #endif
 static int	dnkbd_send(struct dnkbd_softc *, const uint8_t *, size_t);
-static int	dnsubmatch_kbd(device_t, cfdata_t, const int *, void *);
-static int	dnsubmatch_mouse(device_t, cfdata_t, const int *, void *);
 
 int
 dnkbd_match(device_t parent, cfdata_t cf, void *aux)
@@ -287,13 +287,15 @@ dnkbd_init(struct dnkbd_softc *sc, uint1
 {
 	bus_space_tag_t bst;
 	bus_space_handle_t bsh;
+	u_int divisor;
 
 	bst = sc->sc_bst;
 	bsh = sc->sc_bsh;
 
+	divisor = APCIBRD(rate);
 	bus_space_write_1(bst, bsh, com_lctl, LCR_DLAB);
-	bus_space_write_1(bst, bsh, com_dlbl, rate & 0xff);
-	bus_space_write_1(bst, bsh, com_dlbh, (rate >> 8) & 0xff);
+	bus_space_write_1(bst, bsh, com_dlbl, divisor & 0xff);
+	bus_space_write_1(bst, bsh, com_dlbh, (divisor >> 8) & 0xff);
 	bus_space_write_1(bst, bsh, com_lctl, lctl);
 	bus_space_write_1(bst, bsh, com_ier, IER_ERXRDY | IER_ETXRDY);
 	bus_space_write_1(bst, bsh, com_fifo,
@@ -301,6 +303,7 @@ dnkbd_init(struct dnkbd_softc *sc, uint1
 	bus_space_write_1(bst, bsh, com_mcr, MCR_DTR | MCR_RTS);
 
 	delay(100);
+	(void)bus_space_read_1(bst, bsh, com_iir);
 }
 
 void
@@ -347,43 +350,21 @@ dnkbd_attach_subdevices(struct dnkbd_sof
 		sc->sc_flags = SF_PLUGGED;
 	}
 
-	sc->sc_wskbddev = config_found_sm_loc(sc->sc_dev, "dnkbd", NULL, &ka,
-	    wskbddevprint, dnsubmatch_kbd);
+	sc->sc_wskbddev =
+	    config_found_ia(sc->sc_dev, "wskbddev", &ka, wskbddevprint);
 
 #if NWSMOUSE > 0
 	ma.accessops = &dnmouse_accessops;
 	ma.accesscookie = sc;
 
-	sc->sc_wsmousedev = config_found_sm_loc(sc->sc_dev, "dnkbd", NULL, &ma,
-	    wsmousedevprint, dnsubmatch_mouse);
+	sc->sc_wsmousedev =
+	    config_found_ia(sc->sc_dev, "wsmousedev", &ma, wsmousedevprint);
 #endif
 
 	SET(sc->sc_flags, SF_ATTACHED);
 }
 
 int
-dnsubmatch_kbd(device_t parent, cfdata_t cf, const int *locs, void *aux)
-{
-
-	if (strcmp(cf->cf_name, wskbd_cd.cd_name) != 0)
-		return 0;
-
-	return config_match(parent, cf, aux);
-}
-
-#if NWSMOUSE > 0
-int
-dnsubmatch_mouse(device_t parent, cfdata_t cf, const int *locs, void *aux)
-{
-
-	if (strcmp(cf->cf_name, wsmouse_cd.cd_name) != 0)
-		return 0;
-
-	return config_match(parent, cf, aux);
-}
-#endif
-
-int
 dnkbd_probe(struct dnkbd_softc *sc)
 {
 	int dat, rc, flags;

Reply via email to