Created
November 21, 2014 11:43
-
-
Save bodgit/dac16e8acc5688230715 to your computer and use it in GitHub Desktop.
Soekris net6501 GPIO & LED support on OpenBSD
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: share/man/man4/gpio.4 | |
=================================================================== | |
RCS file: /cvs/src/share/man/man4/gpio.4,v | |
retrieving revision 1.22 | |
diff -u -p -r1.22 gpio.4 | |
--- share/man/man4/gpio.4 21 Jan 2014 11:02:00 -0000 1.22 | |
+++ share/man/man4/gpio.4 21 Nov 2014 11:38:17 -0000 | |
@@ -30,6 +30,7 @@ | |
.Cd "gpio* at omgpio?" Pq armv7 | |
.Cd "gpio* at pcagpio?" | |
.Cd "gpio* at pcaled?" | |
+.Cd "gpio* at soekris?" Pq amd64, i386 | |
.Cd "gpio0 at voyager?" Pq loongson | |
.Pp | |
.Fd #include <sys/types.h> | |
Index: share/man/man4/isa.4 | |
=================================================================== | |
RCS file: /cvs/src/share/man/man4/isa.4,v | |
retrieving revision 1.72 | |
diff -u -p -r1.72 isa.4 | |
--- share/man/man4/isa.4 18 Mar 2014 22:36:31 -0000 1.72 | |
+++ share/man/man4/isa.4 21 Nov 2014 11:38:17 -0000 | |
@@ -222,6 +222,8 @@ PCMCIA controllers | |
PC (ISA) keyboard controller driver | |
.It Xr pcppi 4 | |
PC (ISA) control and timer port driver | |
+.It Xr soekris 4 | |
+Soekris net6501 GPIO and LEDs driver | |
.It Xr vga 4 | |
VGA graphics driver for wscons | |
.El | |
Index: share/man/man4/man4.amd64/Makefile | |
=================================================================== | |
RCS file: /cvs/src/share/man/man4/man4.amd64/Makefile,v | |
retrieving revision 1.15 | |
diff -u -p -r1.15 Makefile | |
--- share/man/man4/man4.amd64/Makefile 27 May 2012 12:24:33 -0000 1.15 | |
+++ share/man/man4/man4.amd64/Makefile 21 Nov 2014 11:38:17 -0000 | |
@@ -1,7 +1,7 @@ | |
# $OpenBSD: Makefile,v 1.15 2012/05/27 12:24:33 jsg Exp $ | |
MAN= amdpcib.4 apm.4 autoconf.4 bios.4 cpu.4 intro.4 ioapic.4 \ | |
- mem.4 mpbios.4 nvram.4 mtrr.4 pctr.4 tcpcib.4 | |
+ mem.4 mpbios.4 nvram.4 mtrr.4 pctr.4 soekris.4 tcpcib.4 | |
MLINKS+= mem.4 kmem.4 | |
MANSUBDIR=amd64 | |
Index: share/man/man4/man4.amd64/soekris.4 | |
=================================================================== | |
RCS file: share/man/man4/man4.amd64/soekris.4 | |
diff -N share/man/man4/man4.amd64/soekris.4 | |
--- /dev/null 1 Jan 1970 00:00:00 -0000 | |
+++ share/man/man4/man4.amd64/soekris.4 21 Nov 2014 11:38:17 -0000 | |
@@ -0,0 +1,57 @@ | |
+.\" $OpenBSD$ | |
+.\" | |
+.\" Copyright (c) 2014 Matt Dainty <[email protected]> | |
+.\" | |
+.\" Permission to use, copy, modify, and distribute this software for any | |
+.\" purpose with or without fee is hereby granted, provided that the above | |
+.\" copyright notice and this permission notice appear in all copies. | |
+.\" | |
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+.\" | |
+.Dd $Mdocdate$ | |
+.Dt SOEKRIS 4 amd64 | |
+.Os | |
+.Sh NAME | |
+.Nm soekris | |
+.Nd Soekris net6501 GPIO and LEDs | |
+.Sh SYNOPSIS | |
+.Cd "soekris0 at isa? port 0x680" | |
+.Cd "gpio* at soekris?" | |
+.Sh DESCRIPTION | |
+The | |
+.Nm | |
+driver provides support for the GPIO and LEDs as implemented by the Xilinx | |
+Spartan FGPA integrated into the Soekris net6501 programmed with the default | |
+bitstream found in the BIOS. | |
+.Pp | |
+Two standard | |
+.Xr gpio 4 | |
+interfaces are provided, one for the 16 real pins which can be configured as | |
+either inputs or outputs and another with 2 output-only pins that map | |
+to the error and ready LEDs respectively. | |
+Both may be used with | |
+.Xr gpioctl 8 . | |
+.Sh SEE ALSO | |
+.Xr intro 4 , | |
+.Xr isa 4 , | |
+.Xr gpio 4 , | |
+.Xr gpioctl 8 | |
+.Sh HISTORY | |
+The | |
+.Nm | |
+driver first appeared in | |
+.Ox 5.7 . | |
+.Sh AUTHORS | |
+The | |
+.Nm | |
+driver was written by | |
+.An Matt Dainty Aq [email protected] . | |
+.Sh BUGS | |
+If the Xilinx FPGA is programmed with a different bistream, the driver will | |
+likely not function. | |
Index: share/man/man4/man4.i386/Makefile | |
=================================================================== | |
RCS file: /cvs/src/share/man/man4/man4.i386/Makefile,v | |
retrieving revision 1.72 | |
diff -u -p -r1.72 Makefile | |
--- share/man/man4/man4.i386/Makefile 27 May 2012 12:24:33 -0000 1.72 | |
+++ share/man/man4/man4.i386/Makefile 21 Nov 2014 11:38:17 -0000 | |
@@ -7,7 +7,7 @@ MAN= amdpcib.4 amdmsr.4 apm.4 autoconf.4 | |
ichpcib.4 intro.4 ioapic.4 \ | |
joy.4 le.4 lms.4 mem.4 mms.4 mpbios.4 mtrr.4 npx.4 nvram.4 \ | |
pas.4 pcibios.4 pctr.4 piixpcib.4 sb.4 \ | |
- sea.4 tcpcib.4 uha.4 wds.4 wdt.4 wss.4 | |
+ sea.4 soekris.4 tcpcib.4 uha.4 wds.4 wdt.4 wss.4 | |
MLINKS+= mem.4 kmem.4 | |
MANSUBDIR=i386 | |
Index: share/man/man4/man4.i386/soekris.4 | |
=================================================================== | |
RCS file: share/man/man4/man4.i386/soekris.4 | |
diff -N share/man/man4/man4.i386/soekris.4 | |
--- /dev/null 1 Jan 1970 00:00:00 -0000 | |
+++ share/man/man4/man4.i386/soekris.4 21 Nov 2014 11:38:17 -0000 | |
@@ -0,0 +1,57 @@ | |
+.\" $OpenBSD$ | |
+.\" | |
+.\" Copyright (c) 2014 Matt Dainty <[email protected]> | |
+.\" | |
+.\" Permission to use, copy, modify, and distribute this software for any | |
+.\" purpose with or without fee is hereby granted, provided that the above | |
+.\" copyright notice and this permission notice appear in all copies. | |
+.\" | |
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+.\" | |
+.Dd $Mdocdate$ | |
+.Dt SOEKRIS 4 i386 | |
+.Os | |
+.Sh NAME | |
+.Nm soekris | |
+.Nd Soekris net6501 GPIO and LEDs | |
+.Sh SYNOPSIS | |
+.Cd "soekris0 at isa? port 0x680" | |
+.Cd "gpio* at soekris?" | |
+.Sh DESCRIPTION | |
+The | |
+.Nm | |
+driver provides support for the GPIO and LEDs as implemented by the Xilinx | |
+Spartan FGPA integrated into the Soekris net6501 programmed with the default | |
+bitstream found in the BIOS. | |
+.Pp | |
+Two standard | |
+.Xr gpio 4 | |
+interfaces are provided, one for the 16 real pins which can be configured as | |
+either inputs or outputs and another with 2 output-only pins that map | |
+to the error and ready LEDs respectively. | |
+Both may be used with | |
+.Xr gpioctl 8 . | |
+.Sh SEE ALSO | |
+.Xr intro 4 , | |
+.Xr isa 4 , | |
+.Xr gpio 4 , | |
+.Xr gpioctl 8 | |
+.Sh HISTORY | |
+The | |
+.Nm | |
+driver first appeared in | |
+.Ox 5.7 . | |
+.Sh AUTHORS | |
+The | |
+.Nm | |
+driver was written by | |
+.An Matt Dainty Aq [email protected] . | |
+.Sh BUGS | |
+If the Xilinx FPGA is programmed with a different bistream, the driver will | |
+likely not function. | |
Index: sys/arch/amd64/conf/files.amd64 | |
=================================================================== | |
RCS file: /cvs/src/sys/arch/amd64/conf/files.amd64,v | |
retrieving revision 1.74 | |
diff -u -p -r1.74 files.amd64 | |
--- sys/arch/amd64/conf/files.amd64 11 Jul 2014 21:54:37 -0000 1.74 | |
+++ sys/arch/amd64/conf/files.amd64 21 Nov 2014 11:38:18 -0000 | |
@@ -192,6 +192,11 @@ device fd: disk, isa_dma | |
attach fd at fdc | |
file dev/isa/fd.c fd needs-flag | |
+# Soekris GPIO & LEDs driver | |
+device soekris: gpiobus | |
+attach soekris at isa | |
+file dev/isa/soekris.c soekris | |
+ | |
pseudo-device pctr | |
file arch/amd64/amd64/pctr.c pctr needs-flag | |
Index: sys/arch/i386/conf/files.i386 | |
=================================================================== | |
RCS file: /cvs/src/sys/arch/i386/conf/files.i386,v | |
retrieving revision 1.218 | |
diff -u -p -r1.218 files.i386 | |
--- sys/arch/i386/conf/files.i386 8 Sep 2014 01:47:05 -0000 1.218 | |
+++ sys/arch/i386/conf/files.i386 21 Nov 2014 11:38:18 -0000 | |
@@ -220,6 +220,11 @@ major {fd = 2} | |
attach ahc at isa with ahc_isa | |
file arch/i386/isa/ahc_isa.c ahc_isa | |
+# Soekris GPIO & LEDs driver | |
+device soekris: gpiobus | |
+attach soekris at isa | |
+file dev/isa/soekris.c soekris | |
+ | |
# Pentium performance counters | |
pseudo-device pctr | |
file arch/i386/i386/pctr.c pctr needs-flag | |
Index: sys/dev/isa/soekris.c | |
=================================================================== | |
RCS file: sys/dev/isa/soekris.c | |
diff -N sys/dev/isa/soekris.c | |
--- /dev/null 1 Jan 1970 00:00:00 -0000 | |
+++ sys/dev/isa/soekris.c 21 Nov 2014 11:38:18 -0000 | |
@@ -0,0 +1,239 @@ | |
+/* $OpenBSD$ */ | |
+ | |
+/* | |
+ * Copyright (c) 2014 Matt Dainty <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN | |
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+ | |
+/* | |
+ * Soekris net6501 GPIO and LEDs as implemented by the onboard Xilinx FPGA | |
+ */ | |
+ | |
+#include <sys/param.h> | |
+#include <sys/systm.h> | |
+#include <sys/device.h> | |
+#include <sys/gpio.h> | |
+ | |
+#include <machine/bus.h> | |
+#include <machine/intr.h> | |
+ | |
+#include <dev/isa/isavar.h> | |
+ | |
+#include <dev/gpio/gpiovar.h> | |
+ | |
+#define SOEKRIS_BASE 0x680 /* Base address of FPGA I/O */ | |
+#define SOEKRIS_IOSIZE 32 /* I/O region size */ | |
+ | |
+#define SOEKRIS_NPINS 16 /* Number of Pins */ | |
+#define SOEKRIS_GPIO_INPUT 0x000 /* Current state of pins */ | |
+#define SOEKRIS_GPIO_OUTPUT 0x004 /* Set state of output pins */ | |
+#define SOEKRIS_GPIO_RESET 0x008 /* Reset output pins */ | |
+#define SOEKRIS_GPIO_SET 0x00c /* Set output pins */ | |
+#define SOEKRIS_GPIO_DIR 0x010 /* Direction, set for output */ | |
+ | |
+#define SOEKRIS_NLEDS 2 /* Number of LEDs */ | |
+#define SOEKRIS_LED_ERROR 0x01c /* Offset to error LED */ | |
+#define SOEKRIS_LED_READY 0x01d /* Offset to ready LED */ | |
+ | |
+extern char *hw_vendor, *hw_prod; | |
+ | |
+const u_int soekris_led_offset[SOEKRIS_NLEDS] = { | |
+ SOEKRIS_LED_ERROR, SOEKRIS_LED_READY | |
+}; | |
+ | |
+struct soekris_softc { | |
+ struct device sc_dev; | |
+ | |
+ bus_space_tag_t sc_iot; | |
+ bus_space_handle_t sc_ioh; | |
+ | |
+ struct gpio_chipset_tag sc_gpio_gc; | |
+ gpio_pin_t sc_gpio_pins[SOEKRIS_NPINS]; | |
+ | |
+ /* Fake GPIO device for the LEDs */ | |
+ struct gpio_chipset_tag sc_led_gc; | |
+ gpio_pin_t sc_led_pins[SOEKRIS_NLEDS]; | |
+}; | |
+ | |
+int soekris_match(struct device *, void *, void *); | |
+void soekris_attach(struct device *, struct device *, void *); | |
+int soekris_gpio_read(void *, int); | |
+void soekris_gpio_write(void *, int, int); | |
+void soekris_gpio_ctl(void *, int, int); | |
+int soekris_led_read(void *, int); | |
+void soekris_led_write(void *, int, int); | |
+void soekris_led_ctl(void *, int, int); | |
+ | |
+struct cfattach soekris_ca = { | |
+ sizeof(struct soekris_softc), soekris_match, soekris_attach | |
+}; | |
+ | |
+struct cfdriver soekris_cd = { | |
+ NULL, "soekris", DV_DULL | |
+}; | |
+ | |
+int | |
+soekris_match(struct device *parent, void *match, void *aux) | |
+{ | |
+ struct isa_attach_args *ia = aux; | |
+ bus_space_handle_t ioh; | |
+ | |
+ if (strcmp(hw_vendor, "Soekris Engineering") || | |
+ strcmp(hw_prod, "net6501")) | |
+ return (0); | |
+ | |
+ if (ia->ia_iobase != SOEKRIS_BASE || bus_space_map(ia->ia_iot, | |
+ ia->ia_iobase, SOEKRIS_IOSIZE, 0, &ioh) != 0) | |
+ return (0); | |
+ | |
+ bus_space_unmap(ia->ia_iot, ioh, SOEKRIS_IOSIZE); | |
+ ia->ia_iosize = SOEKRIS_IOSIZE; | |
+ ia->ipa_nio = 1; | |
+ ia->ipa_nmem = 0; | |
+ ia->ipa_nirq = 0; | |
+ ia->ipa_ndrq = 0; | |
+ | |
+ return (1); | |
+} | |
+ | |
+void | |
+soekris_attach(struct device *parent, struct device *self, void *aux) | |
+{ | |
+ struct soekris_softc *sc = (void *)self; | |
+ struct isa_attach_args *ia = aux; | |
+ struct gpiobus_attach_args gba1, gba2; | |
+ u_int data; | |
+ int i; | |
+ | |
+ if (bus_space_map(ia->ia_iot, ia->ia_iobase, ia->ia_iosize, 0, | |
+ &sc->sc_ioh) != 0) { | |
+ printf(": can't map i/o space\n"); | |
+ return; | |
+ } | |
+ | |
+ printf("\n"); | |
+ | |
+ sc->sc_iot = ia->ia_iot; | |
+ | |
+ data = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_DIR); | |
+ | |
+ for (i = 0; i < SOEKRIS_NPINS; i++) { | |
+ sc->sc_gpio_pins[i].pin_num = i; | |
+ sc->sc_gpio_pins[i].pin_caps = GPIO_PIN_INPUT | | |
+ GPIO_PIN_OUTPUT; | |
+ sc->sc_gpio_pins[i].pin_flags = (data & (1 << i)) ? | |
+ GPIO_PIN_OUTPUT : GPIO_PIN_INPUT; | |
+ sc->sc_gpio_pins[i].pin_state = soekris_gpio_read(sc, i); | |
+ } | |
+ | |
+ sc->sc_gpio_gc.gp_cookie = sc; | |
+ sc->sc_gpio_gc.gp_pin_read = soekris_gpio_read; | |
+ sc->sc_gpio_gc.gp_pin_write = soekris_gpio_write; | |
+ sc->sc_gpio_gc.gp_pin_ctl = soekris_gpio_ctl; | |
+ | |
+ gba1.gba_name = "gpio"; | |
+ gba1.gba_gc = &sc->sc_gpio_gc; | |
+ gba1.gba_pins = sc->sc_gpio_pins; | |
+ gba1.gba_npins = SOEKRIS_NPINS; | |
+ | |
+ (void)config_found(&sc->sc_dev, &gba1, gpiobus_print); | |
+ | |
+ for (i = 0; i < SOEKRIS_NLEDS; i++) { | |
+ sc->sc_led_pins[i].pin_num = i; | |
+ sc->sc_led_pins[i].pin_caps = GPIO_PIN_OUTPUT; | |
+ sc->sc_led_pins[i].pin_flags = GPIO_PIN_OUTPUT; | |
+ sc->sc_led_pins[i].pin_state = soekris_led_read(sc, i); | |
+ } | |
+ | |
+ sc->sc_led_gc.gp_cookie = sc; | |
+ sc->sc_led_gc.gp_pin_read = soekris_led_read; | |
+ sc->sc_led_gc.gp_pin_write = soekris_led_write; | |
+ sc->sc_led_gc.gp_pin_ctl = soekris_led_ctl; | |
+ | |
+ gba2.gba_name = "gpio"; | |
+ gba2.gba_gc = &sc->sc_led_gc; | |
+ gba2.gba_pins = sc->sc_led_pins; | |
+ gba2.gba_npins = SOEKRIS_NLEDS; | |
+ | |
+ (void)config_found(&sc->sc_dev, &gba2, gpiobus_print); | |
+} | |
+ | |
+int | |
+soekris_gpio_read(void *arg, int pin) | |
+{ | |
+ struct soekris_softc *sc = arg; | |
+ u_int16_t data; | |
+ | |
+ data = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_INPUT); | |
+ | |
+ return (data & (1 << pin)) ? GPIO_PIN_HIGH : GPIO_PIN_LOW; | |
+} | |
+ | |
+void | |
+soekris_gpio_write(void *arg, int pin, int value) | |
+{ | |
+ struct soekris_softc *sc = arg; | |
+ u_int16_t data; | |
+ | |
+ data = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_INPUT); | |
+ | |
+ if (value == GPIO_PIN_LOW) | |
+ data &= ~(1 << pin); | |
+ else if (value == GPIO_PIN_HIGH) | |
+ data |= (1 << pin); | |
+ | |
+ bus_space_write_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_OUTPUT, data); | |
+} | |
+ | |
+void | |
+soekris_gpio_ctl(void *arg, int pin, int flags) | |
+{ | |
+ struct soekris_softc *sc = arg; | |
+ u_int16_t data; | |
+ | |
+ data = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_DIR); | |
+ | |
+ if (flags & GPIO_PIN_INPUT) | |
+ data &= ~(1 << pin); | |
+ if (flags & GPIO_PIN_OUTPUT) | |
+ data |= (1 << pin); | |
+ | |
+ bus_space_write_2(sc->sc_iot, sc->sc_ioh, SOEKRIS_GPIO_DIR, data); | |
+} | |
+ | |
+int | |
+soekris_led_read(void *arg, int pin) | |
+{ | |
+ struct soekris_softc *sc = arg; | |
+ u_int8_t value; | |
+ | |
+ value = bus_space_read_1(sc->sc_iot, sc->sc_ioh, | |
+ soekris_led_offset[pin]); | |
+ | |
+ return (value & 0x1) ? GPIO_PIN_HIGH : GPIO_PIN_LOW; | |
+} | |
+ | |
+void | |
+soekris_led_write(void *arg, int pin, int value) | |
+{ | |
+ struct soekris_softc *sc = arg; | |
+ | |
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, soekris_led_offset[pin], | |
+ value); | |
+} | |
+ | |
+void | |
+soekris_led_ctl(void *arg, int pin, int flags) | |
+{ | |
+} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment