aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/ports/KINETIS/LLD/ext_lld.c
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal/ports/KINETIS/LLD/ext_lld.c')
-rw-r--r--os/hal/ports/KINETIS/LLD/ext_lld.c718
1 files changed, 359 insertions, 359 deletions
diff --git a/os/hal/ports/KINETIS/LLD/ext_lld.c b/os/hal/ports/KINETIS/LLD/ext_lld.c
index 2e331d0be..5e2ae19e0 100644
--- a/os/hal/ports/KINETIS/LLD/ext_lld.c
+++ b/os/hal/ports/KINETIS/LLD/ext_lld.c
@@ -1,359 +1,359 @@
-/*
- ChibiOS/HAL - Copyright (C) 2014 Derek Mulcahy
-
- 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 KINETIS/LLD/ext_lld.c
- * @brief KINETIS EXT subsystem low level driver source.
- *
- * @addtogroup EXT
- * @{
- */
-
-#include "hal.h"
-
-#if HAL_USE_EXT || defined(__DOXYGEN__)
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-#define PCR_IRQC_DISABLED 0x0
-#define PCR_IRQC_DMA_RISING_EDGE 0x1
-#define PCR_IRQC_DMA_FALLING_EDGE 0x2
-#define PCR_IRQC_DMA_EITHER_EDGE 0x3
-
-#define PCR_IRQC_LOGIC_ZERO 0x8
-#define PCR_IRQC_RISING_EDGE 0x9
-#define PCR_IRQC_FALLING_EDGE 0xA
-#define PCR_IRQC_EITHER_EDGE 0xB
-#define PCR_IRQC_LOGIC_ONE 0xC
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/**
- * @brief EXTD1 driver identifier.
- */
-EXTDriver EXTD1;
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/* A channel map for each channel.
- *
- * The index is the pin number.
- * The result is the channel for that pin.
- */
-#if KINETIS_EXT_PORTA_WIDTH > 0
-uint8_t porta_channel_map[KINETIS_EXT_PORTA_WIDTH];
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
-uint8_t portb_channel_map[KINETIS_EXT_PORTB_WIDTH];
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
-uint8_t portc_channel_map[KINETIS_EXT_PORTC_WIDTH];
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
-uint8_t portd_channel_map[KINETIS_EXT_PORTD_WIDTH];
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
-uint8_t porte_channel_map[KINETIS_EXT_PORTE_WIDTH];
-#endif
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-/**
- * @brief Enables EXTI IRQ sources.
- *
- * @notapi
- */
-static void ext_lld_exti_irq_enable(void) {
-
-#if KINETIS_EXT_PORTA_WIDTH > 0
- nvicEnableVector(PINA_IRQn, KINETIS_EXT_PORTA_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- nvicEnableVector(PINB_IRQn, KINETIS_EXT_PORTB_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- nvicEnableVector(PINC_IRQn, KINETIS_EXT_PORTC_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- nvicEnableVector(PIND_IRQn, KINETIS_EXT_PORTD_IRQ_PRIORITY);
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- nvicEnableVector(PINE_IRQn, KINETIS_EXT_PORTE_IRQ_PRIORITY);
-#endif
-}
-
-/**
- * @brief Disables EXTI IRQ sources.
- *
- * @notapi
- */
-static void ext_lld_exti_irq_disable(void) {
-
-#if KINETIS_EXT_PORTA_WIDTH > 0
- nvicDisableVector(PINA_IRQn);
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- nvicDisableVector(PINB_IRQn);
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- nvicDisableVector(PINC_IRQn);
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- nvicDisableVector(PIND_IRQn);
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- nvicDisableVector(PINE_IRQn);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*
- * Generic interrupt handler.
- */
-static inline void irq_handler(PORT_TypeDef * const port, const unsigned port_width, const uint8_t *channel_map) {
- uint32_t isfr = port->ISFR;
-
- /* Clear all pending interrupts on this port. */
- port->ISFR = 0xFFFFFFFF;
-
- for (unsigned pin = 0; pin < port_width; pin++) {
- if (isfr & (1 << pin)) {
- expchannel_t channel = channel_map[pin];
- EXTD1.config->channels[channel].cb(&EXTD1, channel);
- }
- }
-}
-
-/**
- * @brief PORTA interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTA_IRQ_VECTOR) && KINETIS_EXT_PORTA_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTA, KINETIS_EXT_PORTA_WIDTH, porta_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTA_WIDTH > 0 */
-
-/**
- * @brief PORTB interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTB_IRQ_VECTOR) && KINETIS_EXT_PORTB_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTB, KINETIS_EXT_PORTB_WIDTH, portb_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTB_WIDTH > 0 */
-
-/**
- * @brief PORTC interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTC_IRQ_VECTOR) && KINETIS_EXT_PORTC_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTC, KINETIS_EXT_PORTC_WIDTH, portc_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTC_WIDTH > 0 */
-
-/**
- * @brief PORTD interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTD_IRQ_VECTOR) && KINETIS_EXT_PORTD_WIDTH > 0
-OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTD, KINETIS_EXT_PORTD_WIDTH, portd_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTD_WIDTH > 0 */
-
-/**
- * @brief PORTE interrupt handler.
- *
- * @isr
- */
-#if defined(KINETIS_PORTE_IRQ_VECTOR) && KINETIS_EXT_PORTE_WIDTH > 0
-CH_IRQ_HANDLER(KINETIS_PORTE_IRQ_VECTOR) {
- OSAL_IRQ_PROLOGUE();
-
- irq_handler(PORTE, KINETIS_EXT_PORTE_WIDTH, porte_channel_map);
-
- OSAL_IRQ_EPILOGUE();
-}
-#endif /* KINETIS_EXT_PORTE_WIDTH > 0 */
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Low level EXT driver initialization.
- *
- * @notapi
- */
-void ext_lld_init(void) {
-
- /* Driver initialization.*/
- extObjectInit(&EXTD1);
-}
-
-/**
- * @brief Configures and activates the EXT peripheral.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- *
- * @notapi
- */
-void ext_lld_start(EXTDriver *extp) {
-
- if (extp->state == EXT_STOP)
- ext_lld_exti_irq_enable();
-
- /* Configuration of automatic channels.*/
- for (expchannel_t channel = 0; channel < EXT_MAX_CHANNELS; channel++) {
-
- uint32_t mode = extp->config->channels[channel].mode;
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
-
- /* Initialize the channel map */
-#if KINETIS_EXT_PORTA_WIDTH > 0
- if (port == PORTA)
- porta_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTB_WIDTH > 0
- if (port == PORTB)
- portb_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTC_WIDTH > 0
- if (port == PORTC)
- portc_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTD_WIDTH > 0
- if (port == PORTD)
- portd_channel_map[pin] = channel;
- else
-#endif
-#if KINETIS_EXT_PORTE_WIDTH > 0
- if (port == PORTE)
- porte_channel_map[pin] = channel;
- else
-#endif
- {}
-
- if (mode & EXT_CH_MODE_AUTOSTART)
- ext_lld_channel_enable(extp, channel);
- else if (port != NULL)
- ext_lld_channel_disable(extp, channel);
- }
-}
-
-/**
- * @brief Deactivates the EXT peripheral.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- *
- * @notapi
- */
-void ext_lld_stop(EXTDriver *extp) {
-
- if (extp->state == EXT_ACTIVE)
- ext_lld_exti_irq_disable();
-}
-
-/**
- * @brief Enables an EXT channel.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- * @param[in] channel channel to be enabled
- *
- * @notapi
- */
-void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) {
-
- uint32_t irqc;
- uint32_t mode = extp->config->channels[channel].mode;
- if (mode & EXT_CH_MODE_RISING_EDGE)
- irqc = PCR_IRQC_RISING_EDGE;
- else if (extp->config->channels[channel].mode & EXT_CH_MODE_FALLING_EDGE)
- irqc = PCR_IRQC_FALLING_EDGE;
- else if (extp->config->channels[channel].mode & EXT_CH_MODE_BOTH_EDGES)
- irqc = PCR_IRQC_EITHER_EDGE;
- else
- irqc = PCR_IRQC_DISABLED;
-
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
-
- uint32_t pcr = port->PCR[pin];
-
- /* Clear all the IRQC bits */
- pcr &= ~PORTx_PCRn_IRQC_MASK;
- /* Set the required IRQC bits */
- pcr |= PORTx_PCRn_IRQC(irqc);
-
- port->PCR[pin] = pcr;
-}
-
-/**
- * @brief Disables an EXT channel.
- *
- * @param[in] extp pointer to the @p EXTDriver object
- * @param[in] channel channel to be disabled
- *
- * @notapi
- */
-void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) {
-
- PORT_TypeDef *port = extp->config->channels[channel].port;
- uint32_t pin = extp->config->channels[channel].pin;
- port->PCR[pin] |= PORTx_PCRn_IRQC(PCR_IRQC_DISABLED);
-}
-
-#endif /* HAL_USE_EXT */
-
-/** @} */
+/*
+ ChibiOS - Copyright (C) 2006..2015 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 KINETIS/LLD/ext_lld.c
+ * @brief KINETIS EXT subsystem low level driver source.
+ *
+ * @addtogroup EXT
+ * @{
+ */
+
+#include "hal.h"
+
+#if HAL_USE_EXT || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Driver local definitions. */
+/*===========================================================================*/
+
+#define PCR_IRQC_DISABLED 0x0
+#define PCR_IRQC_DMA_RISING_EDGE 0x1
+#define PCR_IRQC_DMA_FALLING_EDGE 0x2
+#define PCR_IRQC_DMA_EITHER_EDGE 0x3
+
+#define PCR_IRQC_LOGIC_ZERO 0x8
+#define PCR_IRQC_RISING_EDGE 0x9
+#define PCR_IRQC_FALLING_EDGE 0xA
+#define PCR_IRQC_EITHER_EDGE 0xB
+#define PCR_IRQC_LOGIC_ONE 0xC
+
+/*===========================================================================*/
+/* Driver exported variables. */
+/*===========================================================================*/
+
+/**
+ * @brief EXTD1 driver identifier.
+ */
+EXTDriver EXTD1;
+
+/*===========================================================================*/
+/* Driver local variables and types. */
+/*===========================================================================*/
+
+/* A channel map for each channel.
+ *
+ * The index is the pin number.
+ * The result is the channel for that pin.
+ */
+#if KINETIS_EXT_PORTA_WIDTH > 0
+uint8_t porta_channel_map[KINETIS_EXT_PORTA_WIDTH];
+#endif
+#if KINETIS_EXT_PORTB_WIDTH > 0
+uint8_t portb_channel_map[KINETIS_EXT_PORTB_WIDTH];
+#endif
+#if KINETIS_EXT_PORTC_WIDTH > 0
+uint8_t portc_channel_map[KINETIS_EXT_PORTC_WIDTH];
+#endif
+#if KINETIS_EXT_PORTD_WIDTH > 0
+uint8_t portd_channel_map[KINETIS_EXT_PORTD_WIDTH];
+#endif
+#if KINETIS_EXT_PORTE_WIDTH > 0
+uint8_t porte_channel_map[KINETIS_EXT_PORTE_WIDTH];
+#endif
+
+/*===========================================================================*/
+/* Driver local functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables EXTI IRQ sources.
+ *
+ * @notapi
+ */
+static void ext_lld_exti_irq_enable(void) {
+
+#if KINETIS_EXT_PORTA_WIDTH > 0
+ nvicEnableVector(PINA_IRQn, KINETIS_EXT_PORTA_IRQ_PRIORITY);
+#endif
+#if KINETIS_EXT_PORTB_WIDTH > 0
+ nvicEnableVector(PINB_IRQn, KINETIS_EXT_PORTB_IRQ_PRIORITY);
+#endif
+#if KINETIS_EXT_PORTC_WIDTH > 0
+ nvicEnableVector(PINC_IRQn, KINETIS_EXT_PORTC_IRQ_PRIORITY);
+#endif
+#if KINETIS_EXT_PORTD_WIDTH > 0
+ nvicEnableVector(PIND_IRQn, KINETIS_EXT_PORTD_IRQ_PRIORITY);
+#endif
+#if KINETIS_EXT_PORTE_WIDTH > 0
+ nvicEnableVector(PINE_IRQn, KINETIS_EXT_PORTE_IRQ_PRIORITY);
+#endif
+}
+
+/**
+ * @brief Disables EXTI IRQ sources.
+ *
+ * @notapi
+ */
+static void ext_lld_exti_irq_disable(void) {
+
+#if KINETIS_EXT_PORTA_WIDTH > 0
+ nvicDisableVector(PINA_IRQn);
+#endif
+#if KINETIS_EXT_PORTB_WIDTH > 0
+ nvicDisableVector(PINB_IRQn);
+#endif
+#if KINETIS_EXT_PORTC_WIDTH > 0
+ nvicDisableVector(PINC_IRQn);
+#endif
+#if KINETIS_EXT_PORTD_WIDTH > 0
+ nvicDisableVector(PIND_IRQn);
+#endif
+#if KINETIS_EXT_PORTE_WIDTH > 0
+ nvicDisableVector(PINE_IRQn);
+#endif
+}
+
+/*===========================================================================*/
+/* Driver interrupt handlers. */
+/*===========================================================================*/
+
+/*
+ * Generic interrupt handler.
+ */
+static inline void irq_handler(PORT_TypeDef * const port, const unsigned port_width, const uint8_t *channel_map) {
+ uint32_t isfr = port->ISFR;
+
+ /* Clear all pending interrupts on this port. */
+ port->ISFR = 0xFFFFFFFF;
+
+ for (unsigned pin = 0; pin < port_width; pin++) {
+ if (isfr & (1 << pin)) {
+ expchannel_t channel = channel_map[pin];
+ EXTD1.config->channels[channel].cb(&EXTD1, channel);
+ }
+ }
+}
+
+/**
+ * @brief PORTA interrupt handler.
+ *
+ * @isr
+ */
+#if defined(KINETIS_PORTA_IRQ_VECTOR) && KINETIS_EXT_PORTA_WIDTH > 0
+OSAL_IRQ_HANDLER(KINETIS_PORTA_IRQ_VECTOR) {
+ OSAL_IRQ_PROLOGUE();
+
+ irq_handler(PORTA, KINETIS_EXT_PORTA_WIDTH, porta_channel_map);
+
+ OSAL_IRQ_EPILOGUE();
+}
+#endif /* KINETIS_EXT_PORTA_WIDTH > 0 */
+
+/**
+ * @brief PORTB interrupt handler.
+ *
+ * @isr
+ */
+#if defined(KINETIS_PORTB_IRQ_VECTOR) && KINETIS_EXT_PORTB_WIDTH > 0
+OSAL_IRQ_HANDLER(KINETIS_PORTB_IRQ_VECTOR) {
+ OSAL_IRQ_PROLOGUE();
+
+ irq_handler(PORTB, KINETIS_EXT_PORTB_WIDTH, portb_channel_map);
+
+ OSAL_IRQ_EPILOGUE();
+}
+#endif /* KINETIS_EXT_PORTB_WIDTH > 0 */
+
+/**
+ * @brief PORTC interrupt handler.
+ *
+ * @isr
+ */
+#if defined(KINETIS_PORTC_IRQ_VECTOR) && KINETIS_EXT_PORTC_WIDTH > 0
+OSAL_IRQ_HANDLER(KINETIS_PORTC_IRQ_VECTOR) {
+ OSAL_IRQ_PROLOGUE();
+
+ irq_handler(PORTC, KINETIS_EXT_PORTC_WIDTH, portc_channel_map);
+
+ OSAL_IRQ_EPILOGUE();
+}
+#endif /* KINETIS_EXT_PORTC_WIDTH > 0 */
+
+/**
+ * @brief PORTD interrupt handler.
+ *
+ * @isr
+ */
+#if defined(KINETIS_PORTD_IRQ_VECTOR) && KINETIS_EXT_PORTD_WIDTH > 0
+OSAL_IRQ_HANDLER(KINETIS_PORTD_IRQ_VECTOR) {
+ OSAL_IRQ_PROLOGUE();
+
+ irq_handler(PORTD, KINETIS_EXT_PORTD_WIDTH, portd_channel_map);
+
+ OSAL_IRQ_EPILOGUE();
+}
+#endif /* KINETIS_EXT_PORTD_WIDTH > 0 */
+
+/**
+ * @brief PORTE interrupt handler.
+ *
+ * @isr
+ */
+#if defined(KINETIS_PORTE_IRQ_VECTOR) && KINETIS_EXT_PORTE_WIDTH > 0
+CH_IRQ_HANDLER(KINETIS_PORTE_IRQ_VECTOR) {
+ OSAL_IRQ_PROLOGUE();
+
+ irq_handler(PORTE, KINETIS_EXT_PORTE_WIDTH, porte_channel_map);
+
+ OSAL_IRQ_EPILOGUE();
+}
+#endif /* KINETIS_EXT_PORTE_WIDTH > 0 */
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Low level EXT driver initialization.
+ *
+ * @notapi
+ */
+void ext_lld_init(void) {
+
+ /* Driver initialization.*/
+ extObjectInit(&EXTD1);
+}
+
+/**
+ * @brief Configures and activates the EXT peripheral.
+ *
+ * @param[in] extp pointer to the @p EXTDriver object
+ *
+ * @notapi
+ */
+void ext_lld_start(EXTDriver *extp) {
+
+ if (extp->state == EXT_STOP)
+ ext_lld_exti_irq_enable();
+
+ /* Configuration of automatic channels.*/
+ for (expchannel_t channel = 0; channel < EXT_MAX_CHANNELS; channel++) {
+
+ uint32_t mode = extp->config->channels[channel].mode;
+ PORT_TypeDef *port = extp->config->channels[channel].port;
+ uint32_t pin = extp->config->channels[channel].pin;
+
+ /* Initialize the channel map */
+#if KINETIS_EXT_PORTA_WIDTH > 0
+ if (port == PORTA)
+ porta_channel_map[pin] = channel;
+ else
+#endif
+#if KINETIS_EXT_PORTB_WIDTH > 0
+ if (port == PORTB)
+ portb_channel_map[pin] = channel;
+ else
+#endif
+#if KINETIS_EXT_PORTC_WIDTH > 0
+ if (port == PORTC)
+ portc_channel_map[pin] = channel;
+ else
+#endif
+#if KINETIS_EXT_PORTD_WIDTH > 0
+ if (port == PORTD)
+ portd_channel_map[pin] = channel;
+ else
+#endif
+#if KINETIS_EXT_PORTE_WIDTH > 0
+ if (port == PORTE)
+ porte_channel_map[pin] = channel;
+ else
+#endif
+ {}
+
+ if (mode & EXT_CH_MODE_AUTOSTART)
+ ext_lld_channel_enable(extp, channel);
+ else if (port != NULL)
+ ext_lld_channel_disable(extp, channel);
+ }
+}
+
+/**
+ * @brief Deactivates the EXT peripheral.
+ *
+ * @param[in] extp pointer to the @p EXTDriver object
+ *
+ * @notapi
+ */
+void ext_lld_stop(EXTDriver *extp) {
+
+ if (extp->state == EXT_ACTIVE)
+ ext_lld_exti_irq_disable();
+}
+
+/**
+ * @brief Enables an EXT channel.
+ *
+ * @param[in] extp pointer to the @p EXTDriver object
+ * @param[in] channel channel to be enabled
+ *
+ * @notapi
+ */
+void ext_lld_channel_enable(EXTDriver *extp, expchannel_t channel) {
+
+ uint32_t irqc;
+ uint32_t mode = extp->config->channels[channel].mode;
+ if (mode & EXT_CH_MODE_RISING_EDGE)
+ irqc = PCR_IRQC_RISING_EDGE;
+ else if (extp->config->channels[channel].mode & EXT_CH_MODE_FALLING_EDGE)
+ irqc = PCR_IRQC_FALLING_EDGE;
+ else if (extp->config->channels[channel].mode & EXT_CH_MODE_BOTH_EDGES)
+ irqc = PCR_IRQC_EITHER_EDGE;
+ else
+ irqc = PCR_IRQC_DISABLED;
+
+ PORT_TypeDef *port = extp->config->channels[channel].port;
+ uint32_t pin = extp->config->channels[channel].pin;
+
+ uint32_t pcr = port->PCR[pin];
+
+ /* Clear all the IRQC bits */
+ pcr &= ~PORTx_PCRn_IRQC_MASK;
+ /* Set the required IRQC bits */
+ pcr |= PORTx_PCRn_IRQC(irqc);
+
+ port->PCR[pin] = pcr;
+}
+
+/**
+ * @brief Disables an EXT channel.
+ *
+ * @param[in] extp pointer to the @p EXTDriver object
+ * @param[in] channel channel to be disabled
+ *
+ * @notapi
+ */
+void ext_lld_channel_disable(EXTDriver *extp, expchannel_t channel) {
+
+ PORT_TypeDef *port = extp->config->channels[channel].port;
+ uint32_t pin = extp->config->channels[channel].pin;
+ port->PCR[pin] |= PORTx_PCRn_IRQC(PCR_IRQC_DISABLED);
+}
+
+#endif /* HAL_USE_EXT */
+
+/** @} */