From 1437e590d75a23b57a5d613bf037bb1f07d082d5 Mon Sep 17 00:00:00 2001 From: utzig Date: Sat, 26 Jul 2014 13:26:47 +0000 Subject: [PATCH] [AVR] Add preliminary tickless support to HAL git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7101 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/ports/AVR/avr_timers.h | 7 ++ os/hal/ports/AVR/hal_lld.c | 48 ----------- os/hal/ports/AVR/hal_lld.h | 45 ---------- os/hal/ports/AVR/st_lld.c | 155 ++++++++++++++++++++++++++++++++++ os/hal/ports/AVR/st_lld.h | 29 +++++-- 5 files changed, 186 insertions(+), 98 deletions(-) diff --git a/os/hal/ports/AVR/avr_timers.h b/os/hal/ports/AVR/avr_timers.h index 26b891937..b0a137ddd 100644 --- a/os/hal/ports/AVR/avr_timers.h +++ b/os/hal/ports/AVR/avr_timers.h @@ -17,6 +17,13 @@ #ifndef _AVR_TIMERS_H_ #define _AVR_TIMERS_H_ +#include "mcuconf.h" + +#if ((NIL_CFG_ST_TIMEDELTA > 0 || CH_CFG_ST_TIMEDELTA > 0) && \ + (AVR_GPT_USE_TIM1 || AVR_PWM_USE_TIM1 || AVR_ICU_USE_TIM1)) + #error "Timer 1 cannot be used by drivers when running in tickless mode." +#endif + #if ((AVR_GPT_USE_TIM1 && AVR_PWM_USE_TIM1) || \ (AVR_GPT_USE_TIM1 && AVR_ICU_USE_TIM1) || \ (AVR_PWM_USE_TIM1 && AVR_ICU_USE_TIM1)) diff --git a/os/hal/ports/AVR/hal_lld.c b/os/hal/ports/AVR/hal_lld.c index 894d5dcc5..c3b90dd6b 100644 --- a/os/hal/ports/AVR/hal_lld.c +++ b/os/hal/ports/AVR/hal_lld.c @@ -40,21 +40,6 @@ /* Driver interrupt handlers. */ /*===========================================================================*/ -/** - * @brief Timer0 interrupt handler. - */ -OSAL_IRQ_HANDLER(AVR_TIMER_VECT) { - - OSAL_IRQ_PROLOGUE(); - - osalSysLockFromISR(); - osalOsTimerHandlerI(); - osalSysUnlockFromISR(); - - OSAL_IRQ_EPILOGUE(); -} - - /*===========================================================================*/ /* Driver exported functions. */ /*===========================================================================*/ @@ -65,39 +50,6 @@ OSAL_IRQ_HANDLER(AVR_TIMER_VECT) { * @notapi */ void hal_lld_init(void) { - - /* - * Timer 0 setup. - */ -#if defined(TCCR0B) /* Timer has multiple output comparators */ - TCCR0A = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM0A1) | (0 << COM0A0) | /* OC0A disabled. */ - (0 << COM0B1) | (0 << COM0B0); /* OC0B disabled. */ - TCCR0B = (0 << WGM02) | AVR_TIMER_PRESCALER_BITS; /* CTC mode. */ - OCR0A = AVR_TIMER_COUNTER - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR0 = (1 << OCF0A); /* Reset pending. */ - TIMSK0 = (1 << OCIE0A); /* IRQ on compare. */ - -#elif defined(TCCR0A) /* AT90CAN doesn't have TCCR0B and slightly different TCCR0A */ - TCCR0A = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM0A1) | (0 << COM0A0); /* OC0A disabled. */ - OCR0A = AVR_TIMER_COUNTER - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR0 = (1 << OCF0A); /* Reset pending. */ - TIMSK0 = (1 << OCIE0A); /* IRQ on compare. */ - -#elif defined(TCCR0) /* Timer has single output comparator */ - TCCR0 = (1 << WGM01) | (0 << WGM00) | /* CTC mode. */ - (0 << COM01) | (0 << COM00) | /* OC0A disabled. */ - AVR_TIMER_PRESCALER_BITS; - OCR0 = AVR_TIMER_COUNTER - 1; - TCNT0 = 0; /* Reset counter. */ - TIFR = (1 << OCF0); /* Reset pending. */ - TIMSK = (1 << OCIE0); /* IRQ on compare. */ -#else - #error "Neither TCCR0A nor TCCR0 registers are defined" -#endif } /** @} */ diff --git a/os/hal/ports/AVR/hal_lld.h b/os/hal/ports/AVR/hal_lld.h index c72063ac0..5685943f3 100644 --- a/os/hal/ports/AVR/hal_lld.h +++ b/os/hal/ports/AVR/hal_lld.h @@ -39,59 +39,14 @@ */ #define PLATFORM_NAME "AVR" -/** - * @brief Timer maximum value - */ -#define AVR_TIMER_COUNTER_MAX 255 - /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ -/* Work out what the timer interrupt is called on this MCU */ -#ifdef TIMER0_COMPA_vect - #define AVR_TIMER_VECT TIMER0_COMPA_vect -#elif defined(TIMER_COMPA_vect) - #define AVR_TIMER_VECT TIMER_COMPA_vect -#elif defined(TIMER0_COMP_vect) - #define AVR_TIMER_VECT TIMER0_COMP_vect -#else - #error "Cannot find interrupt vector name for timer" -#endif - /*===========================================================================*/ /* Derived constants and error checks. */ /*===========================================================================*/ -/* Find the most suitable prescaler setting for the desired OSAL_ST_FREQUENCY */ -#if ((F_CPU / OSAL_ST_FREQUENCY) <= AVR_TIMER_COUNTER_MAX) - #define AVR_TIMER_PRESCALER 1 - #define AVR_TIMER_PRESCALER_BITS (0<