diff --git a/core/dev/button-sensor.h b/core/dev/button-sensor.h index b05d80db9..34a51d7d5 100644 --- a/core/dev/button-sensor.h +++ b/core/dev/button-sensor.h @@ -35,6 +35,7 @@ #include "lib/sensors.h" extern const struct sensors_sensor button_sensor; +extern const struct sensors_sensor button_sensor2; #define BUTTON_SENSOR "Button" diff --git a/platform/econotag/Makefile.econotag b/platform/econotag/Makefile.econotag index 8e6939f9c..409fe5cc2 100644 --- a/platform/econotag/Makefile.econotag +++ b/platform/econotag/Makefile.econotag @@ -4,7 +4,7 @@ CONTIKI_TARGET_DIRS = . dev apps net CONTIKI_CORE = main CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o -CONTIKI_TARGET_SOURCEFILES += main.c clock.c button-sensor.c sensors.c slip.c platform_prints.c +CONTIKI_TARGET_SOURCEFILES += main.c clock.c button-sensor.c button-sensor2.c sensors.c slip.c platform_prints.c ${warning $(CONTIKI)} CONTIKIMC1322X=$(CONTIKI)/cpu/mc1322x diff --git a/platform/econotag/button-sensor.c b/platform/econotag/button-sensor.c index f89cd6544..cbd1e0fd8 100644 --- a/platform/econotag/button-sensor.c +++ b/platform/econotag/button-sensor.c @@ -68,6 +68,8 @@ configure(int type, int c) if(!status(SENSORS_ACTIVE)) { timer_set(&debouncetimer, 0); enable_irq_kbi(4); + kbi_edge(4); + enable_ext_wu(4); } } else { disable_irq_kbi(4); diff --git a/platform/econotag/button-sensor2.c b/platform/econotag/button-sensor2.c new file mode 100644 index 000000000..6552a94cb --- /dev/null +++ b/platform/econotag/button-sensor2.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2010, Mariano Alvira and other contributors + * to the MC1322x project (http://mc1322x.devl.org) and Contiki. + * + * 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. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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. + * + * This file is part of the Contiki OS. + * + * $Id: button-sensor.c,v 1.1 2010/06/09 14:46:30 maralvira Exp $ + */ + +#include "lib/sensors.h" +#include "dev/button-sensor.h" + +#include "mc1322x.h" + +#include + +const struct sensors_sensor button_sensor2; + +static struct timer debouncetimer; +static int status(int type); + +void kbi5_isr(void) { + if(timer_expired(&debouncetimer)) { + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&button_sensor2); + } + clear_kbi_evnt(5); +} + +static int +value(int type) +{ + return GPIO->DATA.GPIO_27 || !timer_expired(&debouncetimer); +} + +static int +configure(int type, int c) +{ + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + timer_set(&debouncetimer, 0); + enable_irq_kbi(5); + kbi_edge(5); + enable_ext_wu(5); + } + } else { + disable_irq_kbi(5); + } + return 1; + } + return 0; +} + +static int +status(int type) +{ + switch (type) { + case SENSORS_ACTIVE: + case SENSORS_READY: + return bit_is_set(*CRM_WU_CNTL, 21); /* check if kbi5 irq is enabled */ + } + return 0; +} + +SENSORS_SENSOR(button_sensor2, BUTTON_SENSOR, + value, configure, status); diff --git a/platform/econotag/main.c b/platform/econotag/main.c index 2f8cc27b1..a3218fdb0 100644 --- a/platform/econotag/main.c +++ b/platform/econotag/main.c @@ -50,7 +50,9 @@ /* econotag */ #include "platform_prints.h" -SENSORS(&button_sensor); +#ifndef OWN_SENSORS_DEFINITION +SENSORS(&button_sensor, &button_sensor2); +#endif #ifndef M12_CONF_SERIAL #define M12_SERIAL 0x000000