static int stmpe811_interrupt(int irq, FAR void *context) { FAR struct stmpe811_dev_s *priv; FAR struct stmpe811_config_s *config; int ret; /* Which STMPE811 device caused the interrupt? */ #ifndef CONFIG_STMPE811_MULTIPLE priv = &g_stmpe811; #else for (priv = g_stmpe811list; priv && priv->config->irq != irq; priv = priv->flink); ASSERT(priv != NULL); #endif /* Get a pointer the callbacks for convenience (and so the code is not so * ugly). */ config = priv->config; DEBUGASSERT(config != NULL); /* Disable further interrupts */ config->enable(config, false); /* Check if interrupt work is already queue. If it is already busy, then * we already have interrupt processing in the pipeline and we need to do * nothing more. */ if (work_available(&priv->work)) { /* Yes.. Transfer processing to the worker thread. Since STMPE811 * interrupts are disabled while the work is pending, no special * action should be required to protect the work queue. */ ret = work_queue(HPWORK, &priv->work, stmpe811_worker, priv, 0); if (ret != 0) { illdbg("Failed to queue work: %d\n", ret); } } /* Clear any pending interrupts and return success */ config->clear(config); return OK; }
void stmpe811_gpioworker(FAR struct stmpe811_dev_s *priv) { uint8_t regval; uint8_t pinmask; int pin; /* Get the set of pending GPIO interrupts */ regval = stmpe811_getreg8(priv, STMPE811_GPIO_INTSTA); /* Look at each pin */ for (pin = 0; pin < STMPE811_GPIO_NPINS; pin++) { pinmask = GPIO_INT(pin); if ((regval & pinmask) != 0) { /* Check if we have a handler for this interrupt (there should * be one) */ if (priv->handlers[pin]) { /* Interrupt is pending... dispatch the interrupt to the * callback */ priv->handlers[pin](pin); } else { illdbg("No handler for PIN%d, GPIO_INTSTA: %02x\n", pin, regval); } /* Clear the pending GPIO interrupt by writing a '1' to the * pin position in the status register. */ stmpe811_putreg8(priv, STMPE811_GPIO_INTSTA, pinmask); } } }
static int ads7843e_schedule(FAR struct ads7843e_dev_s *priv) { FAR struct ads7843e_config_s *config; int ret; /* Get a pointer the callbacks for convenience (and so the code is not so * ugly). */ config = priv->config; DEBUGASSERT(config != NULL); /* Disable further interrupts. ADS7843E interrupts will be re-enabled * after the worker thread executes. */ config->enable(config, false); /* Disable the watchdog timer. It will be re-enabled in the worker thread * while the pen remains down. */ wd_cancel(priv->wdog); /* Transfer processing to the worker thread. Since ADS7843E interrupts are * disabled while the work is pending, no special action should be required * to protected the work queue. */ DEBUGASSERT(priv->work.worker == NULL); ret = work_queue(HPWORK, &priv->work, ads7843e_worker, priv, 0); if (ret != 0) { illdbg("Failed to queue work: %d\n", ret); } return OK; }