From 7b1736c3495cf1271c218b27872ef77987e1f98d Mon Sep 17 00:00:00 2001 From: Theodore Ateba Date: Wed, 9 Aug 2017 20:10:29 +0000 Subject: Add AVR XMega system tick low level driver files. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10375 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/ports/AVR/XMEGA/LLD/TIMv1/driver.mk | 19 ++++ os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c | 105 +++++++++++++++++ os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.h | 157 ++++++++++++++++++++++++++ 3 files changed, 281 insertions(+) create mode 100644 os/hal/ports/AVR/XMEGA/LLD/TIMv1/driver.mk create mode 100644 os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c create mode 100644 os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.h (limited to 'os/hal/ports/AVR/XMEGA') diff --git a/os/hal/ports/AVR/XMEGA/LLD/TIMv1/driver.mk b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/driver.mk new file mode 100644 index 000000000..5e2fce138 --- /dev/null +++ b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/driver.mk @@ -0,0 +1,19 @@ +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c + +ifeq ($(USE_SMART_BUILD),yes) +ifneq ($(findstring HAL_USE_GPT TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_gpt_lld.c +endif +ifneq ($(findstring HAL_USE_ICU TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_icu_lld.c +endif +ifneq ($(findstring HAL_USE_PWM TRUE,$(HALCONF)),) +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_pwm_lld.c +endif +else +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_gpt_lld.c +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_icu_lld.c +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_pwm_lld.c +endif + +PLATFORMINC += $(CHIBIOS)/os/hal/ports/AVR/XMEGA/LLD/TIMv1 diff --git a/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c new file mode 100644 index 000000000..e8db98fb9 --- /dev/null +++ b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.c @@ -0,0 +1,105 @@ +/* + ChibiOS - Copyright (C) 2017 Theodore Ateba + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file TIMv1/hal_st_lld.c + * @brief AVR XMEGA ST subsystem low level driver source file. + * + * @addtogroup ST + * @{ + */ + +#include "hal.h" + +#if (OSAL_ST_MODE != OSAL_ST_MODE_NONE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +#if (OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) || defined(__DOXYGEN__) + +/** + * @brief Timer handler for periodic mode. + */ +OSAL_IRQ_HANDLER(TCC0_OVF_vect) { + + OSAL_IRQ_PROLOGUE(); + + osalSysLockFromISR(); + osalOsTimerHandlerI(); + osalSysUnlockFromISR(); + + OSAL_IRQ_EPILOGUE(); +} + +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ + +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) || defined(__DOXYGEN__) +/* TODO: Add the Handler of the freerunning mode. */ +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level ST driver initialization. + * + * @notapi + */ +void st_lld_init(void) { + +#if (OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC) || defined(__DOXYGEN__) + + TCC0.PER = (F_CPU/OSAL_ST_FREQUENCY) - 1; + TCC0.CTRLA = ( TCC0.CTRLA & ~TC0_CLKSEL_gm ) | TC_CLKSEL_DIV1_gc; + TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; + PMIC.CTRL |= PMIC_MEDLVLEN_bm; + sei(); + +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC */ + +#if (OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING) || defined(__DOXYGEN__) +/* TODO: Add freerunning mode for. */ +#endif /* OSAL_ST_MODE == OSAL_ST_MODE_FREERUNNING */ + +} + +#endif /* OSAL_ST_MODE != OSAL_ST_MODE_NONE */ + +/** @} */ + diff --git a/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.h b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.h new file mode 100644 index 000000000..5b40a3cbd --- /dev/null +++ b/os/hal/ports/AVR/XMEGA/LLD/TIMv1/hal_st_lld.h @@ -0,0 +1,157 @@ +/* + ChibiOS - Copyright (C) 2017 Theodore Ateba + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file TIMv1/hal_st_lld.h + * @brief AVR XMEGA ST Driver subsystem low level driver header file. + * @details This header is designed to be include-able without having to + * include other files from the HAL. + * + * @addtogroup AVR + * @{ + */ + +#ifndef HAL_ST_LLD_H +#define HAL_ST_LLD_H + +#include + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/* + * TODO: for models that have many timers, + * could add AVR_XMEGA_ST_USE_TIMER + */ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/* + * TODO: error checks for valid timer selected + */ + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void st_lld_init(void); +#ifdef __cplusplus +} +#endif + +#define TIFR_REG TCC0.INTFLAGS + +/*===========================================================================*/ +/* Driver inline functions. */ +/*===========================================================================*/ + +/** + * @brief Returns the time counter value. + * + * @return The counter value. + * + * @notapi + */ +static inline systime_t st_lld_get_counter(void) { + + return (systime_t) TCC0.CNT; +} + +/** + * @brief Starts the alarm. + * @note Makes sure that no spurious alarms are triggered after + * this call. + * + * @param[in] time the time to be set for the first alarm + * + * @notapi + */ +static inline void st_lld_start_alarm(systime_t time) { + + TCC0.INTCTRLA = ( TCC0.INTCTRLA & ~TC0_OVFINTLVL_gm ) | TC_OVFINTLVL_MED_gc; + PMIC.CTRL |= PMIC_MEDLVLEN_bm; +} + +/** + * @brief Stops the alarm interrupt. + * + * @notapi + */ +static inline void st_lld_stop_alarm(void) { + + /* TODO: Implement this function. */ +} + +/** + * @brief Sets the alarm time. + * + * @param[in] time the time to be set for the next alarm + * + * @notapi + */ +static inline void st_lld_set_alarm(systime_t time) { + + TCC0.PER = (uint16_t) time;; +} + +/** + * @brief Returns the current alarm time. + * + * @return The currently set alarm time. + * + * @notapi + */ +static inline systime_t st_lld_get_alarm(void) { + + return (systime_t)TCC0.PER; +} + +/** + * @brief Determines if the alarm is active. + * + * @return The alarm status. + * @retval false if the alarm is not active. + * @retval true is the alarm is active + * + * @notapi + */ +static inline bool st_lld_is_alarm_active(void) { + + /* TODO: Implement this function. */ + return (bool) 0; +} + +#endif /* HAL_ST_LLD_H */ + +/** @} */ -- cgit v1.2.3