From 0521c90a445af93ea53f7d0e1847fa8a12a9c423 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 6 Nov 2009 16:33:03 +0000 Subject: [PATCH] git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1270 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/io/adc.c | 32 +++++++----- os/io/platforms/STM32/spi_lld.h | 2 +- os/io/templates/adc_lld.c | 93 +++++++++++++++++++++++++++++++++ os/io/templates/adc_lld.h | 77 ++++++++++++++++++++++++++- os/io/templates/spi_lld.h | 2 +- 5 files changed, 191 insertions(+), 15 deletions(-) create mode 100644 os/io/templates/adc_lld.c diff --git a/os/io/adc.c b/os/io/adc.c index 0c215d61a..637820d5b 100644 --- a/os/io/adc.c +++ b/os/io/adc.c @@ -87,15 +87,24 @@ void adcStop(ADCDriver *adcp) { * @param[in] adcp pointer to the @p ADCDriver object * @param[in] grpp pointer to a @p ADCConversionGroup object * @param[out] samples pointer to the samples buffer + * @param[in] depth buffer depth (matrix rows number). The buffer depth must + * be one or an even number. * @return The operation status. * @retval FALSE the conversion has been started. - * @retval TRUE the driver is busy, conversion not started. + * @retval TRUE the driver is busy, conversion not started. + * + * @note The buffer is organized as a matrix of M*N elements where M is the + * channels number configured into the conversion group and N is the + * buffer depth. The samples are sequentially written into the buffer + * with no gaps. */ bool_t adcStartConversion(ADCDriver *adcp, ADCConversionGroup *grpp, - void *samples) { + void *samples, + size_t depth) { - chDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL), + chDbgCheck((adcp != NULL) && (grpp != NULL) && (samples != NULL) && + ((depth == 1) || ((depth & 1) == 0)), "adcStartConversion"); chSysLock(); @@ -149,12 +158,10 @@ void adcStopConversion(ADCDriver *adcp) { * - @a TIME_INFINITE no timeout. * . * @return The operation result. - * @retval RDY_OK conversion not running. - * @retval RDY_RESET conversion finished. + * @retval RDY_OK conversion finished (or not started). * @retval RDY_TIMEOUT conversion not finished within the specified time. */ msg_t adcWaitConversion(ADCDriver *adcp, systme_t timeout) { - msg_t msg; chSysLock(); @@ -163,13 +170,14 @@ msg_t adcWaitConversion(ADCDriver *adcp, systme_t timeout) { "adcWaitConversion(), #1", "invalid state"); - if (adcp->adc_state == ADC_RUNNING) - msg = chSemWaitTimeoutS(&adcp->adc_sem, timeout); - else - msg = RDY_OK; - + if (adcp->adc_state == ADC_RUNNING) { + if (chSemWaitTimeoutS(&adcp->adc_sem, timeout) == RDY_TIMEOUT) { + chSysUnlock(); + return RDY_TIMEOUT; + } + } chSysUnlock(); - return msg; + return RDY_OK; } /** @} */ diff --git a/os/io/platforms/STM32/spi_lld.h b/os/io/platforms/STM32/spi_lld.h index 077c7be7f..f24a08e13 100644 --- a/os/io/platforms/STM32/spi_lld.h +++ b/os/io/platforms/STM32/spi_lld.h @@ -121,7 +121,7 @@ typedef struct { } SPIConfig; /** - * @brief Structure representing a MAC driver. + * @brief Structure representing a SPI driver. */ typedef struct { /** diff --git a/os/io/templates/adc_lld.c b/os/io/templates/adc_lld.c new file mode 100644 index 000000000..0f3246cf0 --- /dev/null +++ b/os/io/templates/adc_lld.c @@ -0,0 +1,93 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT 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/RT 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 templates/adc_lld.c + * @brief ADC Driver subsystem low level driver source template + * @addtogroup ADC_LLD + * @{ + */ + +#include +#include + +/*===========================================================================*/ +/* Low Level Driver local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Low Level Driver interrupt handlers. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Low Level Driver exported functions. */ +/*===========================================================================*/ + +/** + * @brief Low level ADC driver initialization. + */ +void adc_lld_init(void) { + +} + +/** + * @brief Configures and activates the ADC peripheral. + * + * @param[in] adcp pointer to the @p ADCDriver object + */ +void adc_lld_start(ADCDriver *adcp) { + + if (adcp->spd_state == ADC_STOP) { + /* Clock activation.*/ + } + /* Configuration.*/ +} + +/** + * @brief Deactivates the ADC peripheral. + * + * @param[in] adcp pointer to the @p ADCDriver object + */ +void adc_lld_stop(ADCDriver *adcp) { + +} + +/** + * @brief Starts an ADC conversion. + * + * @param[in] adcp pointer to the @p ADCDriver object + * @param[in] grpp pointer to a @p ADCConversionGroup object + * @param[out] samples pointer to the samples buffer + */ +void adc_lld_start_conversion(ADCDriver *adcp, + ADCConversionGroup *grpp, + void *samples) { + +} + +/** + * @brief Stops an ongoing conversion. + * + * @param[in] adcp pointer to the @p ADCDriver object + */ +void adc_lld_stop_conversion(ADCDriver *adcp) { + +} + +/** @} */ diff --git a/os/io/templates/adc_lld.h b/os/io/templates/adc_lld.h index ab8a48bf9..6fde9c181 100644 --- a/os/io/templates/adc_lld.h +++ b/os/io/templates/adc_lld.h @@ -31,10 +31,85 @@ /* Driver pre-compile time settings. */ /*===========================================================================*/ +/*===========================================================================*/ +/* Driver constants. */ +/*===========================================================================*/ + +/** + * @brief Linear buffering mode. + * @details In the linear buffering mode the buffer is filled one time and + * then the operation automatically stops. + */ +#define ADC_GROUP_BUFFER_LINEAR 0 + +/** + * @brief Circular buffering mode. + * @details In the circular buffering mode the buffer is filled one time and + * then the operation automatically starts again. + */ +#define ADC_GROUP_BUFFER_CIRCULAR 1 + /*===========================================================================*/ /* Driver data structures and types. */ /*===========================================================================*/ +/** + * @brief ADC sample data type. + */ +typedef uint16_t adcsample_t; + +/** + * @brief Channels number in a conversion group. + */ +typedef uint16_t adc_channels_num_t; + +/** + * @brief Samples buffer depth. + */ +typedef uint16_t adc_buffer_depth_t; + +/** + * @brief ADC notification callback type. + * @param[in] buffer pointer to the most recent samples data + * @param[in] n number of buffer rows available starting from @p buffer + */ +typedef void (*adccallback_t)(adcsample_t *buffer, + adc_buffer_depth_t n); + +/** + * @brief Conversion group configuration structure. + * @details This implementation-dependent structure describes a conversion + * operation. + */ +typedef struct { + /** + * @brief Group mode flags. + */ + uint_least8_t acg_mode; + + /** + * @brief Number of the analog channels belonging to the conversion group. + */ + adc_channels_num_t acg_num_channels; + + /** + * @brief Samples buffer depth. + * @note The buffer depth must be an even number or one. The 50% callback + * behavior for buffers with odd depth is unspecified. + */ + adc_buffer_depth_t acg_buffer_depth; + + /** + * @brief Data streaming callback. + * @details This callback is invoked at 50% and 100% buffer fill level in + * order to allow realtime processing of the conversion results + * when the circular buffer mode is selected. + * @note The 50% callback is only invoked if @p acg_num_samples is greater + * than 1. + */ + adccallback_t acg_callback; +} ADCConversionGroup; + /** * @brief Driver configuration structure. */ @@ -43,7 +118,7 @@ typedef struct { } ADCConfig; /** - * @brief Structure representing a MAC driver. + * @brief Structure representing an ADC driver. */ typedef struct { /** diff --git a/os/io/templates/spi_lld.h b/os/io/templates/spi_lld.h index e25dc86dd..23a1f094b 100644 --- a/os/io/templates/spi_lld.h +++ b/os/io/templates/spi_lld.h @@ -58,7 +58,7 @@ typedef struct { } SPIConfig; /** - * @brief Structure representing a MAC driver. + * @brief Structure representing a SPI driver. */ typedef struct { /**