diff --git a/cpu/cc253x/Makefile.cc253x b/cpu/cc253x/Makefile.cc253x index fb7a718dd..654647834 100644 --- a/cpu/cc253x/Makefile.cc253x +++ b/cpu/cc253x/Makefile.cc253x @@ -106,6 +106,7 @@ CONTIKI_SOURCEFILES += uart0.c uart1.c uart-intr.c CONTIKI_SOURCEFILES += dma.c dma_intr.c CONTIKI_SOURCEFILES += cc2530-rf.c CONTIKI_SOURCEFILES += watchdog.c rtimer-arch.c +CONTIKI_SOURCEFILES += p2-intr.c CONTIKI_ASMFILES += CONTIKI_ASMOBJECTFILES = $(addprefix $(OBJECTDIR)/,$(CONTIKI_ASMFILES:.S=.rel)) diff --git a/cpu/cc253x/dev/p2-intr.c b/cpu/cc253x/dev/p2-intr.c new file mode 100644 index 000000000..ea8097d03 --- /dev/null +++ b/cpu/cc253x/dev/p2-intr.c @@ -0,0 +1,95 @@ +/* +Copyright (c) 2012, Philippe Retornaz +Copyright (c) 2012, EPFL STI IMT LSRO1 -- Mobots group +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. 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. +*/ + +#include "cc253x.h" +#include "p2-intr.h" + +static struct cc253x_p2_handler *handlers = NULL; + +void +cc253x_p2_int(void) __interrupt(P2INT_VECTOR) +{ + struct cc253x_p2_handler *h; + uint8_t handled = 0; + + for(h = handlers; h != NULL; h = h->next) { + handled |= h->cb(); + } + + if(handled) { + P2IF = 0; + } +} + +void +cc253x_p2_register_handler(struct cc253x_p2_handler *h) +{ + uint8_t flags; + + if(!h) { + return; + } + + cc253x_p2_irq_disable(flags); + + h->next = handlers; + handlers = h; + + cc253x_p2_irq_enable(flags); +} + +void +cc253x_p2_unregister_handler(struct cc253x_p2_handler *remove) +{ + uint8_t flags; + struct cc253x_p2_handler *h = handlers; + + // Protect against dumb users + if(!h || !remove) { + return; + } + + cc253x_p2_irq_disable(flags); + + if(h == remove) { + // First element in the list + handlers = h->next; + } else { + while(h->next) { + if(h->next == remove) { + h->next = h->next->next; + break; + } + h = h->next; + } + } + + cc253x_p2_irq_enable(flags); +} diff --git a/cpu/cc253x/dev/p2-intr.h b/cpu/cc253x/dev/p2-intr.h new file mode 100644 index 000000000..f29edcc1b --- /dev/null +++ b/cpu/cc253x/dev/p2-intr.h @@ -0,0 +1,55 @@ +/* +Copyright (c) 2012, Philippe Retornaz +Copyright (c) 2012, EPFL STI IMT LSRO1 -- Mobots group +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. 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. +*/ + +#ifndef __CC253x_P2_INTR_H__ +#define __CC253x_P2_INTR_H__ + +#include "contiki.h" + +#define CC253x_P2_ACK 0x1 +#define CC253x_P2_NACK 0x0 + +struct cc253x_p2_handler { + struct cc253x_p2_handler *next; + uint8_t (*cb) (void); +}; + +void cc253x_p2_register_handler(struct cc253x_p2_handler *h); + +void cc253x_p2_unregister_handler(struct cc253x_p2_handler *h); + +void cc253x_p2_int(void) __interrupt(P2INT_VECTOR); + +#define cc253x_p2_irq_disable(flag) do { flag = IEN2 & 0x2; IEN2 &= ~0x2; } while(0) +#define cc253x_p2_irq_enable(flag) do { IEN2 |= flag; } while(0) + +#define cc253x_p2_irq_force_enable() cc253x_p2_irq_enable(0x2) + +#endif diff --git a/platform/cc2530dk/contiki-main.c b/platform/cc2530dk/contiki-main.c index 8c31c97d8..5571db6a0 100644 --- a/platform/cc2530dk/contiki-main.c +++ b/platform/cc2530dk/contiki-main.c @@ -11,6 +11,7 @@ #include "dev/cc2530-rf.h" #include "dev/watchdog.h" #include "dev/clock-isr.h" +#include "dev/p2-intr.h" #include "dev/lpm.h" #include "dev/button-sensor.h" #include "dev/adc-sensor.h"