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
30
os/io/adc.c
30
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.
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
|
|
@ -121,7 +121,7 @@ typedef struct {
|
|||
} SPIConfig;
|
||||
|
||||
/**
|
||||
* @brief Structure representing a MAC driver.
|
||||
* @brief Structure representing a SPI driver.
|
||||
*/
|
||||
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 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 {
|
||||
/**
|
||||
|
|
|
@ -58,7 +58,7 @@ typedef struct {
|
|||
} SPIConfig;
|
||||
|
||||
/**
|
||||
* @brief Structure representing a MAC driver.
|
||||
* @brief Structure representing a SPI driver.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue