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;