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