amiro-os / modules / PowerManagement_1-2 / halconf.h @ ad8a2568
History | View | Annotate | Download (16.414 KB)
1 | b010278f | Thomas Schöpping | /*
|
---|---|---|---|
2 | AMiRo-OS is an operating system designed 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 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 General Public License for more details.
|
||
14 | |||
15 | You should have received a copy of the GNU General Public License
|
||
16 | along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
17 | */
|
||
18 | |||
19 | /**
|
||
20 | * @file
|
||
21 | * @brief HAL configuration header for the PowerManagement v1.2 module.
|
||
22 | * @details HAL configuration file, this file allows to enable or disable the
|
||
23 | * various device drivers from your application. You may also use
|
||
24 | * this file in order to override the device drivers default settings.
|
||
25 | *
|
||
26 | * @addtogroup POWERMANAGEMENT_HAL_CONF
|
||
27 | * @{
|
||
28 | */
|
||
29 | |||
30 | #ifndef HALCONF_H
|
||
31 | #define HALCONF_H
|
||
32 | |||
33 | #define _CHIBIOS_HAL_CONF_
|
||
34 | #define _CHIBIOS_HAL_CONF_VER_7_0_
|
||
35 | |||
36 | 4c72a54c | Thomas Schöpping | #include <mcuconf.h> |
37 | b010278f | Thomas Schöpping | |
38 | /**
|
||
39 | * @brief Enables the PAL subsystem.
|
||
40 | */
|
||
41 | #if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
|
||
42 | #define HAL_USE_PAL TRUE
|
||
43 | #endif
|
||
44 | |||
45 | /**
|
||
46 | * @brief Enables the ADC subsystem.
|
||
47 | */
|
||
48 | #if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
|
||
49 | #define HAL_USE_ADC TRUE
|
||
50 | #endif
|
||
51 | |||
52 | /**
|
||
53 | * @brief Enables the CAN subsystem.
|
||
54 | */
|
||
55 | #if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
|
||
56 | #define HAL_USE_CAN TRUE
|
||
57 | #endif
|
||
58 | |||
59 | /**
|
||
60 | * @brief Enables the cryptographic subsystem.
|
||
61 | */
|
||
62 | #if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
|
||
63 | #define HAL_USE_CRY FALSE
|
||
64 | #endif
|
||
65 | |||
66 | /**
|
||
67 | * @brief Enables the DAC subsystem.
|
||
68 | */
|
||
69 | #if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
|
||
70 | #define HAL_USE_DAC FALSE
|
||
71 | #endif
|
||
72 | |||
73 | /**
|
||
74 | * @brief Enables the GPT subsystem.
|
||
75 | */
|
||
76 | #if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
|
||
77 | #define HAL_USE_GPT FALSE
|
||
78 | #endif
|
||
79 | |||
80 | /**
|
||
81 | * @brief Enables the I2C subsystem.
|
||
82 | */
|
||
83 | #if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
|
||
84 | #define HAL_USE_I2C TRUE
|
||
85 | #endif
|
||
86 | |||
87 | /**
|
||
88 | * @brief Enables the I2S subsystem.
|
||
89 | */
|
||
90 | #if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
|
||
91 | #define HAL_USE_I2S FALSE
|
||
92 | #endif
|
||
93 | |||
94 | /**
|
||
95 | * @brief Enables the ICU subsystem.
|
||
96 | */
|
||
97 | #if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
|
||
98 | #define HAL_USE_ICU FALSE
|
||
99 | #endif
|
||
100 | |||
101 | /**
|
||
102 | * @brief Enables the MAC subsystem.
|
||
103 | */
|
||
104 | #if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
|
||
105 | #define HAL_USE_MAC FALSE
|
||
106 | #endif
|
||
107 | |||
108 | /**
|
||
109 | * @brief Enables the MMC_SPI subsystem.
|
||
110 | */
|
||
111 | #if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
|
||
112 | #define HAL_USE_MMC_SPI FALSE
|
||
113 | #endif
|
||
114 | |||
115 | /**
|
||
116 | * @brief Enables the PWM subsystem.
|
||
117 | */
|
||
118 | #if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
|
||
119 | #define HAL_USE_PWM TRUE
|
||
120 | #endif
|
||
121 | |||
122 | /**
|
||
123 | * @brief Enables the QEI subsystem.
|
||
124 | */
|
||
125 | #if !defined(HAL_USE_QEI) || defined(__DOXYGEN__)
|
||
126 | #define HAL_USE_QEI FALSE
|
||
127 | #endif
|
||
128 | |||
129 | /**
|
||
130 | * @brief Enables the RTC subsystem.
|
||
131 | */
|
||
132 | #if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
|
||
133 | #define HAL_USE_RTC TRUE
|
||
134 | #endif
|
||
135 | |||
136 | /**
|
||
137 | * @brief Enables the SDC subsystem.
|
||
138 | */
|
||
139 | #if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
|
||
140 | #define HAL_USE_SDC FALSE
|
||
141 | #endif
|
||
142 | |||
143 | /**
|
||
144 | * @brief Enables the SERIAL subsystem.
|
||
145 | */
|
||
146 | #if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
|
||
147 | #define HAL_USE_SERIAL TRUE
|
||
148 | #endif
|
||
149 | |||
150 | /**
|
||
151 | * @brief Enables the SERIAL over USB subsystem.
|
||
152 | */
|
||
153 | #if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
|
||
154 | #define HAL_USE_SERIAL_USB FALSE
|
||
155 | #endif
|
||
156 | |||
157 | /**
|
||
158 | * @brief Enables the SIO subsystem.
|
||
159 | */
|
||
160 | #if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
|
||
161 | #define HAL_USE_SIO FALSE
|
||
162 | #endif
|
||
163 | |||
164 | /**
|
||
165 | * @brief Enables the SPI subsystem.
|
||
166 | */
|
||
167 | #if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
|
||
168 | #define HAL_USE_SPI TRUE
|
||
169 | #endif
|
||
170 | |||
171 | /**
|
||
172 | * @brief Enables the TRNG subsystem.
|
||
173 | */
|
||
174 | #if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
|
||
175 | #define HAL_USE_TRNG FALSE
|
||
176 | #endif
|
||
177 | |||
178 | /**
|
||
179 | * @brief Enables the UART subsystem.
|
||
180 | */
|
||
181 | #if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
|
||
182 | #define HAL_USE_UART FALSE
|
||
183 | #endif
|
||
184 | |||
185 | /**
|
||
186 | * @brief Enables the USB subsystem.
|
||
187 | */
|
||
188 | #if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
|
||
189 | #define HAL_USE_USB FALSE
|
||
190 | #endif
|
||
191 | |||
192 | /**
|
||
193 | * @brief Enables the WDG subsystem.
|
||
194 | */
|
||
195 | #if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
|
||
196 | #define HAL_USE_WDG FALSE
|
||
197 | #endif
|
||
198 | |||
199 | /**
|
||
200 | * @brief Enables the WSPI subsystem.
|
||
201 | */
|
||
202 | #if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
|
||
203 | #define HAL_USE_WSPI FALSE
|
||
204 | #endif
|
||
205 | |||
206 | /*===========================================================================*/
|
||
207 | /* PAL driver related settings. */
|
||
208 | /*===========================================================================*/
|
||
209 | |||
210 | /**
|
||
211 | * @brief Enables synchronous APIs.
|
||
212 | * @note Disabling this option saves both code and data space.
|
||
213 | */
|
||
214 | #if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
|
||
215 | #define PAL_USE_CALLBACKS TRUE
|
||
216 | #endif
|
||
217 | |||
218 | /**
|
||
219 | * @brief Enables synchronous APIs.
|
||
220 | * @note Disabling this option saves both code and data space.
|
||
221 | */
|
||
222 | #if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
|
||
223 | #define PAL_USE_WAIT FALSE
|
||
224 | #endif
|
||
225 | |||
226 | /*===========================================================================*/
|
||
227 | /* ADC driver related settings. */
|
||
228 | /*===========================================================================*/
|
||
229 | |||
230 | /**
|
||
231 | * @brief Enables synchronous APIs.
|
||
232 | * @note Disabling this option saves both code and data space.
|
||
233 | */
|
||
234 | #if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
|
||
235 | #define ADC_USE_WAIT TRUE
|
||
236 | #endif
|
||
237 | |||
238 | /**
|
||
239 | * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
|
||
240 | * @note Disabling this option saves both code and data space.
|
||
241 | */
|
||
242 | #if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
243 | #define ADC_USE_MUTUAL_EXCLUSION FALSE
|
||
244 | #endif
|
||
245 | |||
246 | /*===========================================================================*/
|
||
247 | /* CAN driver related settings. */
|
||
248 | /*===========================================================================*/
|
||
249 | |||
250 | /**
|
||
251 | * @brief Sleep mode related APIs inclusion switch.
|
||
252 | */
|
||
253 | #if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
|
||
254 | #define CAN_USE_SLEEP_MODE FALSE
|
||
255 | #endif
|
||
256 | |||
257 | /**
|
||
258 | * @brief Enforces the driver to use direct callbacks rather than OSAL events.
|
||
259 | */
|
||
260 | #if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
|
||
261 | #define CAN_ENFORCE_USE_CALLBACKS FALSE
|
||
262 | #endif
|
||
263 | |||
264 | /*===========================================================================*/
|
||
265 | /* CRY driver related settings. */
|
||
266 | /*===========================================================================*/
|
||
267 | |||
268 | /**
|
||
269 | * @brief Enables the SW fall-back of the cryptographic driver.
|
||
270 | * @details When enabled, this option, activates a fall-back software
|
||
271 | * implementation for algorithms not supported by the underlying
|
||
272 | * hardware.
|
||
273 | * @note Fall-back implementations may not be present for all algorithms.
|
||
274 | */
|
||
275 | #if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
|
||
276 | #define HAL_CRY_USE_FALLBACK FALSE
|
||
277 | #endif
|
||
278 | |||
279 | /**
|
||
280 | * @brief Makes the driver forcibly use the fall-back implementations.
|
||
281 | */
|
||
282 | #if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
|
||
283 | #define HAL_CRY_ENFORCE_FALLBACK FALSE
|
||
284 | #endif
|
||
285 | |||
286 | /*===========================================================================*/
|
||
287 | /* DAC driver related settings. */
|
||
288 | /*===========================================================================*/
|
||
289 | |||
290 | /**
|
||
291 | * @brief Enables synchronous APIs.
|
||
292 | * @note Disabling this option saves both code and data space.
|
||
293 | */
|
||
294 | #if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
|
||
295 | #define DAC_USE_WAIT TRUE
|
||
296 | #endif
|
||
297 | |||
298 | /**
|
||
299 | * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
|
||
300 | * @note Disabling this option saves both code and data space.
|
||
301 | */
|
||
302 | #if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
303 | #define DAC_USE_MUTUAL_EXCLUSION TRUE
|
||
304 | #endif
|
||
305 | |||
306 | /*===========================================================================*/
|
||
307 | /* I2C driver related settings. */
|
||
308 | /*===========================================================================*/
|
||
309 | |||
310 | /**
|
||
311 | * @brief Enables the mutual exclusion APIs on the I2C bus.
|
||
312 | */
|
||
313 | #if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
314 | #define I2C_USE_MUTUAL_EXCLUSION TRUE
|
||
315 | #endif
|
||
316 | |||
317 | /*===========================================================================*/
|
||
318 | /* MAC driver related settings. */
|
||
319 | /*===========================================================================*/
|
||
320 | |||
321 | /**
|
||
322 | * @brief Enables the zero-copy API.
|
||
323 | */
|
||
324 | #if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
|
||
325 | #define MAC_USE_ZERO_COPY FALSE
|
||
326 | #endif
|
||
327 | |||
328 | /**
|
||
329 | * @brief Enables an event sources for incoming packets.
|
||
330 | */
|
||
331 | #if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
|
||
332 | #define MAC_USE_EVENTS TRUE
|
||
333 | #endif
|
||
334 | |||
335 | /*===========================================================================*/
|
||
336 | /* MMC_SPI driver related settings. */
|
||
337 | /*===========================================================================*/
|
||
338 | |||
339 | /**
|
||
340 | * @brief Delays insertions.
|
||
341 | * @details If enabled this options inserts delays into the MMC waiting
|
||
342 | * routines releasing some extra CPU time for the threads with
|
||
343 | * lower priority, this may slow down the driver a bit however.
|
||
344 | * This option is recommended also if the SPI driver does not
|
||
345 | * use a DMA channel and heavily loads the CPU.
|
||
346 | */
|
||
347 | #if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
|
||
348 | #define MMC_NICE_WAITING TRUE
|
||
349 | #endif
|
||
350 | |||
351 | /*===========================================================================*/
|
||
352 | /* SDC driver related settings. */
|
||
353 | /*===========================================================================*/
|
||
354 | |||
355 | /**
|
||
356 | * @brief Number of initialization attempts before rejecting the card.
|
||
357 | * @note Attempts are performed at 10mS intervals.
|
||
358 | */
|
||
359 | #if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
|
||
360 | #define SDC_INIT_RETRY 100 |
||
361 | #endif
|
||
362 | |||
363 | /**
|
||
364 | * @brief Include support for MMC cards.
|
||
365 | * @note MMC support is not yet implemented so this option must be kept
|
||
366 | * at @p FALSE.
|
||
367 | */
|
||
368 | #if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
|
||
369 | #define SDC_MMC_SUPPORT FALSE
|
||
370 | #endif
|
||
371 | |||
372 | /**
|
||
373 | * @brief Delays insertions.
|
||
374 | * @details If enabled this options inserts delays into the MMC waiting
|
||
375 | * routines releasing some extra CPU time for the threads with
|
||
376 | * lower priority, this may slow down the driver a bit however.
|
||
377 | */
|
||
378 | #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
|
||
379 | #define SDC_NICE_WAITING TRUE
|
||
380 | #endif
|
||
381 | |||
382 | /**
|
||
383 | * @brief OCR initialization constant for V20 cards.
|
||
384 | */
|
||
385 | #if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
|
||
386 | #define SDC_INIT_OCR_V20 0x50FF8000U |
||
387 | #endif
|
||
388 | |||
389 | /**
|
||
390 | * @brief OCR initialization constant for non-V20 cards.
|
||
391 | */
|
||
392 | #if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
|
||
393 | #define SDC_INIT_OCR 0x80100000U |
||
394 | #endif
|
||
395 | |||
396 | /*===========================================================================*/
|
||
397 | /* SERIAL driver related settings. */
|
||
398 | /*===========================================================================*/
|
||
399 | |||
400 | /**
|
||
401 | * @brief Default bit rate.
|
||
402 | * @details Configuration parameter, this is the baud rate selected for the
|
||
403 | * default configuration.
|
||
404 | */
|
||
405 | #if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
|
||
406 | #define SERIAL_DEFAULT_BITRATE 115200 |
||
407 | #endif
|
||
408 | |||
409 | /**
|
||
410 | * @brief Serial buffers size.
|
||
411 | * @details Configuration parameter, you can change the depth of the queue
|
||
412 | * buffers depending on the requirements of your application.
|
||
413 | * @note The default is 16 bytes for both the transmission and receive
|
||
414 | * buffers.
|
||
415 | */
|
||
416 | #if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||
417 | #define SERIAL_BUFFERS_SIZE 16 |
||
418 | #endif
|
||
419 | |||
420 | /*===========================================================================*/
|
||
421 | /* SERIAL_USB driver related setting. */
|
||
422 | /*===========================================================================*/
|
||
423 | |||
424 | /**
|
||
425 | * @brief Serial over USB buffers size.
|
||
426 | * @details Configuration parameter, the buffer size must be a multiple of
|
||
427 | * the USB data endpoint maximum packet size.
|
||
428 | * @note The default is 256 bytes for both the transmission and receive
|
||
429 | * buffers.
|
||
430 | */
|
||
431 | #if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
|
||
432 | #define SERIAL_USB_BUFFERS_SIZE 256 |
||
433 | #endif
|
||
434 | |||
435 | /**
|
||
436 | * @brief Serial over USB number of buffers.
|
||
437 | * @note The default is 2 buffers.
|
||
438 | */
|
||
439 | #if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
|
||
440 | #define SERIAL_USB_BUFFERS_NUMBER 2 |
||
441 | #endif
|
||
442 | |||
443 | /*===========================================================================*/
|
||
444 | /* SPI driver related settings. */
|
||
445 | /*===========================================================================*/
|
||
446 | |||
447 | /**
|
||
448 | * @brief Enables synchronous APIs.
|
||
449 | * @note Disabling this option saves both code and data space.
|
||
450 | */
|
||
451 | #if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
|
||
452 | #define SPI_USE_WAIT TRUE
|
||
453 | #endif
|
||
454 | |||
455 | /**
|
||
456 | * @brief Enables circular transfers APIs.
|
||
457 | * @note Disabling this option saves both code and data space.
|
||
458 | */
|
||
459 | #if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
|
||
460 | #define SPI_USE_CIRCULAR FALSE
|
||
461 | #endif
|
||
462 | |||
463 | |||
464 | /**
|
||
465 | * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
|
||
466 | * @note Disabling this option saves both code and data space.
|
||
467 | */
|
||
468 | #if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
469 | #define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||
470 | #endif
|
||
471 | |||
472 | /**
|
||
473 | * @brief Handling method for SPI CS line.
|
||
474 | * @note Disabling this option saves both code and data space.
|
||
475 | */
|
||
476 | #if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
|
||
477 | #define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
|
||
478 | #endif
|
||
479 | |||
480 | /*===========================================================================*/
|
||
481 | /* UART driver related settings. */
|
||
482 | /*===========================================================================*/
|
||
483 | |||
484 | /**
|
||
485 | * @brief Enables synchronous APIs.
|
||
486 | * @note Disabling this option saves both code and data space.
|
||
487 | */
|
||
488 | #if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
|
||
489 | #define UART_USE_WAIT FALSE
|
||
490 | #endif
|
||
491 | |||
492 | /**
|
||
493 | * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
|
||
494 | * @note Disabling this option saves both code and data space.
|
||
495 | */
|
||
496 | #if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
497 | #define UART_USE_MUTUAL_EXCLUSION FALSE
|
||
498 | #endif
|
||
499 | |||
500 | /*===========================================================================*/
|
||
501 | /* USB driver related settings. */
|
||
502 | /*===========================================================================*/
|
||
503 | |||
504 | /**
|
||
505 | * @brief Enables synchronous APIs.
|
||
506 | * @note Disabling this option saves both code and data space.
|
||
507 | */
|
||
508 | #if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||
509 | #define USB_USE_WAIT FALSE
|
||
510 | #endif
|
||
511 | |||
512 | /*===========================================================================*/
|
||
513 | /* WSPI driver related settings. */
|
||
514 | /*===========================================================================*/
|
||
515 | |||
516 | /**
|
||
517 | * @brief Enables synchronous APIs.
|
||
518 | * @note Disabling this option saves both code and data space.
|
||
519 | */
|
||
520 | #if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
|
||
521 | #define WSPI_USE_WAIT TRUE
|
||
522 | #endif
|
||
523 | |||
524 | /**
|
||
525 | * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
|
||
526 | * @note Disabling this option saves both code and data space.
|
||
527 | */
|
||
528 | #if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
|
||
529 | #define WSPI_USE_MUTUAL_EXCLUSION TRUE
|
||
530 | #endif
|
||
531 | |||
532 | #endif /* HALCONF_H */ |
||
533 | |||
534 | /** @} */ |