/** * \internal * \brief Disables the External Interrupt driver. * * Disables EIC modules that were previously started via a call to * \ref _extint_enable(). * Registered callback list will not be affected if callback mode is used. */ void _extint_disable(void) { Eic *const eics[EIC_INST_NUM] = EIC_INSTS; /* Disable all EIC hardware modules. */ for (uint32_t i = 0; i < EIC_INST_NUM; i++) { eics[i]->CTRL.reg &= ~EIC_CTRL_ENABLE; } while (extint_is_syncing()) { /* Wait for all hardware modules to complete synchronization */ } }
void _system_extint_init(void) { Eic *const eics[EIC_INST_NUM] = EIC_INSTS; /* Turn on the digital interface clock */ system_apb_clock_set_mask(SYSTEM_CLOCK_APB_APBA, MCLK_APBAMASK_EIC); #if (EXTINT_CLOCK_SELECTION == EXTINT_CLK_GCLK) /* Configure the generic clock for the module and enable it */ struct system_gclk_chan_config gclk_chan_conf; system_gclk_chan_get_config_defaults(&gclk_chan_conf); gclk_chan_conf.source_generator = EXTINT_CLOCK_SOURCE; system_gclk_chan_set_config(EIC_GCLK_ID, &gclk_chan_conf); /* Enable the clock anyway, since when needed it will be requested * by External Interrupt driver */ system_gclk_chan_enable(EIC_GCLK_ID); #endif /* Reset all EIC hardware modules. */ for (uint32_t i = 0; i < EIC_INST_NUM; i++) { eics[i]->CTRLA.reg |= EIC_CTRLA_SWRST; } while (extint_is_syncing()) { /* Wait for all hardware modules to complete synchronization */ } #if (EXTINT_CLOCK_SELECTION == EXTINT_CLK_GCLK) for (uint32_t i = 0; i < EIC_INST_NUM; i++) { eics[i]->CTRLA.bit.CKSEL = EXTINT_CLK_GCLK; } #else for (uint32_t i = 0; i < EIC_INST_NUM; i++) { eics[i]->CTRLA.bit.CKSEL = EXTINT_CLK_ULP32K; } #endif /* Reset the software module */ #if EXTINT_CALLBACK_MODE == true /* Clear callback registration table */ for (uint8_t j = 0; j < EIC_NUMBER_OF_INTERRUPTS; j++) { _extint_dev.callbacks[j] = NULL; } system_interrupt_enable(SYSTEM_INTERRUPT_MODULE_EIC); #endif /* Enables the driver for further use */ _extint_enable(); }