Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/hpcsh/dev Jornada 690 keyboard driver (matrix switc...
details: https://anonhg.NetBSD.org/src/rev/5a7a8e16930b
branches: trunk
changeset: 504193:5a7a8e16930b
user: uch <uch%NetBSD.org@localhost>
date: Sat Feb 24 19:58:00 2001 +0000
description:
Jornada 690 keyboard driver (matrix switch connected SH3 PFC module)
diffstat:
sys/arch/hpcsh/dev/pfckbd.c | 218 +++++++++++++++++++++++++++++++++++++++++
sys/arch/hpcsh/dev/pfckbdvar.h | 39 +++++++
2 files changed, 257 insertions(+), 0 deletions(-)
diffs (265 lines):
diff -r a4de26982454 -r 5a7a8e16930b sys/arch/hpcsh/dev/pfckbd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/hpcsh/dev/pfckbd.c Sat Feb 24 19:58:00 2001 +0000
@@ -0,0 +1,218 @@
+/* $NetBSD: pfckbd.c,v 1.1 2001/02/24 19:58:00 uch Exp $ */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by UCHIYAMA Yasushi.
+ *
+ * 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 the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+#define PFCKBD_DEBUG
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/callout.h>
+
+#include <machine/bus.h>
+#include <dev/hpc/hpckbdvar.h>
+
+#include <sh3/pfcreg.h>
+
+#include <hpcsh/dev/pfckbdvar.h>
+
+#ifdef PFCKBD_DEBUG
+int pfckbd_debug = 0;
+#define DPRINTF(fmt, args...) \
+ if (pfckbd_debug) \
+ printf("%s: " fmt, __FUNCTION__ , ##args)
+#define DPRINTFN(n, arg) \
+ if (pfckbd_debug > (n)) \
+ printf("%s: " fmt, __FUNCTION__ , ##args)
+#else
+#define DPRINTF(arg...) ((void)0)
+#define DPRINTFN(n, arg...) ((void)0)
+#endif
+
+static int pfckbd_match(struct device *, struct cfdata *, void *);
+static void pfckbd_attach(struct device *, struct device *, void *);
+
+static struct pfckbd_core {
+ int pc_attached;
+ int pc_enabled;
+ struct callout pc_soft_ch;
+ struct hpckbd_ic_if pc_if;
+ struct hpckbd_if *pc_hpckbd;
+ u_int16_t pc_column[8];
+} pfckbd_core;
+
+struct pfckbd_softc {
+ struct device sc_dev;
+};
+
+struct cfattach pfckbd_ca = {
+ sizeof(struct pfckbd_softc), pfckbd_match, pfckbd_attach
+};
+
+static int pfckbd_poll(void *);
+static void pfckbd_soft(void *);
+static void pfckbd_ifsetup(struct pfckbd_core *);
+static int pfckbd_input_establish(void *, struct hpckbd_if *);
+
+/*
+ * matrix scan keyboard connected to SH3 PFC module.
+ * currently, HP Jornada 690 only.
+ */
+void
+pfckbd_cnattach()
+{
+ struct pfckbd_core *pc = &pfckbd_core;
+
+ /* initialize interface */
+ pfckbd_ifsetup(pc);
+ hpckbd_cnattach(&pc->pc_if);
+}
+
+static int
+pfckbd_match(struct device *parent, struct cfdata *cf, void *aux)
+{
+
+ return !pfckbd_core.pc_attached;
+}
+
+static void
+pfckbd_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct hpckbd_attach_args haa;
+
+ printf("\n");
+
+ /* pfckbd is singleton. no more attach */
+ pfckbd_core.pc_attached = 1;
+
+ pfckbd_ifsetup(&pfckbd_core);
+
+ /* attach hpckbd */
+ haa.haa_ic = &pfckbd_core.pc_if; /* tell the hpckbd to my interface */
+ config_found(self, &haa, hpckbd_print);
+
+ /* install callout handler */
+ callout_init(&pfckbd_core.pc_soft_ch);
+ callout_reset(&pfckbd_core.pc_soft_ch, 1, pfckbd_soft, &pfckbd_core);
+}
+
+static int
+pfckbd_input_establish(void *ic, struct hpckbd_if *kbdif)
+{
+ struct pfckbd_core *pc = ic;
+
+ /* save hpckbd interface */
+ pc->pc_hpckbd = kbdif;
+ /* ok to transact hpckbd */
+ pc->pc_enabled = 1;
+
+ return 0;
+}
+
+static int
+pfckbd_poll(void *arg)
+{
+ struct pfckbd_core *pc = arg;
+
+ if (pc->pc_enabled)
+ pfckbd_soft(arg);
+
+ return 0;
+}
+
+static void
+pfckbd_ifsetup(struct pfckbd_core *pc)
+{
+ int i;
+
+ pc->pc_if.hii_ctx = pc;
+ pc->pc_if.hii_establish = pfckbd_input_establish;
+ pc->pc_if.hii_poll = pfckbd_poll;
+ for (i = 0; i < 8; i++)
+ pc->pc_column[i] = 0xffdf;
+}
+
+static void
+pfckbd_soft(void *arg)
+{
+ static const struct {
+ u_int8_t d, e;
+ } scan[] = {
+ { 0xfd, 0xff },
+ { 0xdf, 0xff },
+ { 0xff, 0xfd },
+ { 0xff, 0xbf },
+ { 0xff, 0x7f },
+ { 0xff, 0xf7 },
+ { 0xff, 0xfe },
+ { 0x7f, 0xff },
+ };
+ struct pfckbd_core *pc = arg;
+ struct hpckbd_if *hpckbd = pc->pc_hpckbd;
+ u_int16_t *buf = pc->pc_column;
+ int row, column, type, val;
+ u_int16_t data, edge, mask;
+
+ if (!pc->pc_enabled)
+ goto reinstall;
+
+ for (column = 0; column < 8; column++) {
+ SHREG_PDDR = scan[column].d;
+ SHREG_PEDR = scan[column].e;
+ delay(50);
+ data = SHREG_PFDR | (SHREG_PCDR << 8);
+ if ((edge = (data ^ buf[column]))) {
+ buf[column] = data;
+
+ for (row = 0, mask = 1; row < 16; row++, mask <<= 1) {
+ if (mask & edge) {
+ type = mask & data ? 0 : 1;
+ val = row * 8 + column;
+ DPRINTF("(%2d, %2d) %d \n",
+ row, column, type);
+ hpckbd_input(hpckbd, type, val);
+ }
+ }
+ }
+ }
+
+ SHREG_PDDR = 0xff;
+ SHREG_PEDR = 0xff;
+ data = SHREG_PGDR | (SHREG_PHDR << 8);
+
+ reinstall:
+ callout_reset(&pc->pc_soft_ch, 1, pfckbd_soft, pc);
+}
diff -r a4de26982454 -r 5a7a8e16930b sys/arch/hpcsh/dev/pfckbdvar.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/hpcsh/dev/pfckbdvar.h Sat Feb 24 19:58:00 2001 +0000
@@ -0,0 +1,39 @@
+/* $NetBSD: pfckbdvar.h,v 1.1 2001/02/24 19:58:00 uch Exp $ */
+
+/*-
+ * Copyright (c) 2001 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by UCHIYAMA Yasushi.
+ *
+ * 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 the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+void pfckbd_cnattach(void);
Home |
Main Index |
Thread Index |
Old Index