git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1270 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2009-11-06 16:33:03 +00:00
parent af65d01d0a
commit 0521c90a44
5 changed files with 191 additions and 15 deletions

View File

@ -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;
}
/** @} */

View File

@ -121,7 +121,7 @@ typedef struct {
} SPIConfig;
/**
* @brief Structure representing a MAC driver.
* @brief Structure representing a SPI driver.
*/
typedef struct {
/**

93
os/io/templates/adc_lld.c Normal file
View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @file templates/adc_lld.c
* @brief ADC Driver subsystem low level driver source template
* @addtogroup ADC_LLD
* @{
*/
#include <ch.h>
#include <adc.h>
/*===========================================================================*/
/* 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) {
}
/** @} */

View File

@ -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 {
/**

View File

@ -58,7 +58,7 @@ typedef struct {
} SPIConfig;
/**
* @brief Structure representing a MAC driver.
* @brief Structure representing a SPI driver.
*/
typedef struct {
/**