summaryrefslogtreecommitdiff
path: root/sys/arch/mac68k/dev/akbd_machdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/mac68k/dev/akbd_machdep.c')
-rw-r--r--sys/arch/mac68k/dev/akbd_machdep.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/sys/arch/mac68k/dev/akbd_machdep.c b/sys/arch/mac68k/dev/akbd_machdep.c
new file mode 100644
index 00000000000..2d8e588bbc0
--- /dev/null
+++ b/sys/arch/mac68k/dev/akbd_machdep.c
@@ -0,0 +1,136 @@
+/* $OpenBSD: akbd_machdep.c,v 1.1 2006/01/18 23:21:17 miod Exp $ */
+/* $NetBSD: akbd.c,v 1.17 2005/01/15 16:00:59 chs Exp $ */
+
+/*
+ * Copyright (C) 1998 Colin Wood
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Colin Wood.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/timeout.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/fcntl.h>
+#include <sys/poll.h>
+#include <sys/selinfo.h>
+#include <sys/proc.h>
+#include <sys/signalvar.h>
+#include <sys/systm.h>
+
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wskbdvar.h>
+
+#include <machine/cpu.h>
+#include <machine/viareg.h>
+
+#include <dev/adb/adb.h>
+#include <dev/adb/akbdvar.h>
+#include <dev/adb/keyboard.h>
+
+#if 0
+ case WSKBDIO_BELL:
+ case WSKBDIO_COMPLEXBELL:
+#define d ((struct wskbd_bell_data *)data)
+ mac68k_ring_bell(d->pitch, d->period * hz / 1000, d->volume);
+#undef d
+ return (0);
+
+ default:
+ return (-1);
+#endif
+
+void akbd_cnbell(void *, u_int, u_int, u_int);
+void akbd_cngetc(void *, u_int *, int *);
+void akbd_cnpollc(void *, int);
+
+struct wskbd_consops akbd_consops = {
+ akbd_cngetc,
+ akbd_cnpollc,
+ akbd_cnbell
+};
+
+int
+akbd_is_console(void)
+{
+ return ((mac68k_machine.serial_console & 0x03) == 0);
+}
+
+int
+akbd_cnattach(void)
+{
+ wskbd_cnattach(&akbd_consops, NULL, &akbd_keymapdata);
+ return 0;
+}
+
+void
+akbd_cngetc(void *v, u_int *type, int *data)
+{
+ int intbits, key, press, val;
+ int s;
+ extern int adb_intr(void *);
+ extern void pm_intr(void *);
+
+ s = splhigh();
+
+ adb_polledkey = -1;
+ adb_polling = 1;
+
+ while (adb_polledkey == -1) {
+ intbits = via_reg(VIA1, vIFR);
+
+ if (intbits & V1IF_ADBRDY) {
+ adb_intr(NULL);
+ via_reg(VIA1, vIFR) = V1IF_ADBRDY;
+ }
+ if (intbits & V1IF_ADBCLK) {
+ pm_intr(NULL);
+ via_reg(VIA1, vIFR) = 0x10;
+ }
+ }
+
+ adb_polling = 0;
+ splx(s);
+
+ key = adb_polledkey;
+ press = ADBK_PRESS(key);
+ val = ADBK_KEYVAL(key);
+
+ *data = val;
+ *type = press ? WSCONS_EVENT_KEY_DOWN : WSCONS_EVENT_KEY_UP;
+}
+
+void
+akbd_cnpollc(void *v, int on)
+{
+}
+
+void
+akbd_cnbell(void *v, u_int pitch, u_int period, u_int volume)
+{
+ mac68k_ring_bell(pitch, period * hz / 1000, volume);
+}