diff --git a/cpu/avr/Makefile.avr b/cpu/avr/Makefile.avr index 26c6a9f02..0ad748b22 100644 --- a/cpu/avr/Makefile.avr +++ b/cpu/avr/Makefile.avr @@ -1,4 +1,4 @@ -# $Id: Makefile.avr,v 1.8 2007/11/23 06:22:52 fros4943 Exp $ +# $Id: Makefile.avr,v 1.9 2007/11/29 02:44:05 fros4943 Exp $ ### Check if we are running under Windows @@ -72,7 +72,7 @@ $(OBJECTDIR)/%.o: %.c $(OBJCOPY) $^ -O ihex $@ # Add a namelist to the kernel -%.out: %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a +%.out: %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a $(CONTIKI)/tools/make-empty-symbols $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LIBC) symbols.c ifdef SYMBOLS diff --git a/cpu/avr/rtimer-arch.c b/cpu/avr/rtimer-arch.c new file mode 100644 index 000000000..fd03878e3 --- /dev/null +++ b/cpu/avr/rtimer-arch.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science. + * 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 operating system. + * + * $Id: rtimer-arch.c,v 1.1 2007/11/29 02:44:05 fros4943 Exp $ + */ + +/** + * \file + * AVR-specific rtimer code + * \author + * Fredrik Osterlind + */ + +/* OBS: 8 seconds maximum time! */ + +#include +#include + +#include "lib/energest.h" +#include "sys/rtimer.h" +#include "rtimer-arch.h" + +/*---------------------------------------------------------------------------*/ +SIGNAL (SIG_OUTPUT_COMPARE3A) { + ENERGEST_ON(ENERGEST_TYPE_IRQ); + + ETIMSK &= ~((1 << OCIE3A) | (1 << OCIE3B) | (1 << TOIE3) | + (1 << TICIE3) | (1 << OCIE3C)); + + /* Call rtimer callback */ + rtimer_run_next(); + + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +void +rtimer_arch_init(void) +{ + /* Disable interrupts (store old state) */ + uint8_t sreg; + sreg = SREG; + cli (); + + ETIMSK &= ~((1 << OCIE3A) | (1 << OCIE3B) | (1 << TOIE3) | + (1 << TICIE3) | (1 << OCIE3C)); + ETIFR |= (1 << ICF3) | (1 << OCF3A) | (1 << OCF3B) | (1 << TOV3) | + (1 << OCF3C); + + /* Default timer behaviour */ + TCCR3A = 0; + TCCR3B = 0; + TCCR3C = 0; + + /* Reset counter */ + TCNT3 = 0; + + /* Maximum prescaler */ + TCCR3B |= 5; + + /* Restore interrupt state */ + SREG = sreg; +} +/*---------------------------------------------------------------------------*/ +void +rtimer_arch_schedule(rtimer_clock_t t) +{ + /* Disable interrupts (store old state) */ + uint8_t sreg; + sreg = SREG; + cli (); + + /* Set compare register */ + OCR3A = t; + ETIFR |= (1 << ICF3) | (1 << OCF3A) | (1 << OCF3B) | (1 << TOV3) | + (1 << OCF3C); + ETIMSK |= (1 << OCIE3A); + + /* Restore interrupt state */ + SREG = sreg; +} diff --git a/cpu/avr/rtimer-arch.h b/cpu/avr/rtimer-arch.h index 6c0d73b54..6f8886b17 100644 --- a/cpu/avr/rtimer-arch.h +++ b/cpu/avr/rtimer-arch.h @@ -1,6 +1,43 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science. + * 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 operating system. + * + * $Id: rtimer-arch.h,v 1.3 2007/11/29 02:44:05 fros4943 Exp $ + */ + #ifndef __RTIMER_ARCH_H__ #define __RTIMER_ARCH_H__ -#define RTIMER_ARCH_SECOND 1 /* TODO Implement? */ +#include + +#define RTIMER_ARCH_SECOND (8192) + +#define rtimer_arch_now() (TCNT3) #endif /* __RTIMER_ARCH_H__ */