Statistics
| Branch: | Tag: | Revision:

amiro-lld / periphALtypes.h @ 7021191e

History | View | Annotate | Download (10.3 KB)

1
/*
2
AMiRo-LLD is a compilation of low-level hardware drivers for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU Lesser General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU Lesser General Public License for more details.
14

15
You should have received a copy of the GNU Lesser General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

    
19
#ifndef AMIROLLD_PERIPHALTYPES_H
20
#define AMIROLLD_PERIPHALTYPES_H
21

    
22
/*============================================================================*/
23
/* DEPENDENCIES                                                               */
24
/*============================================================================*/
25

    
26
#include <amiro-lld.h>
27
#include <stdint.h>
28

    
29
/*============================================================================*/
30
/* GENERAL                                                                    */
31
/*============================================================================*/
32

    
33
/**
34
 * @brief Time measurement type (in microseconds).
35
 */
36
#if !defined(AMIROLLD_CFG_TIME_SIZE)
37
  #error "AMIROLLD_CFG_TIME_SIZE not defined in alldconf.h"
38
#elif (AMIROLLD_CFG_TIME_SIZE == 8)
39
  typedef uint8_t     apalTime_t;
40
#elif (AMIROLLD_CFG_TIME_SIZE == 16)
41
  typedef uint16_t    apalTime_t;
42
#elif (AMIROLLD_CFG_TIME_SIZE == 32)
43
  typedef uint32_t    apalTime_t;
44
#elif (AMIROLLD_CFG_TIME_SIZE == 64)
45
  typedef uint64_t    apalTime_t;
46
#else
47
  #error "AMIROLLD_CFG_TIME_SIZE must be 8, 16, 32 or 64!"
48
#endif
49

    
50
/**
51
 * @brief Status values used as return value for all (or most) function calls.
52
 * @note  The status can be used as mask of flags.
53
 */
54
typedef int8_t apalExitStatus_t;
55

    
56
/**
57
 * @brief   Status value for success (no error or warning occurred).
58
 */
59
#define APAL_STATUS_OK                          ((apalExitStatus_t)0)
60
#define APAL_STATUS_SUCCESS                     ((apalExitStatus_t)0)
61

    
62
/**
63
 * @brief   Status value for unspecified failure.
64
 */
65
#define APAL_STATUS_ERROR                       ((apalExitStatus_t)-1)
66
#define APAL_STATUS_FAILURE                     ((apalExitStatus_t)-1)
67

    
68
/**
69
 * @brief   Status value for timeout failure.
70
 */
71
#define APAL_STATUS_TIMEOUT                     ((apalExitStatus_t)-2)
72

    
73
/**
74
 * @brief   Status value for failure because of invalid arguments.
75
 */
76
#define APAL_STATUS_INVALIDARGUMENTS            ((apalExitStatus_t)-4)
77

    
78
/**
79
 * @brief   Status value for failure because the function is not available/implemented.
80
 */
81
#define APAL_STATUS_UNAVAILABLE                 ((apalExitStatus_t)-8)
82

    
83
/**
84
 * @brief   Status value for unspecified warning.
85
 */
86
#define APAL_STATUS_WARNING                     ((apalExitStatus_t)1)
87

    
88
/*============================================================================*/
89
/* GPIO                                                                       */
90
/*============================================================================*/
91

    
92
/**
93
 * @brief   Forward declaration.
94
 * @details Struct must be defined in 'periphAL.h'.
95
 */
96
typedef struct apalGpio_t apalGpio_t;
97

    
98
/**
99
 * @brief Status values to read/write a GPIO port.
100
 */
101
typedef uint8_t apalGpioState_t;
102

    
103
/**
104
 * @brief   GPIO physical low state.
105
 */
106
#define APAL_GPIO_LOW                           ((apalGpioState_t)0)
107

    
108
/**
109
 * @brief   GPIO physical high state.
110
 */
111
#define APAL_GPIO_HIGH                          ((apalGpioState_t)1)
112

    
113
/**
114
 * @brief   Invert a physical GPIO state.
115
 *
116
 * @param[in] state   GPIO state to invert.
117
 *
118
 * @return  Inverted physical GPIO state.
119
 */
