/* Copyright (C) 2014..2016 Marco Veeneman 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 Tiva/ext_lld.c * @brief Tiva EXT subsystem low level driver source. * * @addtogroup EXT * @{ */ #include "hal.h" #if HAL_USE_EXT || defined(__DOXYGEN__) /*===========================================================================*/ /* Driver local definitions. */ /*===========================================================================*/ /** * @brief Generic interrupt serving code for multiple pins per interrupt * handler. */ #define ext_lld_serve_port_interrupt(gpio, start) \ do { \ uint32_t mis = HWREG(gpio + GPIO_O_MIS); \ \ HWREG(gpio + GPIO_O_ICR) = mis; \ \ if (mis & (1 << 0)) { \ EXTD1.config->channels[start + 0].cb(&EXTD1, start + 0); \ } \ if (mis & (1 << 1)) { \ EXTD1.config->channels[start + 1].cb(&EXTD1, start + 1); \ } \ if (mis & (1 << 2)) { \ EXTD1.config->channels[start + 2].cb(&EXTD1, start + 2); \ } \ if (mis & (1 << 3)) { \ EXTD1.config->channels[start + 3].cb(&EXTD1, start + 3); \ } \ if (mis & (1 << 4)) { \ EXTD1.config->channels[start + 4].cb(&EXTD1, start + 4); \ } \ if (mis & (1 << 5)) { \ EXTD1.config->channels[start + 5].cb(&EXTD1, start + 5); \ } \ if (mis & (1 << 6)) { \ EXTD1.config->channels[start + 6].cb(&EXTD1, start + 6); \ } \ if (mis & (1 << 7)) { \ EXTD1.config->channels[start + 7].cb(&EXTD1, start + 7); \ } \ } while (0); /** * @brief Generic interrupt serving code for single pin per interrupt * handler. */ #define ext_lld_serve_pin_interrupt(gpiop, start, pin) \ do { \ gpiop->ICR = (1 << pin); \ EXTD1.config->channels[start].cb(&EXTD1, start); \ } while (0); /*===========================================================================*/ /* Driver exported variables. */ /*===========================================================================*/ /** * @brief EXTD1 driver identifier. */ EXTDriver EXTD1; /*===========================================================================*/ /* Driver local variables and types. */ /*===========================================================================*/ const ioportid_t gpio_table[] = { #if TIVA_HAS_GPIOA GPIOA, #endif #if TIVA_HAS_GPIOB GPIOB, #endif #if TIVA_HAS_GPIOC GPIOC, #endif #if TIVA_HAS_GPIOD GPIOD, #endif #if TIVA_HAS_GPIOE GPIOE, #endif #if TIVA_HAS_GPIOF GPIOF, #endif #if TIVA_HAS_GPIOG GPIOG, #endif #if TIVA_HAS_GPIOH GPIOH, #endif #if TIVA_HAS_GPIOJ GPIOJ, #endif #if TIVA_HAS_GPIOK GPIOK, #endif #if TIVA_HAS_GPIOL GPIOL, #endif #if TIVA_HAS_GPIOM GPIOM, #endif #if TIVA_HAS_GPION GPION, #endif #if TIVA_HAS_GPIOP GPIOP, #endif #if TIVA_HAS_GPIOQ GPIOQ, #endif #if TIVA_HAS_GPIOR GPIOR, #endif #if TIVA_HAS_GPIOS GPIOS, #endif #if TIVA_HAS_GPIOT GPIOT, #endif }; /*===========================================================================*/ /* Driver local functions. */ /*===========================================================================*/ /** * @brief Enables GPIO IRQ sources. * * @notapi */ static void ext_lld_irq_enable(void) { #if TIVA_HAS_GPIOA nvicEnableVector(TIVA_GPIOA_NUMBER, TIVA_EXT_GPIOA_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOB nvicEnableVector(TIVA_GPIOB_NUMBER, TIVA_EXT_GPIOB_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOC nvicEnableVector(TIVA_GPIOC_NUMBER, TIVA_EXT_GPIOC_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOD nvicEnableVector(TIVA_GPIOD_NUMBER, TIVA_EXT_GPIOD_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOE nvicEnableVector(TIVA_GPIOE_NUMBER, TIVA_EXT_GPIOE_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOF nvicEnableVector(TIVA_GPIOF_NUMBER, TIVA_EXT_GPIOF_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOG nvicEnableVector(TIVA_GPIOG_NUMBER, TIVA_EXT_GPIOG_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOH nvicEnableVector(TIVA_GPIOH_NUMBER, TIVA_EXT_GPIOH_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOJ nvicEnableVector(TIVA_GPIOJ_NUMBER, TIVA_EXT_GPIOJ_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOK nvicEnableVector(TIVA_GPIOK_NUMBER, TIVA_EXT_GPIOK_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOL nvicEnableVector(TIVA_GPIOL_NUMBER, TIVA_EXT_GPIOL_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOM nvicEnableVector(TIVA_GPIOM_NUMBER, TIVA_EXT_GPIOM_IRQ_PRIORITY); #endif #if TIVA_HAS_GPION nvicEnableVector(TIVA_GPION_NUMBER, TIVA_EXT_GPION_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOP nvicEnableVector(TIVA_GPIOP0_NUMBER, TIVA_EXT_GPIOP0_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP1_NUMBER, TIVA_EXT_GPIOP1_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP2_NUMBER, TIVA_EXT_GPIOP2_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP3_NUMBER, TIVA_EXT_GPIOP3_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP4_NUMBER, TIVA_EXT_GPIOP4_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP5_NUMBER, TIVA_EXT_GPIOP5_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP6_NUMBER, TIVA_EXT_GPIOP6_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOP7_NUMBER, TIVA_EXT_GPIOP7_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOQ nvicEnableVector(TIVA_GPIOQ0_NUMBER, TIVA_EXT_GPIOQ0_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ1_NUMBER, TIVA_EXT_GPIOQ1_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ2_NUMBER, TIVA_EXT_GPIOQ2_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ3_NUMBER, TIVA_EXT_GPIOQ3_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ4_NUMBER, TIVA_EXT_GPIOQ4_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ5_NUMBER, TIVA_EXT_GPIOQ5_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ6_NUMBER, TIVA_EXT_GPIOQ6_IRQ_PRIORITY); nvicEnableVector(TIVA_GPIOQ7_NUMBER, TIVA_EXT_GPIOQ7_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOR nvicEnableVector(TIVA_GPIOR_NUMBER, TIVA_EXT_GPIOR_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOS nvicEnableVector(TIVA_GPIOS_NUMBER, TIVA_EXT_GPIOS_IRQ_PRIORITY); #endif #if TIVA_HAS_GPIOT nvicEnableVector(TIVA_GPIOT_NUMBER, TIVA_EXT_GPIOT_IRQ_PRIORITY); #endif } /** * @brief Disables GPIO IRQ sources. * * @notapi */ static void ext_lld_irq_disable(void) { #if TIVA_HAS_GPIOA nvicDisableVector(TIVA_GPIOA_NUMBER); #endif #if TIVA_HAS_GPIOB nvicDisableVector(TIVA_GPIOB_NUMBER); #endif #if TIVA_HAS_GPIOC nvicDisableVector(TIVA_GPIOC_NUMBER); #endif #if TIVA_HAS_GPIOD nvicDisableVector(TIVA_GPIOD_NUMBER); #endif #if TIVA_HAS_GPIOE nvicDisableVector(TIVA_GPIOE_NUMBER); #endif #if TIVA_HAS_GPIOF nvicDisableVector(TIVA_GPIOF_NUMBER); #endif #if TIVA_HAS_GPIOG nvicDisableVector(TIVA_GPIOG_NUMBER); #endif #if TIVA_HAS_GPIOH nvicDisableVector(TIVA_GPIOH_NUMBER); #endif #if TIVA_HAS_GPIOJ nvicDisableVector(TIVA_GPIOJ_NUMBER); #endif #if TIVA_HAS_GPIOK nvicDisableVector(TIVA_GPIOK_NUMBER); #endif #if TIVA_HAS_GPIOL nvicDisableVector(TIVA_GPIOL_NUMBER); #endif #if TIVA_HAS_GPIOM nvicDisableVector(TIVA_GPIOM_NUMBER); #endif #if TIVA_HAS_GPION nvicDisableVector(TIVA_GPION_NUMBER); #endif #if TIVA_HAS_GPIOP nvicDisableVector(TIVA_GPIOP0_NUMBER); nvicDisableVector(TIVA_GPIOP1_NUMBER); nvicDisableVector(TIVA_GPIOP2_NUMBER); nvicDisableVector(TIVA_GPIOP3_NUMBER); nvicDisableVector(TIVA_GPIOP4_NUMBER); nvicDisableVector(TIVA_GPIOP5_NUMBER); nvicDisableVector(TIVA_GPIOP6_NUMBER); nvicDisableVector(TIVA_GPIOP7_NUMBER); #endif #if TIVA_HAS_GPIOQ nvicDisableVector(TIVA_GPIOQ0_NUMBER); nvicDisableVector(TIVA_GPIOQ1_NUMBER); nvicDisableVector(TIVA_GPIOQ2_NUMBER); nvicDisableVector(TIVA_GPIOQ3_NUMBER); nvicDisableVector(TIVA_GPIOQ4_NUMBER); nvicDisableVector(TIVA_GPIOQ5_NUMBER); nvicDisableVector(TIVA_GPIOQ6_NUMBER); nvicDisableVector(TIVA_GPIOQ7_NUMBER); #endif #if TIVA_HAS_GPIOR nvicDisableVector(TIVA_GPIOR_NUMBER); #endif #if TIVA_HAS_GPIOS nvicDisableVector(TIVA_GPIOS_NUMBER); #endif #if TIVA_HAS_GPIOT nvicDisableVector(TIVA_GPIOT_NUMBER); #endif } /*===========================================================================*/ /* Driver interrupt handlers. */ /*===========================================================================*/ #if TIVA_HAS_GPIOA || defined(__DOXYGEN__) /** * @brief GPIOA interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOA_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOA, 0); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOB || defined(__DOXYGEN__) /** * @brief GPIOB interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOB_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOB, 8); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOC || defined(__DOXYGEN__) /** * @brief GPIOC interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOC_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOC, 16); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOD || defined(__DOXYGEN__) /** * @brief GPIOD interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOD_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOD, 24); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOE || defined(__DOXYGEN__) /** * @brief GPIOE interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOE_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOE, 32); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOF || defined(__DOXYGEN__) /** * @brief GPIOF interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOF_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(GPIOF, 40); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOG || defined(__DOXYGEN__) /** * @brief GPIOG interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOG_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOG, 48); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOH || defined(__DOXYGEN__) /** * @brief GPIOH interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOH_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOH, 56); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOJ || defined(__DOXYGEN__) /** * @brief GPIOJ interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOJ_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOJ, 64); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOK || defined(__DOXYGEN__) /** * @brief GPIOK interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOK_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOK, 72); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOL || defined(__DOXYGEN__) /** * @brief GPIOL interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOL_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOL, 80); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOM || defined(__DOXYGEN__) /** * @brief GPIOM interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOM_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOM, 88); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPION || defined(__DOXYGEN__) /** * @brief GPION interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPION_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPION, 96); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOP || defined(__DOXYGEN__) /** * @brief GPIOP0 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP0_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 104, 0); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP1 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP1_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 105, 1); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP2 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP2_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 106, 2); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP3 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP3_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 107, 3); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP4 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP4_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 108, 4); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP5 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP5_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 109, 5); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP6 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP6_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 110, 6); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOP7 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOP7_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOP, 111, 7); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOQ || defined(__DOXYGEN__) /** * @brief GPIOQ0 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ0_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 112, 0); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ1 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ1_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 113, 1); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ2 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ2_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 114, 2); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ3 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ3_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 115, 3); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ4 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ4_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 116, 4); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ5 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ5_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 117, 5); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ6 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ6_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 118, 6); OSAL_IRQ_EPILOGUE(); } /** * @brief GPIOQ7 interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOQ7_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_pin_interrupt(&GPIOQ, 119, 7); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOR || defined(__DOXYGEN__) /** * @brief GPIOR interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOR_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOR, 120); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOS || defined(__DOXYGEN__) /** * @brief GPIOS interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOS_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOS, 128); OSAL_IRQ_EPILOGUE(); } #endif #if TIVA_HAS_GPIOT || defined(__DOXYGEN__) /** * @brief GPIOT interrupt handler. * * @isr */ OSAL_IRQ_HANDLER(TIVA_GPIOT_HANDLER) { OSAL_IRQ_PROLOGUE(); ext_lld_serve_port_interrupt(&GPIOT, 132); OSAL_IRQ_EPILOGUE(); } #endif /*===========================================================================*/ /* Driver exported functions. */ /*===========================================================================*/ /** * @brief Low level EXT driver initialization. * * @notapi */ void ext_lld_init(void) { 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) { uint8_t i; if (extp->state == EXT_STOP) { ext_lld_irq_enable(); } /* Configuration of automatic channels.*/ for (i = 0; i < EXT_MAX_CHANNELS; i++) { if (extp->config->channels[i].mode & EXT_CH_MODE_AUTOSTART) { ext_lld_channel_enable(extp, i); } else { ext_lld_channel_disable(extp, i); } } } /** * @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_irq_disable(); } #if TIVA_HAS_GPIOA HWREG(GPIOA + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOB HWREG(GPIOB + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOC HWREG(GPIOC + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOD HWREG(GPIOD + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOE HWREG(GPIOE + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOF HWREG(GPIOF + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOG HWREG(GPIOG + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOH HWREG(GPIOH + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOJ HWREG(GPIOJ + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOK HWREG(GPIOK + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOL HWREG(GPIOL + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOM HWREG(GPIOM + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPION HWREG(GPION + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOP HWREG(GPIOP + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOQ HWREG(GPIOQ + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOR HWREG(GPIOR + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOS HWREG(GPIOS + GPIO_O_IM) = 0; #endif #if TIVA_HAS_GPIOT HWREG(GPIOT + GPIO_O_IM) = 0; #endif } /** * @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 gpio; uint8_t pin; uint32_t im; pin = channel & 0x07; gpio = gpio_table[channel >> 3]; /* Disable interrupts */ im = HWREG(gpio + GPIO_O_IM); HWREG(gpio + GPIO_O_IM) = 0; /* Configure pin to be edge-sensitive.*/ HWREG(gpio + GPIO_O_IS) &= ~(1 << pin); /* Programming edge registers.*/ if ((extp->config->channels[channel].mode & EXT_CH_MODE_EDGES_MASK) == EXT_CH_MODE_BOTH_EDGES) { HWREG(gpio + GPIO_O_IBE) |= (1 << pin); } else if ((extp->config->channels[channel].mode & EXT_CH_MODE_EDGES_MASK) == EXT_CH_MODE_FALLING_EDGE) { HWREG(gpio + GPIO_O_IBE) &= ~(1 << pin); HWREG(gpio + GPIO_O_IEV) &= ~(1 << pin); } else if ((extp->config->channels[channel].mode & EXT_CH_MODE_EDGES_MASK) == EXT_CH_MODE_RISING_EDGE) { HWREG(gpio + GPIO_O_IBE) &= ~(1 << pin); HWREG(gpio + GPIO_O_IEV) |= (1 << pin); } /* Programming interrupt and event registers.*/ if ((extp->config->channels[channel].cb != NULL) && ((extp->config->channels[channel].mode & EXT_CH_MODE_EDGES_MASK) != EXT_CH_MODE_DISABLED)) { im |= (1 << pin); } else { im &= ~(1 << pin); } /* Restore interrupts */ HWREG(gpio + GPIO_O_IM) = im; } /** * @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) { (void)extp; uint32_t gpio; uint8_t pin; pin = channel & 0x07; gpio = gpio_table[channel >> 3]; HWREG(gpio + GPIO_O_IM) &= ~(1 << pin); } #endif /* HAL_USE_EXT */ /** @} */