From afd3058a6cc4401565e3c0883cede223c1409edd Mon Sep 17 00:00:00 2001 From: Renato Botelho Date: Thu, 20 Aug 2015 16:37:29 -0300 Subject: [PATCH] Importing sysutils/wrapalixresetbutton from pfPorts --- sysutils/wrapalixresetbutton/Makefile | 40 +++ .../wrapalixresetbutton/files/APUresetbtn.c | 83 +++++ .../files/FW7541resetbtn.c | 310 ++++++++++++++++++ sysutils/wrapalixresetbutton/files/RCC-VE.c | 156 +++++++++ .../wrapalixresetbutton/files/alixresetbtn.c | 100 ++++++ .../wrapalixresetbutton/files/wrapresetbtn.c | 141 ++++++++ sysutils/wrapalixresetbutton/pkg-descr | 1 + 7 files changed, 831 insertions(+) create mode 100644 sysutils/wrapalixresetbutton/Makefile create mode 100644 sysutils/wrapalixresetbutton/files/APUresetbtn.c create mode 100644 sysutils/wrapalixresetbutton/files/FW7541resetbtn.c create mode 100644 sysutils/wrapalixresetbutton/files/RCC-VE.c create mode 100644 sysutils/wrapalixresetbutton/files/alixresetbtn.c create mode 100644 sysutils/wrapalixresetbutton/files/wrapresetbtn.c create mode 100644 sysutils/wrapalixresetbutton/pkg-descr diff --git a/sysutils/wrapalixresetbutton/Makefile b/sysutils/wrapalixresetbutton/Makefile new file mode 100644 index 000000000000..ac9b0ccf84ab --- /dev/null +++ b/sysutils/wrapalixresetbutton/Makefile @@ -0,0 +1,40 @@ +# $FreeBSD$ + +PORTNAME= wrapalixresetbutton +PORTVERSION= 0.0.6 +CATEGORIES= sysutils +MASTER_SITES= # empty +DISTFILES= # none +EXTRACT_ONLY= # empty + +MAINTAINER= garga@pfsense.org +COMMENT= Run various pfSense scripts on event + +PLIST_FILES= sbin/wrapresetbtn \ + sbin/alixresetbtn \ + sbin/FW7541resetbtn \ + sbin/APUresetbtn \ + sbin/RCC-VEresetbtn \ + sbin/RCC-DFFresetbtn + +ONLY_FOR_ARCHS= i386 amd64 + +do-extract: + ${MKDIR} ${WRKSRC} + +do-build: + ${CC} ${CFLAGS} -lpthread -o ${WRKSRC}/wrapresetbtn ${FILESDIR}/wrapresetbtn.c + ${CC} ${CFLAGS} -lpthread -o ${WRKSRC}/alixresetbtn ${FILESDIR}/alixresetbtn.c + ${CC} ${CFLAGS} -lpthread -o ${WRKSRC}/FW7541resetbtn ${FILESDIR}/FW7541resetbtn.c + ${CC} ${CFLAGS} -lpthread -o ${WRKSRC}/APUresetbtn ${FILESDIR}/APUresetbtn.c + ${CC} ${CFLAGS} -lpthread -o ${WRKSRC}/RCC-VEresetbtn ${FILESDIR}/RCC-VE.c + +do-install: + ${INSTALL_PROGRAM} ${WRKSRC}/wrapresetbtn ${STAGEDIR}${PREFIX}/sbin + ${INSTALL_PROGRAM} ${WRKSRC}/alixresetbtn ${STAGEDIR}${PREFIX}/sbin + ${INSTALL_PROGRAM} ${WRKSRC}/FW7541resetbtn ${STAGEDIR}${PREFIX}/sbin + ${INSTALL_PROGRAM} ${WRKSRC}/APUresetbtn ${STAGEDIR}${PREFIX}/sbin + ${INSTALL_PROGRAM} ${WRKSRC}/RCC-VEresetbtn ${STAGEDIR}${PREFIX}/sbin + ${LN} -sf RCC-VEresetbtn ${STAGEDIR}${PREFIX}/sbin/RCC-DFFresetbtn + +.include diff --git a/sysutils/wrapalixresetbutton/files/APUresetbtn.c b/sysutils/wrapalixresetbutton/files/APUresetbtn.c new file mode 100644 index 000000000000..e2d08a121c04 --- /dev/null +++ b/sysutils/wrapalixresetbutton/files/APUresetbtn.c @@ -0,0 +1,83 @@ +/* + Copyright (C) 2014 Ermal Luci + All rights reserved. + + 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. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``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. +*/ + +#include + +#include +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + int iofd, i; + u_char ch = 0; + + iofd = open("/dev/gpioapu", O_RDWR); + if (iofd == -1) { + perror("cannot open /dev/gpioapu"); + exit(1); + } + + /* check whether the switch S1 is pressed */ + read(iofd, &ch, sizeof(ch)); + if (ch == '1') { + /* nothing to do */ + exit(0); + } + + /* wait for 2 seconds and make sure that the switch is + pressed all the time */ + for (i = 0; i < 20; i++) { + usleep(100000); + read(iofd, &ch, sizeof(ch)); + if (ch == '1') { + /* switch was released too soon */ + exit(2); + } + } + + /* blink all three LEDs five times to indicate reset */ + for (i = 0; i < 5; i++) { + write(iofd, "111", strlen("111")); + usleep(300000); + write(iofd, "000", strlen("000")); + usleep(300000); + } + + /* restore normal LED state */ + write(iofd, "100", strlen("100")); + + close(iofd); + + /* return special code 99 to indicate factory defaults should be loaded */ + exit(99); + + /* NOTREACHED */ + return 0; +} diff --git a/sysutils/wrapalixresetbutton/files/FW7541resetbtn.c b/sysutils/wrapalixresetbutton/files/FW7541resetbtn.c new file mode 100644 index 000000000000..f86b4538f1e8 --- /dev/null +++ b/sysutils/wrapalixresetbutton/files/FW7541resetbtn.c @@ -0,0 +1,310 @@ +/* + Copyright (C) 2014 Ermal Luci + All rights reserved. + + 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. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``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. +*/ + +/******************************************************************************* + + btn_tst.c: main application for Lanner platform Software Button program + + Lanner Platform Miscellaneous Utility + Copyright(c) 2010 Lanner Electronics Inc. + All rights reserved. + + 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, + without modification. + 2. Redistributions in binary form must reproduce at minimum a disclaimer + similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any + redistribution must be conditioned upon including a substantially + similar Disclaimer requirement for further binary redistribution. + 3. Neither the names of the above-listed copyright holders nor the names + of any contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + Alternatively, this software may be distributed under the terms of the + GNU General Public License ("GPL") version 2 as published by the Free + Software Foundation. + + NO WARRANTY + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR 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 DAMAGES. + +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Platform Depend GPIOs for Status LEDs + */ + +/* + *------------------------------------------------------------------------------ + * MB-7541 Version V1.0 + * + * The IO interface for Status LED is connected to Winbond SIO 83627 GPIO 31 32 + * Refer to Winbond 83627 datasheet for details. + * The truth table is defined as below: + * GPIO31 GPIO32 LED_STATUS + * 0 0 OFF + * 0 1 Red + * 1 0 GREEN + * 1 1 OFF + *------------------------------------------------------------------------------ +*/ + +/* + * Device Depend Definition : Winbond 83627 SIO +*/ +#define INDEX_PORT 0x2E +#define DATA_PORT 0x2F + + +#define GPIO31_BIT (1 << 1) +#define GPIO32_BIT (1 << 2) +#define GPIO_GPIO31_GPIO32_MASK (GPIO31_BIT | GPIO32_BIT) +#define LED_OFF 0 +#define LED_RED GPIO32_BIT +#define LED_GREEN GPIO31_BIT + +/* + * Platform Depend GPIOs for Reset Button + */ + +/* + *------------------------------------------------------------------------------ + * MB-7541 Version V 0.1 + * + * The IO interface for Reset Button is connected to Intel ICH8-M GPIO 20. + * Refer to Intel ICH8-M datasheet for details. + * The high/low definition is as below: + * GPIO20 Button Status + * -------------------------- + * 1 Button Pressed + * 0 Button Released + *------------------------------------------------------------------------------ +*/ + +/* + * Device Depend Definition : Intel ICH8-M chipset +*/ +#define SB_GPIO_PORT_BASE 0x500 +#define SB_GPIO_PORT_USE_SEL 0x2 +#define SB_GPIO_PORT_IO_SEL 0x6 +#define SB_GPIO_PORT_OFFSET 0xE +#define SB_GPIO_PORT_REG SB_GPIO_PORT_BASE+SB_GPIO_PORT_OFFSET + +#define GPIO20_BIT (1 << 4) + +#define STATUS_BITMASK GPIO20_BIT +#define STATUS_PRESSED 0 +#define STATUS_RELEASED GPIO20_BIT + +/* + * Return value: + * 0: BUTTON Pressed + * 1: BUTTON Released + */ +static unsigned char +get_btn_status(void) +{ + return ( inb(SB_GPIO_PORT_REG) & STATUS_BITMASK); +} + +static void +enter_w83627_config(void) +{ + outb(INDEX_PORT, 0x87); // Must Do It Twice + outb(INDEX_PORT, 0x87); + return; +} + +static void +exit_w83627_config(void) +{ + outb(INDEX_PORT, 0xAA); + return; +} + +static unsigned char +read_w83627_reg(int LDN, int reg) +{ + unsigned char tmp = 0; + + enter_w83627_config(); + outb(INDEX_PORT, 0x07); // LDN Register + outb(DATA_PORT, LDN); // Select LDNx + outb(INDEX_PORT, reg); // Select Register + tmp = inb( DATA_PORT); // Read Register + exit_w83627_config(); + return tmp; +} + + +static void +write_w83627_reg(int LDN, int reg, int value) +{ + enter_w83627_config(); + outb(INDEX_PORT, 0x07); // LDN Register + outb(DATA_PORT, LDN); // Select LDNx + outb(INDEX_PORT, reg); // Select Register + outb(DATA_PORT, value); // Write Register + exit_w83627_config(); + return; +} + +static void +led_on() +{ + unsigned char tmp; + + tmp=read_w83627_reg(0x09, 0xF1); + tmp &= ~(GPIO_GPIO31_GPIO32_MASK); + tmp |= LED_GREEN; + write_w83627_reg(0x09, 0xF1, tmp); + + return; +} + +static void +led_off() +{ + unsigned char tmp; + + tmp = read_w83627_reg(0x09, 0xF1); + tmp &= ~(GPIO_GPIO31_GPIO32_MASK); + tmp |= LED_OFF; + write_w83627_reg(0x09, 0xF1, tmp); + + return; +} + +static void +sled_gpio_init(void) +{ + unsigned char tmp; + + /* set GP31/32 as Output function */ + tmp = read_w83627_reg(0x09, 0x30); + tmp |= 0x02; + write_w83627_reg(0x09, 0x30, tmp); + /* set GP31/32 as Output function */ + tmp=read_w83627_reg(0x09, 0xF0); + tmp &= ~(GPIO_GPIO31_GPIO32_MASK); + write_w83627_reg(0x09, 0xF0, tmp); + + return; +} + +static void +btn_gpio_init(void) +{ + unsigned char tmp; + /* platform initial code */ + + /* Reset button initial function */ + + /* select GPIO function */ + tmp= inb(SB_GPIO_PORT_BASE+SB_GPIO_PORT_USE_SEL); + tmp |= GPIO20_BIT; + outb(SB_GPIO_PORT_BASE+SB_GPIO_PORT_USE_SEL, tmp); + + /* set to input mode */ + tmp= inb(SB_GPIO_PORT_BASE+SB_GPIO_PORT_IO_SEL); + tmp |= GPIO20_BIT; + outb(SB_GPIO_PORT_BASE+SB_GPIO_PORT_IO_SEL, tmp); + + return; +} + +int +main(int argc, char *argv[]) +{ + int iofd, i; + + iofd = open("/dev/io", O_RDONLY); + if (iofd == -1) { + perror("cannot open /dev/io"); + exit(1); + } + + btn_gpio_init(); + + /* check whether the switch S1 is pressed */ + if (get_btn_status() != STATUS_PRESSED) { + /* nothing to do */ + exit(0); + } + + /* wait for 2 seconds and make sure that the switch is + pressed all the time */ + for (i = 0; i < 20; i++) { + usleep(100000); + if (get_btn_status() != STATUS_PRESSED) { + /* switch was released too soon */ + exit(2); + } + } + + sled_gpio_init(); + + /* blink all three LEDs five times to indicate reset */ + for (i = 0; i < 5; i++) { + led_on(); + usleep(300000); + led_off(); + usleep(300000); + } + + /* restore normal LED state */ + led_off(); + + close(iofd); + + /* return special code 99 to indicate factory defaults should be loaded */ + exit(99); + + /* NOTREACHED */ + return 0; +} diff --git a/sysutils/wrapalixresetbutton/files/RCC-VE.c b/sysutils/wrapalixresetbutton/files/RCC-VE.c new file mode 100644 index 000000000000..a473f255432e --- /dev/null +++ b/sysutils/wrapalixresetbutton/files/RCC-VE.c @@ -0,0 +1,156 @@ +/* + Copyright (C) 2015 Ermal LUÇI + All rights reserved. + + 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. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``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. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GPIOBASE 0x0500 +#define GPIO_SC_USE_SEL (GPIOBASE + 0x00) +#define GPIO_SC_IO_SEL (GPIOBASE + 0x04) +#define GPIO_SC_GP_LVL (GPIOBASE + 0x08) + +int switch_gpio = 11; +int led_gpio = 15; + +static int gpio_read(int reg, int gpio) { + int c; + + c = inl(reg); + if (c & (1 << gpio)) + return 1; + else + return 0; +} + +static void gpio_write(int reg, int gpio, int on) { + int c; + + c = inl(reg); + if (on) + c |= (1 << gpio); + else + c &= ~(1 << gpio); + outl(reg, c); +} + +static void led_on() { + gpio_write(GPIO_SC_GP_LVL, led_gpio, 1); +} + +static void led_off() { + gpio_write(GPIO_SC_GP_LVL, led_gpio, 0); +} + +static char is_switch_pressed() { + return (gpio_read(GPIO_SC_GP_LVL, switch_gpio) == 0); +} + +int main(int argc, char *argv[]) { + int iofd, i; + + iofd = open("/dev/io", O_RDONLY); + if (iofd == -1) { + perror("cannot open /dev/io"); + exit(1); + } + +#ifdef DEBUG + printf("GPIO_SC_USE_SEL: %x\n", inl(GPIO_SC_USE_SEL)); + printf("GPIO_SC_IO_SEL: %x\n", inl(GPIO_SC_IO_SEL)); + printf("SC_GP_LVL: %x\n", inl(GPIO_SC_GP_LVL)); +#endif + + /* Check if the pin is configured for GPIO */ + if (!gpio_read(GPIO_SC_USE_SEL, switch_gpio)) { + /* Enable it for GPIO */ + gpio_write(GPIO_SC_USE_SEL, switch_gpio, 1); + gpio_write(GPIO_SC_IO_SEL, switch_gpio, 1); +#ifdef DEBUG + printf("GPIO_SC_USE_SEL: %x\n", inl(GPIO_SC_USE_SEL)); + printf("GPIO_SC_IO_SEL: %x\n", inl(GPIO_SC_IO_SEL)); +#endif + } + + /* check whether the switch S1 is pressed */ + if (!is_switch_pressed()) { + /* Disable for GPIO */ + gpio_write(GPIO_SC_USE_SEL, switch_gpio, 0); + gpio_write(GPIO_SC_IO_SEL, switch_gpio, 0); +#ifdef DEBUG + printf("GPIO_SC_USE_SEL: %x\n", inl(GPIO_SC_USE_SEL)); + printf("GPIO_SC_IO_SEL: %x\n", inl(GPIO_SC_IO_SEL)); +#endif + + /* nothing to do */ + exit(0); + } + + /* wait for 2 seconds and make sure that the switch is + pressed all the time */ + for (i = 0; i < 20; i++) { + usleep(100000); + if (!is_switch_pressed()) { + /* switch was released too soon */ + exit(2); + } + } + + gpio_write(GPIO_SC_IO_SEL, led_gpio, 1); + /* blink all three LEDs five times to indicate reset */ + for (i = 0; i < 5; i++) { + led_on(); + usleep(300000); + led_off(); + usleep(300000); + } + + led_off(); + + /* Disable for GPIO */ + gpio_write(GPIO_SC_USE_SEL, switch_gpio, 0); + gpio_write(GPIO_SC_IO_SEL, switch_gpio, 0); + gpio_write(GPIO_SC_IO_SEL, led_gpio, 0); +#ifdef DEBUG + printf("GPIO_SC_USE_SEL: %x\n", inl(GPIO_SC_USE_SEL)); + printf("GPIO_SC_IO_SEL: %x\n", inl(GPIO_SC_IO_SEL)); +#endif + + close(iofd); + + /* return special code 99 to indicate factory defaults should be loaded */ + exit(99); + + return 0; +} diff --git a/sysutils/wrapalixresetbutton/files/alixresetbtn.c b/sysutils/wrapalixresetbutton/files/alixresetbtn.c new file mode 100644 index 000000000000..bd22baeff925 --- /dev/null +++ b/sysutils/wrapalixresetbutton/files/alixresetbtn.c @@ -0,0 +1,100 @@ +/* + $Id$ + part of m0n0wall (http://m0n0.ch/wall) + + Copyright (C) 2007 Manuel Kasper . + All rights reserved. + + 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. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``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. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* GPIO ports for LEDs */ +u_int32_t led_ports[3] = {0x6100, 0x6180, 0x6180}; +int led_bits[3] = {6, 9, 11}; +u_int32_t switch_port = 0x61b0; +int switch_bit = 8; + +void led_on(int i) { + outl(led_ports[i], 1 << (led_bits[i] + 16)); +} + +void led_off(int i) { + outl(led_ports[i], 1 << led_bits[i]); +} + +char is_switch_pressed() { + return ((inl(switch_port) & (1 << switch_bit)) == 0); +} + +int main(int argc, char *argv[]) { + + int iofd, i; + + iofd = open("/dev/io", O_RDONLY); + if (iofd == -1) { + perror("cannot open /dev/io"); + exit(1); + } + + /* check whether the switch S1 is pressed */ + if (!is_switch_pressed()) { + /* nothing to do */ + exit(0); + } + + /* wait for 2 seconds and make sure that the switch is + pressed all the time */ + for (i = 0; i < 20; i++) { + usleep(100000); + if (!is_switch_pressed()) { + /* switch was released too soon */ + exit(2); + } + } + + /* blink all three LEDs five times to indicate reset */ + for (i = 0; i < 5; i++) { + led_on(0); led_on(1); led_on(2); + usleep(300000); + led_off(0); led_off(1); led_off(2); + usleep(300000); + } + + /* restore normal LED state */ + led_on(0); + + close(iofd); + + /* return special code 99 to indicate factory defaults should be loaded */ + exit(99); + + return 0; +} diff --git a/sysutils/wrapalixresetbutton/files/wrapresetbtn.c b/sysutils/wrapalixresetbutton/files/wrapresetbtn.c new file mode 100644 index 000000000000..ad47ffe9bc2b --- /dev/null +++ b/sysutils/wrapalixresetbutton/files/wrapresetbtn.c @@ -0,0 +1,141 @@ +/* + $Id$ + part of m0n0wall (http://m0n0.ch/wall) + + Copyright (C) 2007 Manuel Kasper . + All rights reserved. + + 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. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``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. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GCBBASE 0x9000 +#define PMRADDR (GCBBASE + 0x30) +#define GPIOBASE 0xF400 +#define GPIO_SCSR (GPIOBASE + 0x20) +#define GPIO_SCAR (GPIOBASE + 0x24) + +/* GPIOs for LEDs */ +int led_gpio[3] = {2, 3, 18}; +int switch_gpio = 40; + +int gpio_read(int gpio) { + + u_int32_t offset = 0x04; + u_int32_t c; + + if (gpio >= 32) { + offset = 0x14; + gpio -= 32; + } + + c = inl(GPIOBASE + offset); + if (c & (1 << gpio)) + return 1; + else + return 0; +} + +void gpio_write(int gpio, int on) { + + u_int32_t offset = 0x00; + u_int32_t c; + + if (gpio >= 32) { + offset = 0x10; + gpio -= 32; + } + + c = inl(GPIOBASE + offset); + if (on) + c |= (1 << gpio); + else + c &= ~(1 << gpio); + outl(GPIOBASE + offset, c); +} + + +void led_on(int i) { + gpio_write(led_gpio[i], 0); +} + +void led_off(int i) { + gpio_write(led_gpio[i], 1); +} + +char is_switch_pressed() { + return (gpio_read(switch_gpio) == 0); +} + +int main(int argc, char *argv[]) { + + int iofd, i; + + iofd = open("/dev/io", O_RDONLY); + if (iofd == -1) { + perror("cannot open /dev/io"); + exit(1); + } + + /* check whether the switch S1 is pressed */ + if (!is_switch_pressed()) { + /* nothing to do */ + exit(0); + } + + /* wait for 2 seconds and make sure that the switch is + pressed all the time */ + for (i = 0; i < 20; i++) { + usleep(100000); + if (!is_switch_pressed()) { + /* switch was released too soon */ + exit(2); + } + } + + /* blink all three LEDs five times to indicate reset */ + for (i = 0; i < 5; i++) { + led_on(0); led_on(1); led_on(2); + usleep(300000); + led_off(0); led_off(1); led_off(2); + usleep(300000); + } + + /* restore normal LED state */ + led_on(0); + + close(iofd); + + /* return special code 99 to indicate factory defaults should be loaded */ + exit(99); + + return 0; +} diff --git a/sysutils/wrapalixresetbutton/pkg-descr b/sysutils/wrapalixresetbutton/pkg-descr new file mode 100644 index 000000000000..69e987411c05 --- /dev/null +++ b/sysutils/wrapalixresetbutton/pkg-descr @@ -0,0 +1 @@ +Daemon to detect button press on alix and wrap that spawns a config reset.