diff options
Diffstat (limited to 'drivers/gadc/AT91SAM7/gadc_lld.c')
-rw-r--r-- | drivers/gadc/AT91SAM7/gadc_lld.c | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/drivers/gadc/AT91SAM7/gadc_lld.c b/drivers/gadc/AT91SAM7/gadc_lld.c index f18f2717..b01fdd6c 100644 --- a/drivers/gadc/AT91SAM7/gadc_lld.c +++ b/drivers/gadc/AT91SAM7/gadc_lld.c @@ -8,10 +8,6 @@ /** * @file drivers/gadc/AT91SAM7/gadc_lld.c * @brief GADC - Periodic ADC driver source file for the AT91SAM7 cpu. - * - * @defgroup Driver Driver - * @ingroup GADC - * @{ */ #include "gfx.h" @@ -20,69 +16,73 @@ #include "src/gadc/driver.h" +static uint32_t nextfreq; + +// Forward references to ISR routines +static void ISR_CompleteI(ADCDriver *adcp, adcsample_t *buffer, size_t n); +static void ISR_ErrorI(ADCDriver *adcp, adcerror_t err); + static ADCConversionGroup acg = { FALSE, // circular 1, // num_channels - GADC_ISR_CompleteI, // end_cb - GADC_ISR_ErrorI, // error_cb + ISR_CompleteI, // end_cb + ISR_ErrorI, // error_cb 0, // channelselects 0, // trigger 0, // frequency }; +static void ISR_CompleteI(ADCDriver *adcp, adcsample_t *buffer, size_t n) { + (void) adcp; + (void) buffer; + + gadcGotDataI(n); +} + +static void ISR_ErrorI(ADCDriver *adcp, adcerror_t err) { + (void) adcp; + (void) err; + + gadcGotDataI(0); +} + void gadc_lld_init(void) { adcStart(&ADCD1, 0); } -size_t gadc_lld_samples_per_conversion(uint32_t physdev) { - size_t cnt; - int i; +size_t gadc_lld_samplesperconversion(uint32_t physdev) { + size_t samples; - /* The AT91SAM7 has AD0..7 - physdev is a bitmap of those channels */ - for(cnt = 0, i = 0; i < 8; i++, physdev >>= 1) + for(samples = 0; physdev; physdev >>= 1) if (physdev & 0x01) - cnt++; - return cnt; + samples++; + return samples; } -void gadc_lld_start_timer(uint32_t physdev, uint32_t frequency) { - (void) physdev; - /** - * The AT91SAM7 ADC driver supports triggering the ADC using a timer without having to implement - * an interrupt handler for the timer. The driver also initialises the timer correctly for us. - * Because we aren't trapping the interrupt ourselves we can't increment GADC_Timer_Missed if an - * interrupt is missed. - */ - acg.frequency = frequency; +void gadc_lld_start_timerI(uint32_t frequency) { + // Nothing to do here - the AT91SAM7 adc driver uses an internal timer + // which is set up when the job is started. We save this here just to + // indicate the timer should be re-initialised on the next timer job + nextfreq = frequency; } -void gadc_lld_stop_timer(uint32_t physdev) { - (void) physdev; - if ((acg.trigger & ~ADC_TRIGGER_SOFTWARE) == ADC_TRIGGER_TIMER) - adcStop(&ADCD1); +void gadc_lld_stop_timerI(void) { + // Nothing to do here. The AT91SAM7 adc driver automatically turns off timer interrupts + // on completion of the job } -void gadc_lld_adc_timerI(GadcLldTimerData *pgtd) { - /** - * We don't need to calculate num_channels because the AT91SAM7 ADC does this for us. - */ - acg.channelselects = pgtd->physdev; - acg.trigger = pgtd->now ? (ADC_TRIGGER_TIMER|ADC_TRIGGER_SOFTWARE) : ADC_TRIGGER_TIMER; - - adcStartConversionI(&ADCD1, &acg, pgtd->buffer, pgtd->count); - - /* Next time assume the same (still running) timer */ - acg.frequency = 0; +void gadc_lld_timerjobI(GadcTimerJob *pj) { + acg.channelselects = pj->physdev; + acg.trigger = ADC_TRIGGER_TIMER; + acg.frequency = nextfreq; + nextfreq = 0; // Next job use the same timer + adcStartConversionI(&ADCD1, &acg, pj->buffer, pj->todo); } -void gadc_lld_adc_nontimerI(GadcLldNonTimerData *pgntd) { - /** - * We don't need to calculate num_channels because the AT91SAM7 ADC does this for us. - */ - acg.channelselects = pgntd->physdev; +void gadc_lld_nontimerjobI(GadcNonTimerJob *pj) { + acg.channelselects = pj->physdev; acg.trigger = ADC_TRIGGER_SOFTWARE; - adcStartConversionI(&ADCD1, &acg, pgntd->buffer, 1); + adcStartConversionI(&ADCD1, &acg, pj->buffer, 1); } #endif /* GFX_USE_GADC */ -/** @} */ |