Port-mips archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

cobaltled(4): front/rear panel LEDs on Cobalt Qube and RaQ



Hello port-mips,

Attached is a patch adding cobaltled(4), a driver for the software-controllable LEDs on MIPS Cobalt Qube and RaQ systems. The diff is against -current as of 2026-11-04.

The LEDs are on the byte register at LED_ADDR (0x1c000000), which is also the reset port: writing LED_RESET (0x0f) resets the machine. The driver exports the LEDs through the MI leds framework (dev/led.c), so there's no device node or ioctl:

  Qube 2700 / Qube 2:  hw.led.front_left, hw.led.front_right
  RaQ / RaQ 2:         hw.led.web, hw.led.power_off

The register is write-only, so the driver keeps a copy of it. It only ever sets the bits for the LEDs on the detected model, so it can't write the reset value; a CTASSERT and a KASSERT back that up. On an unknown board ID it attaches without touching the register. It also only matches at addr 0x1c000000.

The patch also:

- lights the RaQ "OK to power off" LED in cpu_reboot() when the system halts, right after the "press any key to reboot" message. This is in machdep.c, so it works without the driver configured.
- replaces the unused LED_POWEROFF (3) in cobalt/include/cpu.h with named bits: LED_QUBE_LEFT 0x01, LED_QUBE_RIGHT 0x02, LED_RAQ_WEB 0x04, LED_RAQ_POWEROFF 0x08. Tsutsui-san, do you remember what LED_POWEROFF was meant for? Nothing in the tree uses it, and 3 doesn't match the RaQ power-off bit, unless it was a bit number.
- adds cobaltled0 to GENERIC, plus the cobaltled.4 man page, an intro.4 entry and the set lists.

Tested with a -current GENERIC kernel over a 9.3 userland on:

- two CacheRaQs (report as "Cobalt RaQ"): web and power_off toggle, the names match the panel legends, and the power-off LED lights at halt
- a testing Qube 2: both front LEDs on at attach (the firmware default), independently controllable, a toggle loop never resets the machine, and halt leaves them alone
- a Qube 2700: same as the Qube 2, same bits
- a production Qube 2 running a full day under its normal workload on a public IP

I don't have a RaQ 2 to test with; it shares the RaQ code path. The "production" Qube2 runs 24/7 hosting my persistent IRC sessions and such, it hosts a small HTTP page about itself at:

http://qube2.glitchworks.net

The code is my own, originally a 2020 cdev/ioctl driver for netbsd-9, rewritten for the leds framework. It's under a BSD license, copyright Glitch Works, LLC. I had some work before that, from the NetBSD 7.x series, but I don't have the source anymore to reference for my origin-date.

AI disclosure: while I did write the original code myself, without assistance, I did use a LLM (Claude Opus 5.5) to pull it up to current and prepare the diff. All testing was conducted by hand on real Cobalt hardware.

Comments welcome. If it looks OK, I'd appreciate someone committing it.

Thanks,

Jonathan Chapman
glitch%glitchwrks.com@localhost (subscribed as lists%glitchwrks.com@localhost)





diff --git a/distrib/sets/lists/man/mi b/distrib/sets/lists/man/mi
index 4b3789cc..537c37ba 100644
--- a/distrib/sets/lists/man/mi
+++ b/distrib/sets/lists/man/mi
@@ -1120,6 +1120,7 @@
 ./usr/share/man/cat4/cmpci.0			man-sys-catman		.cat
 ./usr/share/man/cat4/cms.0			man-sys-catman		.cat
 ./usr/share/man/cat4/cnw.0			man-sys-catman		.cat
+./usr/share/man/cat4/cobalt/cobaltled.0	man-sys-catman		.cat
 ./usr/share/man/cat4/cobalt/gt.0		man-sys-catman		.cat
 ./usr/share/man/cat4/cobalt/intro.0		man-sys-catman		.cat
 ./usr/share/man/cat4/com.0			man-sys-catman		.cat
@@ -4732,6 +4733,7 @@
 ./usr/share/man/man4/cmpci.4			man-sys-man		.man
 ./usr/share/man/man4/cms.4			man-sys-man		.man
 ./usr/share/man/man4/cnw.4			man-sys-man		.man