120
#define APAL_GPIO_STATE_INVERT(state) (                                       \
121
  (apalGpioState_t)state ^ APAL_GPIO_HIGH                                     \
122
)
123

    
124
/**
125
 * @brief Logical status values to turn a control GPIO 'on' and 'off'.
126
 */
127
typedef uint8_t apalControlGpioState_t;
128

    
129
/**
130
 * @brief   GPIO logical off state.
131
 */
132
#define APAL_GPIO_OFF                           ((apalControlGpioState_t)0)
133

    
134
/**
135
 * @brief   GPIO logical on state.
136
 */
137
#define APAL_GPIO_ON                            ((apalControlGpioState_t)1)
138

    
139
/**
140
 * @brief   Polarity state of the control GPIO.
141
 */
142
typedef uint8_t apalGpioActive_t;
143

    
144
/**
145
 * @brief   The control GPIO is never defined to be 'on' (does not apply).
146
 */
147
#define APAL_GPIO_ACTIVE_NONE                   ((apalGpioActive_t)0)
148

    
149
/**
150
 * @brief   The control GPIO is defined to be 'on' when it is phsically low.
151
 */
152
#define APAL_GPIO_ACTIVE_LOW                    ((apalGpioActive_t)1)
153

    
154
/**
155
 * @brief   The control GPIO is defined to be 'on' when it is physically high.
156
 */
157
#define APAL_GPIO_ACTIVE_HIGH                   ((apalGpioActive_t)2)
158

    
159
/**
160
 * @brief   The control GPIO is defined to be always 'on'.
161
 */
162
#define APAL_GPIO_ACTIVE_ANY                    ((apalGpioActive_t)3)
163

    
164
/**
165
 * @brief   Invert a GPIO active state.
166
 * @details The active state is inverted only if it was either low or high.
167
 *          In case it was set to none or any, the value is not modified.
168
 *
169
 * @param[in] active  Active state to be inverted.
170
 *
171
 * @return  Inverted active state.
172
 */
173
#define APAL_GPIO_ACTIVE_INVERT(active) (                                     \
174
  (((apalGpioActive_t)active & APAL_GPIO_ACTIVE_LOW) ^                        \
175
   ((apalGpioActive_t)active & APAL_GPIO_ACTIVE_HIGH)) ?                      \
176
  ((apalGpioActive_t)active ^ APAL_GPIO_ACTIVE_ANY) :                         \
177
  ((apalGpioActive_t)active)                                                  \
178
)
179

    
180
/**
181
 * @brief   Signal direction for the control GPIO.
182
 */
183
typedef uint8_t apalGpioDirection_t;
184

    
185
/**
186
 * @brief   Signal direction for the control GPIO is undefined.
187
 */
188
#define APAL_GPIO_DIRECTION_UNDEFINED           ((apalGpioDirection_t)0)
189

    
190
/**
191
 * @brief   Signal direction for the control GPIO is input only.
192
 */
193
#define APAL_GPIO_DIRECTION_INPUT               ((apalGpioDirection_t)1)
194

    
195
/**
196
 * @brief   Signal direction for the control GPIO is output only.
197
 */
198
#define APAL_GPIO_DIRECTION_OUTPUT              ((apalGpioDirection_t)2)
199

    
200
/**
201
 * @brief   Signal direction for the control GPIO is didirectional.
202
 */
203
#define APAL_GPIO_DIRECTION_BIDIRECTIONAL       ((apalGpioDirection_t)3)
204

    
205
/**
206
 * @brief   Informative or effective signal edge for control GPIOs.
207
 */
208
typedef uint8_t apalGpioEdge_t;
209

    
210
/**
211
 * @brief   No edges indicate an interrupt or trigger an action.
212
 */
213
#define APAL_GPIO_EDGE_NONE                     ((apalGpioEdge_t)0)
214

    
215
/**
216
 * @brief   Rising edges indicate an interrupt or trigger an action.
217
 */
218
#define APAL_GPIO_EDGE_RISING                   ((apalGpioEdge_t)1)
219

    
220
/**
221
 * @brief   Falling edges indicate an interrupt or trigger an action.
222
 */
