static int disable_interrupt(struct sensor * sensor, uint8_t int_to_disable) { struct lis2dw12 *lis2dw12; struct lis2dw12_private_driver_data *pdd; struct sensor_itf *itf; int rc; if (int_to_disable == 0) { return SYS_EINVAL; } lis2dw12 = (struct lis2dw12 *)SENSOR_GET_DEVICE(sensor); itf = SENSOR_GET_ITF(sensor); pdd = &lis2dw12->pdd; pdd->int_enable &= ~int_to_disable; /* disable int pin */ if (pdd->int_enable == 0) { hal_gpio_irq_disable(itf->si_ints[pdd->int_num].host_pin); rc = lis2dw12_set_int_enable(itf, 0); if (rc) { return rc; } } /* update interrupt setup in device */ return lis2dw12_set_int1_pin_cfg(itf, pdd->int_enable); }
/** * Disables an interrupt in ADXL345 device * * @param Pointer to sensor structure * @param which interrupt(s) to disable * * @return 0 on success, non-zero on failure */ static int disable_interrupt(struct sensor * sensor, uint8_t ints_to_disable) { struct adxl345_private_driver_data *pdd; struct adxl345 *adxl345; struct sensor_itf *itf; if (ints_to_disable == 0) { return SYS_EINVAL; } adxl345 = (struct adxl345 *)SENSOR_GET_DEVICE(sensor); itf = SENSOR_GET_ITF(sensor); pdd = &adxl345->pdd; /* update which interrupts are enabled */ pdd->int_enable &= ~ints_to_disable; /* if no interrupts are now in use disable int pin */ if (pdd->int_enable == 0) { hal_gpio_irq_disable(adxl345->sensor.s_itf.si_ints[pdd->int_num].host_pin); } /* update interrupt setup in device */ return adxl345_setup_interrupts(itf, pdd->int_enable, pdd->int_route); }
/** * gpio irq release * * No longer interrupt when something occurs on the pin. NOTE: this function * does not change the GPIO push/pull setting. * It also does not disable the NVIC interrupt enable setting for the irq. * * @param pin */ void hal_gpio_irq_release(int pin) { int i; i = hal_gpio_find_pin(pin); if (i < 0) { return; } hal_gpio_irq_disable(i); NRF_GPIOTE->CONFIG[i] = 0; NRF_GPIOTE->EVENTS_IN[i] = 0; hal_gpio_irqs[i].arg = NULL; hal_gpio_irqs[i].func = NULL; }
/** * gpio irq release * * No longer interrupt when something occurs on the pin. NOTE: this function * does not change the GPIO push/pull setting nor does it change the * SYSCFG EXTICR registers. It also does not disable the NVIC interrupt enable * setting for the irq. * * @param pin */ void hal_gpio_irq_release(int pin) { int index; uint32_t pin_mask; /* Disable the interrupt */ hal_gpio_irq_disable(pin); /* Clear any pending interrupts */ pin_mask = HAL_GPIO_PIN(pin); __HAL_GPIO_EXTI_CLEAR_FLAG(pin_mask); /* Clear out the irq handler */ index = HAL_GPIO_PIN_NUM(pin); hal_gpio_irq[index].arg = NULL; hal_gpio_irq[index].isr = NULL; }
/** * gpio irq init * * Initialize an external interrupt on a gpio pin * * @param pin Pin number to enable gpio. * @param handler Interrupt handler * @param arg Argument to pass to interrupt handler * @param trig Trigger mode of interrupt * @param pull Push/pull mode of input. * * @return int */ int hal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg, hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull) { int rc; int irqn; int index; uint32_t pin_mask; uint32_t mode; GPIO_InitTypeDef cfg; /* Configure the gpio for an external interrupt */ rc = 0; switch (trig) { case HAL_GPIO_TRIG_NONE: rc = -1; break; case HAL_GPIO_TRIG_RISING: mode = GPIO_MODE_IT_RISING; break; case HAL_GPIO_TRIG_FALLING: mode = GPIO_MODE_IT_FALLING; break; case HAL_GPIO_TRIG_BOTH: mode = GPIO_MODE_IT_RISING_FALLING; break; case HAL_GPIO_TRIG_LOW: rc = -1; break; case HAL_GPIO_TRIG_HIGH: rc = -1; break; default: rc = -1; break; } /* Check to make sure no error has occurred */ if (!rc) { /* Disable interrupt and clear any pending */ hal_gpio_irq_disable(pin); pin_mask = HAL_GPIO_PIN(pin); __HAL_GPIO_EXTI_CLEAR_FLAG(pin_mask); /* Set the gpio irq handler */ index = HAL_GPIO_PIN_NUM(pin); hal_gpio_irq[index].isr = handler; hal_gpio_irq[index].arg = arg; hal_gpio_irq[index].invoked = 0; /* Configure the GPIO */ cfg.Mode = mode; cfg.Pull = pull; rc = hal_gpio_init_stm(pin, &cfg); if (!rc) { /* Enable interrupt vector in NVIC */ irqn = hal_gpio_pin_to_irq(pin); hal_gpio_set_nvic(irqn); } } return rc; }