+./usr/share/man/man4/cobalt/cobaltled.4	man-sys-man		.man
 ./usr/share/man/man4/cobalt/gt.4		man-sys-man		.man
 ./usr/share/man/man4/cobalt/intro.4		man-sys-man		.man
 ./usr/share/man/man4/com.4			man-sys-man		.man
diff --git a/distrib/sets/lists/manhtml/mi b/distrib/sets/lists/manhtml/mi
index 81bf4be6..e3004d30 100644
--- a/distrib/sets/lists/manhtml/mi
+++ b/distrib/sets/lists/manhtml/mi
@@ -1000,6 +1000,7 @@
 ./usr/share/man/html4/cmpci.html		man-sys-htmlman		html
 ./usr/share/man/html4/cms.html			man-sys-htmlman		html
 ./usr/share/man/html4/cnw.html			man-sys-htmlman		html
+./usr/share/man/html4/cobalt/cobaltled.html	man-sys-htmlman		html
 ./usr/share/man/html4/cobalt/gt.html		man-sys-htmlman		html
 ./usr/share/man/html4/cobalt/intro.html		man-sys-htmlman		html
 ./usr/share/man/html4/com.html			man-sys-htmlman		html
diff --git a/share/man/man4/man4.cobalt/Makefile b/share/man/man4/man4.cobalt/Makefile
index 77bf9726..e14b88a9 100644
--- a/share/man/man4/man4.cobalt/Makefile
+++ b/share/man/man4/man4.cobalt/Makefile
@@ -1,6 +1,6 @@
 #	$NetBSD: Makefile,v 1.1 2003/04/29 21:00:04 gmcgarry Exp $
 
-MAN=	gt.4 intro.4
+MAN=	cobaltled.4 gt.4 intro.4
 
 MANSUBDIR=/cobalt
 
diff --git a/share/man/man4/man4.cobalt/cobaltled.4 b/share/man/man4/man4.cobalt/cobaltled.4
new file mode 100644
index 00000000..3c30e1e3
--- /dev/null
+++ b/share/man/man4/man4.cobalt/cobaltled.4
@@ -0,0 +1,92 @@
+.\"	$NetBSD$
+.\"
+.\" Copyright (c) 2020, 2026 Glitch Works, LLC.
+.\" All rights reserved.
+.\"
+.\" Author: Jonathan Chapman (glitch%glitchwrks.com@localhost)
+.\"
+.\" 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. 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.
+.\"
+.Dd November 5, 2026
+.Dt COBALTLED 4 cobalt
+.Os
+.Sh NAME
+.Nm cobaltled
+.Nd Cobalt Qube and RaQ panel LEDs
+.Sh SYNOPSIS
+.Cd "cobaltled0 at mainbus? addr 0x1c000000"
+.Sh DESCRIPTION
+The
+.Nm
+driver controls the software-controllable LEDs on Cobalt Qube and RaQ
+systems.
+Each LED present on the detected model is exported as a boolean
+.Xr sysctl 8
+variable under
+.Va hw.led :
+.Bl -tag -width "hw.led.front_right"
+.It Va hw.led.front_left
+Qube front panel, left LED.
+.It Va hw.led.front_right
+Qube front panel, right LED.
+.It Va hw.led.web
+RaQ
+.Dq Web
+LED.
+.It Va hw.led.power_off
+RaQ
+.Dq OK to power off
+LED.
+.El
+.Pp
+Setting a variable to 1 turns the LED on, and 0 turns it off.
+The LEDs share one write-only register, so the driver keeps a copy of
+its contents.
+At attach the Qube front LEDs are turned on and the RaQ LEDs are
+turned off.
+.Pp
+Independent of this driver, the kernel lights the RaQ
+.Dq OK to power off
+LED when the system halts.
+.Sh EXAMPLES
+Turn on the Web LED on a RaQ:
+.Bd -literal -offset indent
+# sysctl -w hw.led.web=1
+.Ed
+.Sh DIAGNOSTICS
+.Bl -diag
+.It "cobaltled0: unknown board ID %u, not attaching LEDs"
+The board ID read at boot is not one of the known Qube or RaQ models.
+No LEDs are exported, and the register is not written.
+.El
+.Sh SEE ALSO
+.Xr sysctl 8
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Nx 12.0 .
+.Sh AUTHORS
+.An Jonathan Chapman Aq Mt glitch%glitchwrks.com@localhost
+.Sh CAVEATS
+The LED register is also the system reset port.
+The driver only ever writes the bits for the LEDs on the detected
+model, so it cannot reset the machine.
diff --git a/share/man/man4/man4.cobalt/intro.4 b/share/man/man4/man4.cobalt/intro.4
index 7d7ae92c..e2b3e7da 100644
--- a/share/man/man4/man4.cobalt/intro.4
+++ b/share/man/man4/man4.cobalt/intro.4
@@ -24,7 +24,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd February 17, 2017
+.Dd November 5, 2026
 .Dt INTRO 4 cobalt
 .Os
 .Sh NAME
@@ -94,7 +94,9 @@ system.
 Devices are indicated by their functional interface.
 Not all supported devices are listed.
 .Pp
-.Bl -tag -width com -offset indent -compact
+.Bl -tag -width cobaltled -offset indent -compact
+.It cobaltled
+front and rear panel LEDs
 .It gt
 PCI bridge
 .It com
@@ -115,6 +117,7 @@ bus and associated device drivers.
 .Sh SEE ALSO
 .Xr config 1 ,
 .Xr autoconf 4 ,
+.Xr cobalt/cobaltled 4 ,
 .Xr cobalt/gt 4
 .Sh HISTORY
 This
diff --git a/sys/arch/cobalt/cobalt/machdep.c b/sys/arch/cobalt/cobalt/machdep.c
index beb001df..a5ee0622 100644
--- a/sys/arch/cobalt/cobalt/machdep.c
+++ b/sys/arch/cobalt/cobalt/machdep.c
@@ -368,6 +368,12 @@ cpu_reboot(int howto, char *bootstr)
 		printf("\n");
 		printf("The operating system has halted.\n");
 		printf("Please press any key to reboot.\n\n");
+
+		/* Light the "OK to power off" LED on RaQs. */
+		if (cobalt_id == COBALT_ID_RAQ || cobalt_id == COBALT_ID_RAQ2)
+			*(volatile uint8_t *)MIPS_PHYS_TO_KSEG1(LED_ADDR) =
+			    LED_RAQ_POWEROFF;
+
 		cnpollc(true);	/* For proper keyboard command handling */
 		cngetc();
 		cnpollc(false);
diff --git a/sys/arch/cobalt/conf/GENERIC b/sys/arch/cobalt/conf/GENERIC
index b54dbcdb..e1be7807 100644
--- a/sys/arch/cobalt/conf/GENERIC
+++ b/sys/arch/cobalt/conf/GENERIC
@@ -142,6 +142,8 @@ zstty1		at zsc0 channel 1
 
 lcdpanel0	at mainbus? addr 0x1f000000
 
+cobaltled0	at mainbus? addr 0x1c000000	# front/rear panel LEDs
+
 gt0 		at mainbus? addr 0x14000000
 
 pci* 		at gt0
diff --git a/sys/arch/cobalt/conf/files.cobalt b/sys/arch/cobalt/conf/files.cobalt
index 3992db0b..a2f21d46 100644
--- a/sys/arch/cobalt/conf/files.cobalt
+++ b/sys/arch/cobalt/conf/files.cobalt
@@ -35,6 +35,10 @@ device lcdpanel: hd44780
 attach lcdpanel at mainbus
 file arch/cobalt/dev/lcdpanel.c		lcdpanel
 
+device cobaltled: leds
+attach cobaltled at mainbus
+file arch/cobalt/dev/cobaltled.c	cobaltled
+
 device gt: pcibus
 attach gt at mainbus
 file arch/cobalt/dev/gt.c		gt
