From 9bec5967b293d6c23c9d7e9338d8ece4873f6eac Mon Sep 17 00:00:00 2001 From: Andrew Hannam Date: Mon, 18 Feb 2013 17:33:35 +1000 Subject: GADC implementation with demo program Also includes driver for AT91SAM7 cpu --- drivers/gadc/AT91SAM7/gadc_lld.c | 102 +++++++++++++++++++++ drivers/gadc/AT91SAM7/gadc_lld.mk | 5 + .../gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h | 46 ++++++++++ drivers/gadc/AT91SAM7/gadc_lld_config.h | 78 ++++++++++++++++ 4 files changed, 231 insertions(+) create mode 100644 drivers/gadc/AT91SAM7/gadc_lld.c create mode 100644 drivers/gadc/AT91SAM7/gadc_lld.mk create mode 100644 drivers/gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h create mode 100644 drivers/gadc/AT91SAM7/gadc_lld_config.h (limited to 'drivers/gadc/AT91SAM7') diff --git a/drivers/gadc/AT91SAM7/gadc_lld.c b/drivers/gadc/AT91SAM7/gadc_lld.c new file mode 100644 index 00000000..4b3c6cae --- /dev/null +++ b/drivers/gadc/AT91SAM7/gadc_lld.c @@ -0,0 +1,102 @@ +/* + ChibiOS/GFX - Copyright (C) 2012, 2013 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * @file include/gadc/lld/gadc_lld.c + * @brief GADC - Periodic ADC driver source file for the AT91SAM7 cpu. + * + * @defgroup Driver Driver + * @ingroup GADC + * @{ + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if GFX_USE_GADC + +#include "gadc/lld/gadc_lld.h" + +static ADCConversionGroup acg = { + FALSE, // circular + 1, // num_channels + GADC_ISR_CompleteI, // end_cb + GADC_ISR_ErrorI, // error_cb + 0, // channelselects + 0, // trigger + 0, // frequency + }; + +void gadc_lld_init(void) { + adcStart(&ADCD1, NULL); +} + +size_t gadc_lld_samples_per_conversion(uint32_t physdev) { + size_t cnt; + int i; + + /* The AT91SAM7 has AD0..7 - physdev is a bitmap of those channels */ + for(cnt = 0, i = 0; i < 8; i++, physdev >>= 1) + if (physdev & 0x01) + cnt++; + return cnt; +} + +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_stop_timer(uint32_t physdev) { + (void) physdev; + if ((acg.trigger & ~ADC_TRIGGER_SOFTWARE) == ADC_TRIGGER_TIMER) + adcStop(&ADCD1); +} + +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_adc_nontimerI(GadcLldNonTimerData *pgntd) { + /** + * We don't need to calculate num_channels because the AT91SAM7 ADC does this for us. + */ + acg.channelselects = pgntd->physdev; + acg.trigger = ADC_TRIGGER_SOFTWARE; + adcStartConversionI(&ADCD1, &acg, pgntd->buffer, 1); +} + +#endif /* GFX_USE_GADC */ +/** @} */ diff --git a/drivers/gadc/AT91SAM7/gadc_lld.mk b/drivers/gadc/AT91SAM7/gadc_lld.mk new file mode 100644 index 00000000..001d44b1 --- /dev/null +++ b/drivers/gadc/AT91SAM7/gadc_lld.mk @@ -0,0 +1,5 @@ +# List the required driver. +GFXSRC += $(GFXLIB)/drivers/gadc/AT91SAM7/gadc_lld.c + +# Required include directories +GFXINC += $(GFXLIB)/drivers/gadc/AT91SAM7 diff --git a/drivers/gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h b/drivers/gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h new file mode 100644 index 00000000..6f23db17 --- /dev/null +++ b/drivers/gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h @@ -0,0 +1,46 @@ +/* + ChibiOS/GFX - Copyright (C) 2012, 2013 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file drivers/gadc/AT91SAM7/gadc_lld_board_olimexsam7ex256.h + * @brief GADC Driver config file. + * + * @addtogroup GADC + * @{ + */ + +#ifndef _GADC_LLD_BOARD_OLIMEXSAM7EX256_H +#define _GADC_LLD_BOARD_OLIMEXSAM7EX256_H + +#if GFX_USE_GADC + +/*===========================================================================*/ +/* Analogue devices on this board */ +/*===========================================================================*/ + +#define GADC_PHYSDEV_MICROPHONE 0x00000080 +#define GADC_PHYSDEV_DIAL 0x00000040 +#define GADC_PHYSDEV_TEMPERATURE 0x00000020 + +#endif /* GFX_USE_GADC */ + +#endif /* _GADC_LLD_BOARD_OLIMEXSAM7EX256_H */ +/** @} */ + diff --git a/drivers/gadc/AT91SAM7/gadc_lld_config.h b/drivers/gadc/AT91SAM7/gadc_lld_config.h new file mode 100644 index 00000000..882573c8 --- /dev/null +++ b/drivers/gadc/AT91SAM7/gadc_lld_config.h @@ -0,0 +1,78 @@ +/* + ChibiOS/GFX - Copyright (C) 2012, 2013 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/GFX is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file drivers/gadc/AT91SAM7/gadc_lld_config.h + * @brief GADC Driver config file. + * + * @addtogroup GADC + * @{ + */ + +#ifndef GADC_LLD_CONFIG_H +#define GADC_LLD_CONFIG_H + +#if GFX_USE_GADC + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +/** + * @brief ChibiOS has a nasty bug in its _adc_isr_full_code() routine (defined in adc.h as a macro). + * Do we have the version of ChibiOS with this bug. + * @detail Set to TRUE if ChibiOS has this bug. + * @note Fixed in ChibiOS 2.4.4stable and 2.5.2unstable (and the repository from 18th Feb 2013) + * @note This bug prevents us re-calling adcStartConversionI() from with the ISR even though + * it is clearly designed to handle it. For some reason (on this micro) the high speed timer + * is not affected only the single sample low speed timer. In that situation we wait until + * we get back to thread land. This is terrible for the accuracy of the high speed timer + * but what can we do (other than fix the bug). + * @note For the AT91SAM7 ADC driver, it post-dates the finding of the bug so we safely + * say that the bug doesn't exist for this driver. + */ +#define ADC_ISR_FULL_CODE_BUG FALSE + +/** + * @brief The maximum sample frequency supported by this CPU + */ +#define GADC_MAX_SAMPLE_FREQUENCY 132000 + +/** + * @brief The number of bits in a sample + */ +#define GADC_BITS_PER_SAMPLE AT91_ADC1_RESOLUTION + +/* Pull in board specific defines */ +#if defined(GADC_USE_CUSTOM_BOARD) && GADC_USE_CUSTOM_BOARD + /* Include the user supplied board definitions */ + #include "gadc_lld_board.h" +#elif defined(BOARD_OLIMEX_SAM7_EX256) + #include "gadc_lld_board_olimexsam7ex256.h" +#else + /* Include the user supplied board definitions */ + #include "gadc_lld_board.h" +#endif + +#endif /* GFX_USE_GADC */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */ + -- cgit v1.2.3