static void tiva_adc_read(void *arg) { struct tiva_adc_s *priv; struct tiva_adc_sse_s *sse = (struct tiva_adc_sse_s *)arg; struct adc_dev_s *dev = 0; int irq = tiva_adc_getirq(sse->adc, sse->num); uint8_t i = 0; uint8_t fifo_count = 0; int32_t buf[8]; /* Get exclusive access to the driver data structure */ tiva_adc_lock(g_adcs[sse->adc], sse->num); /* Get sampled data */ fifo_count = tiva_adc_sse_data(sse->adc, sse->num, buf); /* Determine which adc_dev_s we need */ dev = g_devs[sse->adc]; if (dev == NULL) { /* This is a serious error: indicates invalid pointer indirection * and should cause a full system stop. */ aerr("ERROR: Invalid ADC device number given %d\n", sse->adc); DEBUGPANIC(); return; } priv = (struct tiva_adc_s *)dev->ad_priv; /* Verify that the upper-half driver has bound its callback functions */ if (priv->cb != NULL) { DEBUGASSERT(priv->cb->au_receive != NULL); for (i = 0; i < fifo_count; ++i) { /* Perform the data received callback */ priv->cb->au_receive(dev, tiva_adc_get_ain(sse->adc, sse->num, i), buf[i]); ainfo("AIN%d = 0x%04x\n", tiva_adc_get_ain(sse->adc, sse->num, i), buf[i]); } } /* Exit, re-enabling ADC interrupts */ up_enable_irq(irq); /* Release our lock on the ADC structure */ tiva_adc_unlock(g_adcs[sse->adc], sse->num); }
static void tiva_adc_interrupt(struct tiva_adc_sse_s *sse) { int ret; int irq = tiva_adc_getirq(sse->adc, sse->num); DEBUGASSERT(sse->ena == true); /* Disable further interrupts. Interrupts will be re-enabled * after the worker thread executes. */ up_disable_irq(irq); /* Clear interrupt status */ tiva_adc_sse_clear_int(sse->adc, sse->num); /* Transfer processing to the worker thread. Since interrupts are * disabled while the work is pending, no special action should be * required to protected the work queue. */ DEBUGASSERT(sse->work.worker == NULL); ret = work_queue(HPWORK, &sse->work, tiva_adc_read, sse, 0); if (ret != 0) { aerr("ERROR: Failed to queue work: %d ADC.SSE: %d.%d\n", ret, sse->adc, sse->num); } }
static void tiva_adc_read(void *arg) { struct tiva_adc_sse_s *sse = (struct tiva_adc_sse_s *)arg; struct adc_dev_s *dev = 0; int irq = tiva_adc_getirq(sse->adc, sse->num); uint8_t i = 0; uint8_t fifo_count = 0; int32_t buf[8]; /* Get exclusive access to the driver data structure */ tiva_adc_lock(g_adcs[sse->adc], sse->num); /* Get sampled data */ fifo_count = tiva_adc_sse_data(sse->adc, sse->num, buf); /* Determine which adc_dev_s we need */ dev = g_devs[sse->adc]; if (dev == NULL) { /* This is a serious error: indicates invalid pointer indirection * and should cause a full system stop. */ alldbg("PANIC!!! Invalid ADC device number given %d\n", sse->adc); PANIC(); return; } for (i = 0; i < fifo_count; ++i) { (void)adc_receive(dev, tiva_adc_get_ain(sse->adc, sse->num, i), buf[i]); avdbg("AIN%d=0x%04x\n", tiva_adc_get_ain(sse->adc, sse->num, i), buf[i]); } /* Exit, re-enabling ADC interrupts */ up_enable_irq(irq); /* Release our lock on the ADC structure */ tiva_adc_unlock(g_adcs[sse->adc], sse->num); }
void tiva_adc_sse_int_enable(uint8_t adc, uint8_t sse, bool state) { irqstate_t flags; uintptr_t imreg = TIVA_ADC_IM(adc); int irq = tiva_adc_getirq(adc, sse); flags = enter_critical_section(); up_disable_irq(irq); tiva_adc_sse_clear_int(adc, sse); if (state == true) { modifyreg32(imreg, 0, (1 << sse)); } else { modifyreg32(imreg, (1 << sse), 0); } up_enable_irq(irq); leave_critical_section(flags); }