diff --git a/sys/arch/cobalt/dev/cobaltled.c b/sys/arch/cobalt/dev/cobaltled.c
new file mode 100644
index 00000000..a526b408
--- /dev/null
+++ b/sys/arch/cobalt/dev/cobaltled.c
@@ -0,0 +1,256 @@
+/*	$NetBSD$	*/
+
+/*-
+ * Copyright (c) 2020, 2026 Glitch Works, LLC.
+ * All rights reserved.
+ *
+ * Author: Jonathan Chapman (glitch%glitchwrks.com@localhost)
+ *
+ * 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. 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.
+ */
+
+/*
+ * Front/rear panel LEDs on Cobalt Qube and RaQ systems.
+ *
+ * The LEDs are driven from a single write-only byte register at
+ * LED_ADDR.  The same register is the system reset port: writing
+ * LED_RESET (0x0f) resets the machine.  The driver keeps a shadow copy
+ * of the register and only ever sets the bits belonging to the LEDs
+ * present on the detected model, so the reset value cannot be written.
+ *
+ * Each LED is exported through the MI leds framework as hw.led.<name>.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/bus.h>
+#include <sys/mutex.h>
+
+#include <machine/autoconf.h>
+#include <machine/cpu.h>
+
+#include <dev/led.h>
+
+#define COBALTLED_MAXLEDS	2
+
+/* Neither model's full LED mask may equal the reset value. */
+CTASSERT((LED_QUBE_LEFT | LED_QUBE_RIGHT) != LED_RESET);
+CTASSERT((LED_RAQ_WEB | LED_RAQ_POWEROFF) != LED_RESET);
+
+struct cobaltled_desc {
+	const char	*cd_name;
+	uint8_t		cd_bit;
+};
+
+struct cobaltled_model {
+	const struct cobaltled_desc	*cm_leds;
+	u_int				cm_nleds;
+	uint8_t				cm_initial;	/* state at attach */
+};
+
+static const struct cobaltled_desc cobaltled_qube_leds[] = {
+	{ "front_left",		LED_QUBE_LEFT },
+	{ "front_right",	LED_QUBE_RIGHT },
+};
+
+static const struct cobaltled_desc cobaltled_raq_leds[] = {
+	{ "web",		LED_RAQ_WEB },
+	{ "power_off",		LED_RAQ_POWEROFF },
+};
+
+static const struct cobaltled_model cobaltled_qube = {
+	.cm_leds = cobaltled_qube_leds,
+	.cm_nleds = __arraycount(cobaltled_qube_leds),
+	.cm_initial = LED_QUBE_LEFT | LED_QUBE_RIGHT,
+};
+
+static const struct cobaltled_model cobaltled_raq = {
+	.cm_leds = cobaltled_raq_leds,
+	.cm_nleds = __arraycount(cobaltled_raq_leds),
+	.cm_initial = 0,
+};
+
+struct cobaltled_softc;
+
+struct cobaltled_led {
+	struct cobaltled_softc	*cl_sc;
+	void			*cl_handle;
+	uint8_t			cl_bit;
+};
+
+struct cobaltled_softc {
+	device_t		sc_dev;
+	bus_space_tag_t		sc_iot;
+	bus_space_handle_t	sc_ioh;
+	kmutex_t		sc_lock;
+	uint8_t			sc_state;	/* shadow of the register */
+	uint8_t			sc_mask;	/* bits this model may set */
+	u_int			sc_nleds;
+	struct cobaltled_led	sc_leds[COBALTLED_MAXLEDS];
+};
+
+static int	cobaltled_match(device_t, cfdata_t, void *);
+static void	cobaltled_attach(device_t, device_t, void *);
+static int	cobaltled_detach(device_t, int);
+
+static int	cobaltled_get(void *);
+static void	cobaltled_set(void *, int);
+
+CFATTACH_DECL_NEW(cobaltled, sizeof(struct cobaltled_softc),
+    cobaltled_match, cobaltled_attach, cobaltled_detach, NULL);
+
+static int cobaltled_found;
+
+static int
+cobaltled_match(device_t parent, cfdata_t cf, void *aux)
+{
+	struct mainbus_attach_args *ma = aux;
+
+	/*
+	 * This register is also the reset port; refuse any address but
+	 * the known one so a config typo can't point us somewhere else.
+	 */
+	if (ma->ma_addr != LED_ADDR)
+		return 0;
+
+	if (cobaltled_found)
+		return 0;
+
+	return 1;
+}
+
+static void
+cobaltled_attach(device_t parent, device_t self, void *aux)
+{
+	struct cobaltled_softc *sc = device_private(self);
+	struct mainbus_attach_args *ma = aux;
+	const struct cobaltled_model *model;
+	u_int i;
+
+	sc->sc_dev = self;
+	sc->sc_iot = ma->ma_iot;
+	cobaltled_found = 1;
+
+	aprint_naive("\n");
+	aprint_normal(": LED register\n");
+
+	switch (cobalt_id) {
+	case COBALT_ID_QUBE2700:
+	case COBALT_ID_QUBE2:
+		model = &cobaltled_qube;
+		break;
+	case COBALT_ID_RAQ:
+	case COBALT_ID_RAQ2:
+		model = &cobaltled_raq;
+		break;
+	default:
+		aprint_error_dev(self,
+		    "unknown board ID %u, not attaching LEDs\n", cobalt_id);
+		return;
+	}
+
+	if (bus_space_map(sc->sc_iot, ma->ma_addr, 1, 0, &sc->sc_ioh) != 0) {
+		aprint_error_dev(self, "unable to map register at 0x%"
+		    PRIxBUSADDR "\n", ma->ma_addr);
+		return;
+	}
+
+	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE);
+
+	sc->sc_mask = 0;
+	for (i = 0; i < model->cm_nleds; i++)
+		sc->sc_mask |= model->cm_leds[i].cd_bit;
+	KASSERT(sc->sc_mask != LED_RESET);
+
+	/* The register can't be read back; put it in a known state. */
+	sc->sc_state = model->cm_initial & sc->sc_mask;
+	bus_space_write_1(sc->sc_iot, sc->sc_ioh, 0, sc->sc_state);
+
+	for (i = 0; i < model->cm_nleds; i++) {
+		struct cobaltled_led *cl = &sc->sc_leds[sc->sc_nleds];
+
+		cl->cl_sc = sc;
+		cl->cl_bit = model->cm_leds[i].cd_bit;
+		cl->cl_handle = led_attach(model->cm_leds[i].cd_name, cl,
+		    cobaltled_get, cobaltled_set);
+		if (cl->cl_handle == NULL) {
+			aprint_error_dev(self, "couldn't attach LED %s\n",
+			    model->cm_leds[i].cd_name);
+			continue;
+		}
+		sc->sc_nleds++;
+	}
+}
+
+static int
+cobaltled_detach(device_t self, int flags)
+{
+	struct cobaltled_softc *sc = device_private(self);
+	u_int i;
+
+	if (sc->sc_mask == 0)
+		return 0;	/* attach bailed out early */
+
+	for (i = 0; i < sc->sc_nleds; i++)
+		led_detach(sc->sc_leds[i].cl_handle);
+	sc->sc_nleds = 0;
+
+	bus_space_unmap(sc->sc_iot, sc->sc_ioh, 1);
+	mutex_destroy(&sc->sc_lock);
+	cobaltled_found = 0;
+
+	return 0;
+}
+
+static int
+cobaltled_get(void *cookie)
+{
+	struct cobaltled_led *cl = cookie;
+	struct cobaltled_softc *sc = cl->cl_sc;
+	int state;
+
+	mutex_enter(&sc->sc_lock);
+	state = (sc->sc_state & cl->cl_bit) ? LED_STATE_ON : LED_STATE_OFF;
+	mutex_exit(&sc->sc_lock);
+
+	return state;
+}
+
+static void
+cobaltled_set(void *cookie, int state)
+{
+	struct cobaltled_led *cl = cookie;
+	struct cobaltled_softc *sc = cl->cl_sc;
+
+	mutex_enter(&sc->sc_lock);
+	if (state)
+		sc->sc_state |= cl->cl_bit;
+	else
+		sc->sc_state &= ~cl->cl_bit;
+	sc->sc_state &= sc->sc_mask;
+	KASSERT(sc->sc_state != LED_RESET);
+	bus_space_write_1(sc->sc_iot, sc->sc_ioh, 0, sc->sc_state);
+	mutex_exit(&sc->sc_lock);
+}
diff --git a/sys/arch/cobalt/include/cpu.h b/sys/arch/cobalt/include/cpu.h
index c597bf15..d8bb44b9 100644
--- a/sys/arch/cobalt/include/cpu.h
+++ b/sys/arch/cobalt/include/cpu.h
@@ -22,7 +22,10 @@ extern u_int cobalt_id;
 #define GT_BASE		0x14000000
 #define LED_ADDR	0x1c000000
 #define LED_RESET	0x0f		/* Resets machine. */
-#define LED_POWEROFF	3
+#define LED_QUBE_LEFT	0x01		/* Qube front left LED */
+#define LED_QUBE_RIGHT	0x02		/* Qube front right LED */
+#define LED_RAQ_WEB	0x04		/* RaQ "Web" LED */
+#define LED_RAQ_POWEROFF 0x08		/* RaQ "OK to power off" LED */
 #define COM_BASE	0x1c800000
 #define ZS_BASE		0x1c800000
 #define LCDPANEL_BASE	0x1d000000


Home | Main Index | Thread Index | Old Index