blob: 6fde9c181d98b21c41f78ae9b57e678f3ae76889 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
/*
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.h
* @brief ADC Driver subsystem low level driver header template
* @addtogroup ADC_LLD
* @{
*/
#ifndef _ADC_LLD_H_
#define _ADC_LLD_H_
/*===========================================================================*/
/* 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.
*/
typedef struct {
} ADCConfig;
/**
* @brief Structure representing an ADC driver.
*/
typedef struct {
/**
* @brief Driver state.
*/
adcstate_t adc_state;
/**
* @brief Current configuration data.
*/
const ADCConfig *adc_config;
/**
* @brief Semaphore for completion synchronization.
*/
Semaphore adc_sem;
/* End of the mandatory fields.*/
} ADCDriver;
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
void adc_lld_init(void);
void adc_lld_start(ADCDriver *adcp);
void adc_lld_stop(ADCDriver *adcp);
void adc_lld_start_conversion(ADCDriver *adcp,
ADCConversionGroup *grpp,
void *samples);
void adc_lld_stop_conversion(ADCDriver *adcp);
#ifdef __cplusplus
}
#endif
#endif /* _ADC_LLD_H_ */
/** @} */
|