From 7c77845aa765b51b4026749bc4439bb100cc722a Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Sun, 18 Nov 2018 08:51:22 +0000 Subject: EXTI driver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@12432 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/hal/ports/STM32/LLD/EXTIv1/driver.mk | 2 + os/hal/ports/STM32/LLD/EXTIv1/notes.txt | 14 ++ os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c | 247 +++++++++++++++++++++++++++++ os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.h | 112 +++++++++++++ 4 files changed, 375 insertions(+) create mode 100644 os/hal/ports/STM32/LLD/EXTIv1/driver.mk create mode 100644 os/hal/ports/STM32/LLD/EXTIv1/notes.txt create mode 100644 os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c create mode 100644 os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.h (limited to 'os/hal/ports/STM32/LLD/EXTIv1') diff --git a/os/hal/ports/STM32/LLD/EXTIv1/driver.mk b/os/hal/ports/STM32/LLD/EXTIv1/driver.mk new file mode 100644 index 000000000..63016f9d7 --- /dev/null +++ b/os/hal/ports/STM32/LLD/EXTIv1/driver.mk @@ -0,0 +1,2 @@ +PLATFORMSRC += $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c +PLATFORMINC += $(CHIBIOS)/os/hal/ports/STM32/LLD/EXTIv1 diff --git a/os/hal/ports/STM32/LLD/EXTIv1/notes.txt b/os/hal/ports/STM32/LLD/EXTIv1/notes.txt new file mode 100644 index 000000000..bf6aefb7f --- /dev/null +++ b/os/hal/ports/STM32/LLD/EXTIv1/notes.txt @@ -0,0 +1,14 @@ +STM32 EXTIv1 driver. + +Driver capability: + +- Support for the EXTI peripheral. + +The file registry must export: + +STM32_EXTI_NUM_LINES - Number of EXTI lines, it can be between 0 and 63. +STM32_EXTI_IMR1_MASK - Mask of the fixed lines that must not be + handled by the driver (0..31). +STM32_EXTI_IMR2_MASK - Mask of the fixed lines that must not be + handled by the driver (32..63). + \ No newline at end of file diff --git a/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c b/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c new file mode 100644 index 000000000..cdf50408f --- /dev/null +++ b/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.c @@ -0,0 +1,247 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + 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 EXTIv1/stm32_exti.c + * @brief EXTI helper driver code. + * + * @addtogroup STM32_EXTI + * @details EXTI sharing helper driver. + * @{ + */ + +#include "hal.h" + +/* The following macro is only defined if some driver requiring EXTI services + has been enabled.*/ +#if defined(STM32_EXTI_REQUIRED) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/* Handling differences in ST headers.*/ +#if !defined(STM32L4XX) && !defined(STM32L4XXP) +#define EMR1 EMR +#define IMR1 IMR +#define PR1 PR +#define RTSR1 RTSR +#define FTSR1 FTSR +#endif + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief STM32 EXTI group 1 lines initialization. + * + * @param[in] mask mask of group 1 lines to be initialized + * @param[in] mode initialization mode + * + * @api + */ +void extiEnableGroup1(uint32_t mask, extimode_t mode) { + + /* Masked out lines must not be touched by this driver.*/ + osalDbgAssert((mask & STM32_EXTI_IMR1_MASK) == 0U, "fixed line"); + + if ((mode & EXTI_MODE_EDGES_MASK) == 0U) { + /* Disabling channels.*/ + EXTI->IMR1 &= ~mask; + EXTI->EMR1 &= ~mask; + EXTI->RTSR1 &= ~mask; + EXTI->FTSR1 &= ~mask; + EXTI->PR1 = mask; + } + else { + /* Programming edge registers.*/ + if (mode & EXTI_MODE_RISING_EDGE) { + EXTI->RTSR1 |= mask; + } + else { + EXTI->RTSR1 &= ~mask; + } + if (mode & EXTI_MODE_FALLING_EDGE) { + EXTI->FTSR1 |= mask; + } + else { + EXTI->FTSR1 &= ~mask; + } + + /* Programming interrupt and event registers.*/ + if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) { + EXTI->IMR1 |= mask; + EXTI->EMR1 &= ~mask; + } + else { + EXTI->EMR1 |= mask; + EXTI->IMR1 &= ~mask; + } + } +} + +#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__) +/** + * @brief STM32 EXTI group 2 lines initialization. + * + * @param[in] mask mask of group 2 lines to be initialized + * @param[in] mode initialization mode + * + * @api + */ +void extiEnableGroup2(uint32_t mask, extimode_t mode) { + + /* Masked out lines must not be touched by this driver.*/ + osalDbgAssert((mask & STM32_EXTI_IMR2_MASK) == 0U, "fixed line"); + + if ((mode & EXTI_MODE_EDGES_MASK) == 0U) { + /* Disabling channels.*/ + EXTI->IMR2 &= ~mask; + EXTI->EMR2 &= ~mask; + EXTI->RTSR2 &= ~mask; + EXTI->FTSR2 &= ~mask; + EXTI->PR2 = mask; + } + else { + /* Programming edge registers.*/ + if (mode & EXTI_MODE_RISING_EDGE) { + EXTI->RTSR2 |= mask; + } + else { + EXTI->RTSR2 &= ~mask; + } + if (mode & EXTI_MODE_FALLING_EDGE) { + EXTI->FTSR2 |= mask; + } + else { + EXTI->FTSR2 &= ~mask; + } + + /* Programming interrupt and event registers.*/ + if ((mode & EXTI_MODE_ACTION_MASK) == EXTI_MODE_ACTION_INTERRUPT) { + EXTI->IMR2 |= mask; + EXTI->EMR2 &= ~mask; + } + else { + EXTI->EMR2 |= mask; + EXTI->IMR2 &= ~mask; + } + } +} +#endif /* STM32_EXTI_NUM_LINES > 32 */ + +/** + * @brief STM32 EXTI line initialization. + * + * @param[in] line line to be initialized + * @param[in] mode initialization mode + * + * @api + */ +void extiEnableLine(extiline_t line, extimode_t mode) { + uint32_t mask = (1U << (line & 0x1FU)); + + osalDbgCheck(line < STM32_EXTI_NUM_LINES); + osalDbgCheck((mode & ~EXTI_MODE_MASK) == 0U); + +#if STM32_EXTI_NUM_LINES > 32 + if (line < 32) { +#endif + extiEnableGroup1(mask, mode); +#if STM32_EXTI_NUM_LINES > 32 + } + else { + extiEnableGroup2(mask, mode); + } +#endif +} + +/** + * @brief STM32 EXTI group 1 IRQ status clearing. + * + * @param[in] mask mask of group 1 lines to be initialized + * + * @api + */ +void extiClearGroup1(uint32_t mask) { + + /* Masked out lines must not be touched by this driver.*/ + osalDbgAssert((mask & STM32_EXTI_IMR1_MASK) == 0U, "fixed line"); + + EXTI->PR1 = mask; +} + +#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__) +/** + * @brief STM32 EXTI group 2 IRQ status clearing. + * + * @param[in] mask mask of group 2 lines to be initialized + * + * @api + */ +void extiClearGroup2(uint32_t mask) { + + /* Masked out lines must not be touched by this driver.*/ + osalDbgAssert((mask & STM32_EXTI_IMR2_MASK) == 0U, "fixed line"); + + EXTI->PR2 = mask; +} +#endif /* STM32_EXTI_NUM_LINES > 32 */ + +/** + * @brief STM32 EXTI line IRQ status clearing. + * + * @param[in] line line to be initialized + * + * @api + */ +void extiClearLine(extiline_t line) { + uint32_t mask = (1U << (line & 0x1FU)); + + osalDbgCheck(line < STM32_EXTI_NUM_LINES); + +#if STM32_EXTI_NUM_LINES > 32 + if (line < 32) { +#endif + extiClearGroup1(mask); +#if STM32_EXTI_NUM_LINES > 32 + } + else { + extiClearGroup2(mask); + } +#endif +} + +#endif /* STM32_EXTI_REQUIRED */ + +/** @} */ diff --git a/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.h b/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.h new file mode 100644 index 000000000..bd1f53222 --- /dev/null +++ b/os/hal/ports/STM32/LLD/EXTIv1/stm32_exti.h @@ -0,0 +1,112 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + 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 EXTIv1/stm32_exti.h + * @brief EXTI helper driver header. + * + * @addtogroup STM32_EXTI + * @{ + */ + +#ifndef STM32_EXTI_H +#define STM32_EXTI_H + +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @name EXTI channel modes + * @{ + */ +#define EXTI_MODE_MASK 7U /**< @brief Mode parameter mask. */ +#define EXTI_MODE_EDGES_MASK 3U /**< @brief Edges field mask. */ +#define EXTI_MODE_DISABLED 0U /**< @brief Channel disabled. */ +#define EXTI_MODE_RISING_EDGE 1U /**< @brief Rising edge callback. */ +#define EXTI_MODE_FALLING_EDGE 2U /**< @brief Falling edge callback. */ +#define EXTI_MODE_BOTH_EDGES 3U /**< @brief Both edges callback. */ +#define EXTI_MODE_ACTION_MASK 4U /**< @brief Action field mask. */ +#define EXTI_MODE_ACTION_INTERRUPT 0U /**< @brief Interrupt mode. */ +#define EXTI_MODE_ACTION_EVENT 4U /**< @brief Event mode. */ +/** @} */ + +/*===========================================================================*/ +/* Driver pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +#if !defined(STM32_EXTI_NUM_LINES) +#error "STM32_EXTI_NUM_LINES not defined in registry" +#endif + +#if (STM32_EXTI_NUM_LINES < 0) || (STM32_EXTI_NUM_LINES > 63) +#error "invalid STM32_EXTI_NUM_LINES value" +#endif + +#if !defined(STM32_EXTI_IMR1_MASK) +#error "STM32_EXTI_IMR1_MASK not defined in registry" +#endif + +#if STM32_EXTI_NUM_LINES > 32 +#if !defined(STM32_EXTI_IMR2_MASK) +#error "STM32_EXTI_IMR2_MASK not defined in registry" +#endif +#endif + +/*===========================================================================*/ +/* Driver data structures and types. */ +/*===========================================================================*/ + +/** + * @brief Type of an EXTI line identifier. + */ +typedef uint32_t extiline_t; + +/** + * @brief Type of an EXTI line mode. + */ +typedef uint32_t extimode_t; + +/*===========================================================================*/ +/* Driver macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + void extiEnableGroup1(uint32_t mask, extimode_t mode); + void extiClearGroup1(uint32_t mask); +#if (STM32_EXTI_NUM_LINES > 32) || defined(__DOXYGEN__) + void extiEnableGroup2(uint32_t mask, extimode_t mode); + void extiClearGroup2(uint32_t mask); +#endif /* STM32_EXTI_NUM_LINES > 32 */ + void extiEnableLine(extiline_t line, extimode_t mode); + void extiClearLine(extiline_t line); + #ifdef __cplusplus +} +#endif + +#endif /* STM32_EXTI_H */ + +/** @} */ -- cgit v1.2.3