git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1270 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
af65d01d0a
commit
0521c90a44
32
os/io/adc.c
32
os/io/adc.c
|
@ -87,15 +87,24 @@ void adcStop(ADCDriver *adcp) {
|
||||||
* @param[in] adcp pointer to the @p ADCDriver object
|
* @param[in] adcp pointer to the @p ADCDriver object
|
||||||
* @param[in] grpp pointer to a @p ADCConversionGroup object
|
* @param[in] grpp pointer to a @p ADCConversionGroup object
|
||||||
* @param[out] samples pointer to the samples buffer
|
* @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.
|
* @return The operation status.
|
||||||
* @retval FALSE the conversion has been started.
|
* @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,
|
bool_t adcStartConversion(ADCDriver *adcp,
|
||||||
ADCConversionGroup *grpp,
|
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");
|
"adcStartConversion");
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
|
@ -149,12 +158,10 @@ void adcStopConversion(ADCDriver *adcp) {
|
||||||
* - @a TIME_INFINITE no timeout.
|
* - @a TIME_INFINITE no timeout.
|
||||||
* .
|
* .
|
||||||
* @return The operation result.
|
* @return The operation result.
|
||||||
* @retval RDY_OK conversion not running.
|
* @retval RDY_OK conversion finished (or not started).
|
||||||
* @retval RDY_RESET conversion finished.
|
|
||||||
* @retval RDY_TIMEOUT conversion not finished within the specified time.
|
* @retval RDY_TIMEOUT conversion not finished within the specified time.
|
||||||
*/
|
*/
|
||||||
msg_t adcWaitConversion(ADCDriver *adcp, systme_t timeout) {
|
msg_t adcWaitConversion(ADCDriver *adcp, systme_t timeout) {
|
||||||
msg_t msg;
|
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
|
|
||||||
|
@ -163,13 +170,14 @@ msg_t adcWaitConversion(ADCDriver *adcp, systme_t timeout) {
|
||||||
"adcWaitConversion(), #1",
|
"adcWaitConversion(), #1",
|
||||||
"invalid state");
|
"invalid state");
|
||||||
|
|
||||||
if (adcp->adc_state == ADC_RUNNING)
|
if (adcp->adc_state == ADC_RUNNING) {
|
||||||
msg = chSemWaitTimeoutS(&adcp->adc_sem, timeout);
|
if (chSemWaitTimeoutS(&adcp->adc_sem, timeout) == RDY_TIMEOUT) {
|
||||||
else
|
chSysUnlock();
|
||||||
msg = RDY_OK;
|
return RDY_TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
chSysUnlock();
|
chSysUnlock();
|
||||||
return msg;
|
return RDY_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -121,7 +121,7 @@ typedef struct {
|
||||||
} SPIConfig;
|
} SPIConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure representing a MAC driver.
|
* @brief Structure representing a SPI driver.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
|
@ -31,10 +31,85 @@
|
||||||
/* Driver pre-compile time settings. */
|
/* 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. */
|
/* 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.
|
* @brief Driver configuration structure.
|
||||||
*/
|
*/
|
||||||
|
@ -43,7 +118,7 @@ typedef struct {
|
||||||
} ADCConfig;
|
} ADCConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure representing a MAC driver.
|
* @brief Structure representing an ADC driver.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -58,7 +58,7 @@ typedef struct {
|
||||||
} SPIConfig;
|
} SPIConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure representing a MAC driver.
|
* @brief Structure representing a SPI driver.
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue