Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/hpcmips/vr - polling battery voltage value from A/D...
details: https://anonhg.NetBSD.org/src/rev/16893973989a
branches: trunk
changeset: 499935:16893973989a
user: sato <sato%NetBSD.org@localhost>
date: Sat Dec 02 08:35:45 2000 +0000
description:
- polling battery voltage value from A/D port.
currently polling only.
if verbose mode, kernel print A/D raw value every polling.
diffstat:
sys/arch/hpcmips/vr/vrpiu.c | 313 +++++++++++++++++++++++++++++++++++-----
sys/arch/hpcmips/vr/vrpiuvar.h | 33 +++-
2 files changed, 298 insertions(+), 48 deletions(-)
diffs (truncated from 569 to 300 lines):
diff -r 0498aaa44a36 -r 16893973989a sys/arch/hpcmips/vr/vrpiu.c
--- a/sys/arch/hpcmips/vr/vrpiu.c Sat Dec 02 06:23:48 2000 +0000
+++ b/sys/arch/hpcmips/vr/vrpiu.c Sat Dec 02 08:35:45 2000 +0000
@@ -1,8 +1,9 @@
-/* $NetBSD: vrpiu.c,v 1.5 2000/06/13 05:59:55 matt Exp $ */
+/* $NetBSD: vrpiu.c,v 1.6 2000/12/02 08:35:45 sato Exp $ */
/*
* Copyright (c) 1999 Shin Takemura All rights reserved.
- * Copyright (c) 1999 PocketBSD Project. All rights reserved.
+ * Copyright (c) 2000 SATO Kazumi, All rights reserved.
+ * Copyright (c) 1999,2000 PocketBSD Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,10 +28,16 @@
*
*/
+/*
+ * A/D polling part written by SATO Kazumi.
+ */
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <sys/kernel.h>
+#include <sys/callout.h>
+#include <sys/boot_flag.h>
#include <dev/wscons/wsconsio.h>
#include <dev/wscons/wsmousevar.h>
@@ -38,8 +45,11 @@
#include <machine/bus.h>
#include <machine/platid.h>
#include <machine/platid_mask.h>
+#include <machine/config_hook.h>
+#include <hpcmips/hpcmips/machdep.h>
#include <hpcmips/dev/tpcalibvar.h>
+
#include <hpcmips/vr/vripvar.h>
#include <hpcmips/vr/cmureg.h>
#include <hpcmips/vr/vrpiuvar.h>
@@ -52,10 +62,15 @@
#ifdef VRPIUDEBUG
int vrpiu_debug = 0;
#define DPRINTF(arg) if (vrpiu_debug) printf arg;
+#define VPRINTF(arg) if (bootverbose || vrpiu_debug) printf arg;
#else
#define DPRINTF(arg)
+#define VPRINTF(arg) if (bootverbose) printf arg;
#endif
+#ifndef VRPIU_AD_POLL_INTERVAL
+#define VRPIU_AD_POLL_INTERVAL 60 /* interval is 60 sec */
+#endif /* VRPIU_AD_POLL_INTERTVAL */
/*
* data types
*/
@@ -71,13 +86,20 @@
static u_short vrpiu_read __P((struct vrpiu_softc *, int));
static int vrpiu_intr __P((void *));
+static void vrpiu_tp_intr __P((struct vrpiu_softc *));
+static void vrpiu_ad_intr __P((struct vrpiu_softc *));
#ifdef DEBUG
static void vrpiu_dump_cntreg __P((unsigned int cmd));
#endif
-static int vrpiu_enable __P((void *));
-static int vrpiu_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
-static void vrpiu_disable __P((void *));
+static int vrpiu_tp_enable __P((void *));
+static int vrpiu_tp_ioctl __P((void *, u_long, caddr_t, int, struct proc *));
+static void vrpiu_tp_disable __P((void *));
+int vrpiu_ad_enable __P((void *));
+void vrpiu_ad_disable __P((void *));
+static void vrpiu_start_powerstate __P((void *));
+static void vrpiu_calc_powerstate __P((struct vrpiu_softc *));
+static void vrpiu_power __P((int, void *));
/* mra is defined in mra.c */
int mra_Y_AX1_BX2_C __P((int *y, int ys, int *x1, int x1s, int *x2, int x2s,
@@ -91,11 +113,13 @@
};
const struct wsmouse_accessops vrpiu_accessops = {
- vrpiu_enable,
- vrpiu_ioctl,
- vrpiu_disable,
+ vrpiu_tp_enable,
+ vrpiu_tp_ioctl,
+ vrpiu_tp_disable,
};
+int vrpiu_ad_poll_interval = VRPIU_AD_POLL_INTERVAL;
+
/*
* function definitions
*/
@@ -150,7 +174,7 @@
/*
* disable device until vrpiu_enable called
*/
- sc->sc_stat = VRPIU_STAT_DISABLE;
+ sc->sc_tpstat = VRPIU_TP_STAT_DISABLE;
tpcalib_init(&sc->sc_tpcalib);
#if 1
@@ -199,7 +223,7 @@
}
/* mask level2 interrupt, stop scan sequencer and mask clock to piu */
- vrpiu_disable(sc);
+ vrpiu_tp_disable(sc);
printf("\n");
@@ -210,18 +234,35 @@
* attach the wsmouse
*/
sc->sc_wsmousedev = config_found(self, &wsmaa, wsmousedevprint);
+
+ /*
+ * power management events
+ */
+ sc->sc_power_hook = powerhook_establish(vrpiu_power, sc);
+
+ /*
+ * init A/D port polling.
+ */
+ sc->sc_battery.n_values = 3;
+ sc->sc_battery.value[0] = -1;
+ sc->sc_battery.value[1] = -1;
+ sc->sc_battery.value[2] = -1;
+ sc->sc_battery.nextpoll = hz*vrpiu_ad_poll_interval;
+ callout_init(&sc->sc_adpoll);
+ callout_reset(&sc->sc_adpoll, hz,
+ vrpiu_start_powerstate, sc);
}
int
-vrpiu_enable(v)
+vrpiu_ad_enable(v)
void *v;
{
struct vrpiu_softc *sc = v;
int s;
unsigned int cnt;
- DPRINTF(("%s(%d): vrpiu_enable()\n", __FILE__, __LINE__));
- if (sc->sc_stat != VRPIU_STAT_DISABLE)
+ DPRINTF(("%s(%d): vrpiu_ad_enable()\n", __FILE__, __LINE__));
+ if (sc->sc_adstat != VRPIU_AD_STAT_DISABLE)
return EBUSY;
/* supply clock to PIU */
@@ -233,7 +274,7 @@
s = spltty();
/* clear interrupt status */
- vrpiu_write(sc, PIUINT_REG_W, PIUINT_ALLINTR);
+ vrpiu_write(sc, PIUINT_REG_W, PIUINT_PADADPINTR);
/* Disable -> Standby */
cnt = PIUCNT_PIUPWR |
@@ -241,11 +282,82 @@
PIUCNT_PADATSTART | PIUCNT_PADATSTOP;
vrpiu_write(sc, PIUCNT_REG_W, cnt);
+ /* Level2 interrupt register setting */
+ vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_PADADPINTR, 1);
+
/* save pen status, touch or release */
cnt = vrpiu_read(sc, PIUCNT_REG_W);
+ /*
+ * Enable scan sequencer operation
+ * Standby -> WaitPenTouch
+ */
+ cnt |= PIUCNT_PIUSEQEN;
+ vrpiu_write(sc, PIUCNT_REG_W, cnt);
+
+ sc->sc_adstat = VRPIU_AD_STAT_ENABLE;
+
+ splx(s);
+
+ return 0;
+}
+
+void
+vrpiu_ad_disable(v)
+ void *v;
+{
+ struct vrpiu_softc *sc = v;
+
+ DPRINTF(("%s(%d): vrpiu_ad_disable()\n", __FILE__, __LINE__));
+
+ /* Set level2 interrupt register to mask interrupts */
+ vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_PADADPINTR, 0);
+
+ sc->sc_adstat = VRPIU_AD_STAT_DISABLE;
+
+ if (sc->sc_tpstat == VRPIU_TP_STAT_DISABLE){
+ /* Disable scan sequencer operation and power off */
+ vrpiu_write(sc, PIUCNT_REG_W, 0);
+
+ /* mask clock to PIU */
+ __vrcmu_supply(CMUMSKPIU, 1);
+ }
+}
+
+int
+vrpiu_tp_enable(v)
+ void *v;
+{
+ struct vrpiu_softc *sc = v;
+ int s;
+ unsigned int cnt;
+
+ DPRINTF(("%s(%d): vrpiu_tp_enable()\n", __FILE__, __LINE__));
+ if (sc->sc_tpstat != VRPIU_TP_STAT_DISABLE)
+ return EBUSY;
+
+ /* supply clock to PIU */
+ __vrcmu_supply(CMUMSKPIU, 1);
+
+ /* Scan interval 0x7FF is maximum value */
+ vrpiu_write(sc, PIUSIVL_REG_W, 0x7FF);
+
+ s = spltty();
+
+ /* clear interrupt status */
+ vrpiu_write(sc, PIUINT_REG_W, PIUINT_ALLINTR&~PIUINT_PADADPINTR);
+
+ /* Disable -> Standby */
+ cnt = PIUCNT_PIUPWR |
+ PIUCNT_PIUMODE_COORDINATE |
+ PIUCNT_PADATSTART | PIUCNT_PADATSTOP;
+ vrpiu_write(sc, PIUCNT_REG_W, cnt);
+
/* Level2 interrupt register setting */
- vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_ALLINTR, 1);
+ vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_ALLINTR&~PIUINT_PADADPINTR, 1);
+
+ /* save pen status, touch or release */
+ cnt = vrpiu_read(sc, PIUCNT_REG_W);
/*
* Enable scan sequencer operation
@@ -255,8 +367,8 @@
vrpiu_write(sc, PIUCNT_REG_W, cnt);
/* transit status DISABLE -> TOUCH or RELEASE */
- sc->sc_stat = (cnt & PIUCNT_PENSTC) ?
- VRPIU_STAT_TOUCH : VRPIU_STAT_RELEASE;
+ sc->sc_tpstat = (cnt & PIUCNT_PENSTC) ?
+ VRPIU_TP_STAT_TOUCH : VRPIU_TP_STAT_RELEASE;
splx(s);
@@ -264,27 +376,29 @@
}
void
-vrpiu_disable(v)
+vrpiu_tp_disable(v)
void *v;
{
struct vrpiu_softc *sc = v;
- DPRINTF(("%s(%d): vrpiu_disable()\n", __FILE__, __LINE__));
+ DPRINTF(("%s(%d): vrpiu_tp_disable()\n", __FILE__, __LINE__));
/* Set level2 interrupt register to mask interrupts */
- vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_ALLINTR, 0);
+ vrip_intr_setmask2(sc->sc_vrip, sc->sc_handler, PIUINT_ALLINTR&~PIUINT_PADADPINTR, 0);
- sc->sc_stat = VRPIU_STAT_DISABLE;
+ sc->sc_tpstat = VRPIU_TP_STAT_DISABLE;
- /* Disable scan sequencer operation and power off */
- vrpiu_write(sc, PIUCNT_REG_W, 0);
+ if (sc->sc_adstat == VRPIU_AD_STAT_DISABLE){
+ /* Disable scan sequencer operation and power off */
+ vrpiu_write(sc, PIUCNT_REG_W, 0);
- /* mask clock to PIU */
- __vrcmu_supply(CMUMSKPIU, 1);
+ /* mask clock to PIU */
+ __vrcmu_supply(CMUMSKPIU, 1);
+ }
}
int
-vrpiu_ioctl(v, cmd, data, flag, p)
+vrpiu_tp_ioctl(v, cmd, data, flag, p)
void *v;
u_long cmd;
Home |
Main Index |
Thread Index |
Old Index