Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/hp700 Add better support for controlling the LEDs, ...
details: https://anonhg.NetBSD.org/src/rev/e565ef283c1a
branches: trunk
changeset: 535191:e565ef283c1a
user: fredette <fredette%NetBSD.org@localhost>
date: Sun Aug 11 19:53:41 2002 +0000
description:
Add better support for controlling the LEDs, and use it. Now the
LEDs blink on network receive, network send, and disk interrupt,
and the high LEDs display the current load average (up to 15).
diffstat:
sys/arch/hp700/gsc/if_ie_gsc.c | 33 +------------
sys/arch/hp700/gsc/osiop_gsc.c | 6 ++-
sys/arch/hp700/hp700/autoconf.c | 96 ++++++++++++++++++++++++++++++++--------
sys/arch/hp700/hp700/machdep.h | 67 +++++++++++-----------------
4 files changed, 112 insertions(+), 90 deletions(-)
diffs (truncated from 334 to 300 lines):
diff -r 35b2bd8bd7d0 -r e565ef283c1a sys/arch/hp700/gsc/if_ie_gsc.c
--- a/sys/arch/hp700/gsc/if_ie_gsc.c Sun Aug 11 19:39:37 2002 +0000
+++ b/sys/arch/hp700/gsc/if_ie_gsc.c Sun Aug 11 19:53:41 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ie_gsc.c,v 1.2 2002/08/11 19:39:37 fredette Exp $ */
+/* $NetBSD: if_ie_gsc.c,v 1.3 2002/08/11 19:53:41 fredette Exp $ */
/* $OpenBSD: if_ie_gsc.c,v 1.6 2001/01/12 22:57:04 mickey Exp $ */
@@ -61,6 +61,7 @@
#include <hp700/dev/cpudevs.h>
#include <hp700/gsc/gscbusvar.h>
+#include <hp700/hp700/machdep.h>
#include <dev/ic/i82586reg.h>
#include <dev/ic/i82586var.h>
@@ -132,9 +133,6 @@
void ie_gsc_attend __P((struct ie_softc *, int));
void ie_gsc_run __P((struct ie_softc *sc));
void ie_gsc_port __P((struct ie_softc *sc, u_int));
-#ifdef USELEDS
-int ie_gsc_intrhook __P((struct ie_softc *sc, int what));
-#endif
u_int16_t ie_gsc_read16 __P((struct ie_softc *sc, int offset));
void ie_gsc_write16 __P((struct ie_softc *sc, int offset, u_int16_t v));
void ie_gsc_write24 __P((struct ie_softc *sc, int offset, int addr));
@@ -244,27 +242,6 @@
}
}
-#ifdef USELEDS
-int
-ie_gsc_intrhook(sc, where)
- struct ie_softc *sc;
- int where;
-{
- switch (where) {
- case INTR_ENTER:
- /* turn it on */
- break;
- case INTR_LOOP:
- /* quick drop and raise */
- break;
- case INTR_EXIT:
- /* drop it */
- break;
- }
- return 0;
-}
-#endif
-
u_int16_t
ie_gsc_read16(sc, offset)
struct ie_softc *sc;
@@ -328,6 +305,7 @@
memcpy (p, (void *)((caddr_t)sc->sc_maddr + offset), size);
bus_dmamap_sync(gsc->iemt, sc->sc_dmamap, offset, size,
BUS_DMASYNC_PREREAD);
+ hp700_led_blink(HP700_LED_NETRCV);
}
void
@@ -342,6 +320,7 @@
memcpy ((void *)((caddr_t)sc->sc_maddr + offset), p, size);
bus_dmamap_sync(gsc->iemt, sc->sc_dmamap, offset, size,
BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+ hp700_led_blink(HP700_LED_NETSND);
}
/*
@@ -516,11 +495,7 @@
sc->ie_bus_read16 = ie_gsc_read16;
sc->ie_bus_write16 = ie_gsc_write16;
sc->ie_bus_write24 = ie_gsc_write24;
-#ifdef USELEDS
- sc->intrhook = ie_gsc_intrhook;
-#else
sc->intrhook = NULL;
-#endif
/* Clear all RAM. */
memset(sc->sc_maddr, 0, sc->sc_msize);
diff -r 35b2bd8bd7d0 -r e565ef283c1a sys/arch/hp700/gsc/osiop_gsc.c
--- a/sys/arch/hp700/gsc/osiop_gsc.c Sun Aug 11 19:39:37 2002 +0000
+++ b/sys/arch/hp700/gsc/osiop_gsc.c Sun Aug 11 19:53:41 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: osiop_gsc.c,v 1.1 2002/06/06 19:48:05 fredette Exp $ */
+/* $NetBSD: osiop_gsc.c,v 1.2 2002/08/11 19:53:41 fredette Exp $ */
/*
* Copyright (c) 2001 Matt Fredette. All rights reserved.
@@ -80,6 +80,7 @@
#include <hp700/dev/cpudevs.h>
#include <hp700/gsc/gscbusvar.h>
+#include <hp700/hp700/machdep.h>
#define OSIOP_GSC_RESET 0x0000
#define OSIOP_GSC_OFFSET 0x0100
@@ -212,5 +213,8 @@
/* Deal with the interrupt */
osiop_intr(sc);
+ /* Blink the LED. */
+ hp700_led_blink(HP700_LED_DISK);
+
return (1);
}
diff -r 35b2bd8bd7d0 -r e565ef283c1a sys/arch/hp700/hp700/autoconf.c
--- a/sys/arch/hp700/hp700/autoconf.c Sun Aug 11 19:39:37 2002 +0000
+++ b/sys/arch/hp700/hp700/autoconf.c Sun Aug 11 19:53:41 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.1 2002/06/06 19:48:05 fredette Exp $ */
+/* $NetBSD: autoconf.c,v 1.2 2002/08/11 19:53:41 fredette Exp $ */
/* $OpenBSD: autoconf.c,v 1.15 2001/06/25 00:43:10 mickey Exp $ */
@@ -79,8 +79,9 @@
* LED blinking thing
*/
#ifdef USELEDS
-struct callout heartbeat_tmo;
-void heartbeat __P((void *));
+int _hp700_led_on_cycles[_HP700_LEDS_BLINKABLE];
+static struct callout hp700_led_callout;
+static void hp700_led_blinker __P((void *));
extern int hz;
#endif
@@ -120,41 +121,96 @@
(*cold_hook)();
#ifdef USELEDS
- callout_init(&heartbeat_tmo);
- heartbeat((void*) 0);
+ memset(_hp700_led_on_cycles, 0, sizeof(_hp700_led_on_cycles));
+ callout_init(&hp700_led_callout);
+ hp700_led_blinker((void *) 0);
#endif
}
#ifdef USELEDS
/*
- * turn the heartbeat alive.
- * right thing would be to pass counter to each subsequent timeout
- * as an argument to heartbeat() incrementing every turn,
- * i.e. avoiding the static hbcnt, but doing timeout_set() on each
- * timeout_add() sounds ugly, guts of struct timeout looks ugly
- * to ponder in even more.
+ * This sets LEDs.
*/
void
-heartbeat(arg)
+hp700_led_ctl(int off, int on, int toggle)
+{
+ int r;
+
+ if (machine_ledaddr == NULL)
+ return;
+
+ /* The mask is reversed when pushed out to the hardware. */
+ r = ~(machine_leds = ((machine_leds & ~off) | on) ^ toggle);
+
+ if (machine_ledword)
+ *machine_ledaddr = r;
+ else {
+#define HP700_LED_DATA 0x01
+#define HP700_LED_STROBE 0x02
+ register int b;
+ for (b = 0x80; b; b >>= 1) {
+ *machine_ledaddr = (r & b)? HP700_LED_DATA : 0;
+ DELAY(1);
+ *machine_ledaddr = ((r & b)? HP700_LED_DATA : 0) |
+ HP700_LED_STROBE;
+ }
+#undef HP700_LED_DATA
+#undef HP700_LED_STROBE
+ }
+}
+
+/*
+ * This callout handler blinks LEDs.
+ */
+static void
+hp700_led_blinker(arg)
void *arg;
{
- u_int hbcnt = (u_int) arg;
+ u_int led_cycle = (u_int) arg;
+ int leds, led_i, led;
+ int load;
/*
- * do this:
+ * Blink the heartbeat LED like this:
*
* |~| |~|
* _| |_| |_,_,_,_
* 0 1 2 3 4 6 7
*/
- if (hbcnt < 4) {
- ledctl(0, 0, PALED_HEARTBEAT);
- callout_reset(&heartbeat_tmo, hz / 8, heartbeat, (void *) (hbcnt + 1));
- } else {
- callout_reset(&heartbeat_tmo, hz / 2, heartbeat, (void *) 0);
+#define HP700_HEARTBEAT_CYCLES (_HP700_LED_FREQ / 8)
+ if (led_cycle == (0 * HP700_HEARTBEAT_CYCLES) ||
+ led_cycle == (2 * HP700_HEARTBEAT_CYCLES)) {
+ _hp700_led_on_cycles[HP700_LED_HEARTBEAT] =
+ HP700_HEARTBEAT_CYCLES;
+ }
+
+ /* Form the new LED mask. */
+ leds = 0;
+ for (led_i = 0, led = (1 << 0);
+ led_i < _HP700_LEDS_BLINKABLE;
+ led_i++, led <<= 1) {
+ if (_hp700_led_on_cycles[led_i] > 0)
+ leds |= led;
+ if (_hp700_led_on_cycles[led_i] >= 0)
+ _hp700_led_on_cycles[led_i]--;
}
+
+ /* Add in the system load. */
+ load = averunnable.ldavg[0] >> FSHIFT;
+ if (load >= (1 << (_HP700_LEDS_COUNT - _HP700_LEDS_BLINKABLE)))
+ load = (1 << (_HP700_LEDS_COUNT - _HP700_LEDS_BLINKABLE)) - 1;
+ leds |= (load << _HP700_LEDS_BLINKABLE);
+
+ /* Set the LEDs. */
+ hp700_led_ctl(-1, leds, 0);
+
+ /* NB: this assumes _HP700_LED_FREQ is a power of two. */
+ led_cycle = (led_cycle + 1) & (_HP700_LED_FREQ - 1);
+ callout_reset(&hp700_led_callout, hz / _HP700_LED_FREQ,
+ hp700_led_blinker, (void *) led_cycle);
+
}
-#endif
+#endif /* USELEDS */
/*
* This is called by configure to set dumplo and dumpsize.
diff -r 35b2bd8bd7d0 -r e565ef283c1a sys/arch/hp700/hp700/machdep.h
--- a/sys/arch/hp700/hp700/machdep.h Sun Aug 11 19:39:37 2002 +0000
+++ b/sys/arch/hp700/hp700/machdep.h Sun Aug 11 19:53:41 2002 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.h,v 1.1 2002/06/06 19:48:06 fredette Exp $ */
+/* $NetBSD: machdep.h,v 1.2 2002/08/11 19:53:42 fredette Exp $ */
/* $OpenBSD: cpufunc.h,v 1.17 2000/05/15 17:22:40 mickey Exp $ */
@@ -77,6 +77,14 @@
#include <hppa/hppa/machdep.h>
+/* The LEDs. */
+#define HP700_LED_NETSND (0)
+#define HP700_LED_NETRCV (1)
+#define HP700_LED_DISK (2)
+#define HP700_LED_HEARTBEAT (3)
+#define _HP700_LEDS_BLINKABLE (4)
+#define _HP700_LEDS_COUNT (8)
+
/* This forcefully reboots the machine. */
void cpu_die __P((void));
@@ -84,47 +92,26 @@
int hp700_pagezero_map __P((void));
void hp700_pagezero_unmap __P((int));
+/* Blinking the LEDs. */
#ifdef USELEDS
-#define PALED_NETSND 0x01
-#define PALED_NETRCV 0x02
-#define PALED_DISK 0x04
-#define PALED_HEARTBEAT 0x08
-#define PALED_LOADMASK 0xf0
-
-#define PALED_DATA 0x01
-#define PALED_STROBE 0x02
-
+#define _HP700_LED_FREQ (16)
extern volatile u_int8_t *machine_ledaddr;
extern int machine_ledword, machine_leds;
-
-static __inline void
-ledctl(int on, int off, int toggle)
-{
- if (machine_ledaddr) {
- int r;
-
- if (on)
- machine_leds |= on;
- if (off)
- machine_leds &= ~off;
- if (toggle)
- machine_leds ^= toggle;
-
Home |
Main Index |
Thread Index |
Old Index