223
#define APAL_GPIO_EDGE_FALLING                  ((apalGpioEdge_t)2)
224

    
225
/**
226
 * @brief   Both rising and falling edges indicate an interrupt or trigger an action.
227
 */
228
#define APAL_GPIO_EDGE_BOTH                     ((apalGpioEdge_t)3)
229

    
230
/**
231
 * @brief   Inverts the value of the informative or effective signal edge for interrupts.
232
 * @details Rising edge is inverted to falling and vice versa.
233
 *          If none or both edges are enabled, the identical value is returned.
234
 */
235
#define APAL_GPIO_EDGE_INVERT(edge) (                                         \
236
  (((apalGpioEdge_t)edge & APAL_GPIO_EDGE_RISING) ^                           \
237
   ((apalGpioEdge_t)edge & APAL_GPIO_EDGE_FALLING)) ?                         \
238
  ((apalGpioEdge_t)edge ^ APAL_GPIO_EDGE_BOTH) :                              \
239
  ((apalGpioEdge_t)edge)                                                      \
240
)
241

    
242
/**
243
 * @brief Control GPIO meta information
244
 */
245
typedef struct {
246
  apalGpioDirection_t direction : 2;  /**< Direction configuration for according signals */
247
  apalGpioActive_t active       : 2;  /**< Active state of the GPIO */
248
  apalGpioEdge_t edge           : 2;  /**< Edge configuration for according signals */
249
} apalGpioMeta_t;
250

    
251
/**
252
 * @brief Control GPIO type.
253
 */
254
typedef struct {
255
  apalGpio_t* gpio;     /**< The GPIO to use.                 */
256
  apalGpioMeta_t meta;  /**< Meta information about the GPIO. */
257
} apalControlGpio_t;
258

    
259
/*============================================================================*/
260
/* PWM                                                                        */
261
/*============================================================================*/
262

    
263
/**
264
 * @brief PWM channel type.
265
 */
266
typedef uint8_t   apalPWMchannel_t;
267

    
268
/**
269
 * @brief PWM width type.
270
 */
271
typedef uint16_t  apalPWMwidth_t;
272

    
273
/**
274
 * @brief PWM frequency type.
275
 */
276
typedef uint32_t  apalPWMfrequency_t;
277

    
278
/**
279
 * @brief PWM period time.
280
 */
281
typedef uint32_t  apalPWMperiod_t;
282

    
283
/**
284
 * @brief   PWM width to turn off the PWM.
285
 */
286
#define APAL_PWM_WIDTH_OFF                      ((apalPWMwidth_t)0x0000u)
287

    
288
/**
289
 * @brief   Minimum allowed PWM width.
290
 */
291
#define APAL_PWM_WIDTH_MIN                      ((apalPWMwidth_t)0x0000u)
292

    
293
/**
294
 * @brief   Maximum allowed PWM width.
295
 */
296
#define APAL_PWM_WIDTH_MAX                      ((apalPWMwidth_t)0xFFFFu)
297

    
298
/*============================================================================*/
299
/* QEI                                                                        */
300
/*============================================================================*/
301

    
302
/**
303
 * @brief QEI counter type.
304
 */
305
typedef uint32_t  apalQEICount_t;
306

    
307
/**
308
 * @brief Direction of the QEI.
309
 */
310
typedef uint8_t apalQEIDirection_t;
311

    
312
/*
313
 * @brief   QEI counts upwards.
314
 */
315
#define APAL_QEI_DIRECTION_UP                   ((apalQEIDirection_t)0)
316

    
317
/*
318
 * @brief   QEI counts downwards.
319
 */
320
#define APAL_QEI_DIRECTION_DOWN                 ((apalQEIDirection_t)1)
321

    
322
/*============================================================================*/
323
/* I2C                                                                        */
324
/*============================================================================*/
325

    
326
/**
327
 * @brief I2C address type.
328
 */
329
typedef uint16_t apalI2Caddr_t;
330

    
331
/*============================================================================*/
332
/* SPI                                                                        */
333
/*============================================================================*/
334

    
335
/* nothing defined for SPI */
336

    
337
#endif /* AMIROLLD_PERIPHALTYPES_H */