]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_R5_UltraScale_MPSoC/RTOSDemo_R5_bsp/psu_cortexr5_0/libsrc/uartps_v3_6/src/xuartps_hw.h
Update Zynq, MPSoc Cortex-A53 and MPSoc Cortex-R5 demo projects to build with the...
[freertos] / FreeRTOS / Demo / CORTEX_R5_UltraScale_MPSoC / RTOSDemo_R5_bsp / psu_cortexr5_0 / libsrc / uartps_v3_6 / src / xuartps_hw.h
1 /******************************************************************************
2 *
3 * Copyright (C) 2010 - 2017 Xilinx, Inc.  All rights reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 *
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
30 *
31 ******************************************************************************/
32 /*****************************************************************************/
33 /**
34 *
35 * @file xuartps_hw.h
36 * @addtogroup uartps_v3_5
37 * @{
38 *
39 * This header file contains the hardware interface of an XUartPs device.
40 *
41 * <pre>
42 * MODIFICATION HISTORY:
43 *
44 * Ver   Who    Date     Changes
45 * ----- ------ -------- ----------------------------------------------
46 * 1.00  drg/jz 01/12/10 First Release
47 * 1.03a sg     09/04/12 Added defines for XUARTPS_IXR_TOVR,  XUARTPS_IXR_TNFUL
48 *                       and XUARTPS_IXR_TTRIG.
49 *                       Modified the names of these defines
50 *                       XUARTPS_MEDEMSR_DCDX to XUARTPS_MODEMSR_DDCD
51 *                       XUARTPS_MEDEMSR_RIX to XUARTPS_MODEMSR_TERI
52 *                       XUARTPS_MEDEMSR_DSRX to XUARTPS_MODEMSR_DDSR
53 *                       XUARTPS_MEDEMSR_CTSX to XUARTPS_MODEMSR_DCTS
54 * 1.05a hk     08/22/13 Added prototype for uart reset and related
55 *                       constant definitions.
56 * 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
57 * 3.1   kvn    04/10/15 Modified code for latest RTL changes.
58 * 3.6   ms     02/16/18 Updates flow control mode offset value in
59 *                       modem control register.
60 *
61 * </pre>
62 *
63 ******************************************************************************/
64 #ifndef XUARTPS_HW_H            /* prevent circular inclusions */
65 #define XUARTPS_HW_H            /* by using protection macros */
66
67 #ifdef __cplusplus
68 extern "C" {
69 #endif
70
71 /***************************** Include Files *********************************/
72
73 #include "xil_types.h"
74 #include "xil_assert.h"
75 #include "xil_io.h"
76
77 /************************** Constant Definitions *****************************/
78
79 /** @name Register Map
80  *
81  * Register offsets for the UART.
82  * @{
83  */
84 #define XUARTPS_CR_OFFSET               0x0000U  /**< Control Register [8:0] */
85 #define XUARTPS_MR_OFFSET               0x0004U  /**< Mode Register [9:0] */
86 #define XUARTPS_IER_OFFSET              0x0008U  /**< Interrupt Enable [12:0] */
87 #define XUARTPS_IDR_OFFSET              0x000CU  /**< Interrupt Disable [12:0] */
88 #define XUARTPS_IMR_OFFSET              0x0010U  /**< Interrupt Mask [12:0] */
89 #define XUARTPS_ISR_OFFSET              0x0014U  /**< Interrupt Status [12:0]*/
90 #define XUARTPS_BAUDGEN_OFFSET  0x0018U  /**< Baud Rate Generator [15:0] */
91 #define XUARTPS_RXTOUT_OFFSET   0x001CU  /**< RX Timeout [7:0] */
92 #define XUARTPS_RXWM_OFFSET             0x0020U  /**< RX FIFO Trigger Level [5:0] */
93 #define XUARTPS_MODEMCR_OFFSET  0x0024U  /**< Modem Control [5:0] */
94 #define XUARTPS_MODEMSR_OFFSET  0x0028U  /**< Modem Status [8:0] */
95 #define XUARTPS_SR_OFFSET               0x002CU  /**< Channel Status [14:0] */
96 #define XUARTPS_FIFO_OFFSET             0x0030U  /**< FIFO [7:0] */
97 #define XUARTPS_BAUDDIV_OFFSET  0x0034U  /**< Baud Rate Divider [7:0] */
98 #define XUARTPS_FLOWDEL_OFFSET  0x0038U  /**< Flow Delay [5:0] */
99 #define XUARTPS_TXWM_OFFSET             0x0044U  /**< TX FIFO Trigger Level [5:0] */
100 #define XUARTPS_RXBS_OFFSET             0x0048U  /**< RX FIFO Byte Status [11:0] */
101 /* @} */
102
103 /** @name Control Register
104  *
105  * The Control register (CR) controls the major functions of the device.
106  *
107  * Control Register Bit Definition
108  */
109
110 #define XUARTPS_CR_STOPBRK      0x00000100U  /**< Stop transmission of break */
111 #define XUARTPS_CR_STARTBRK     0x00000080U  /**< Set break */
112 #define XUARTPS_CR_TORST        0x00000040U  /**< RX timeout counter restart */
113 #define XUARTPS_CR_TX_DIS       0x00000020U  /**< TX disabled. */
114 #define XUARTPS_CR_TX_EN        0x00000010U  /**< TX enabled */
115 #define XUARTPS_CR_RX_DIS       0x00000008U  /**< RX disabled. */
116 #define XUARTPS_CR_RX_EN        0x00000004U  /**< RX enabled */
117 #define XUARTPS_CR_EN_DIS_MASK  0x0000003CU  /**< Enable/disable Mask */
118 #define XUARTPS_CR_TXRST        0x00000002U  /**< TX logic reset */
119 #define XUARTPS_CR_RXRST        0x00000001U  /**< RX logic reset */
120 /* @}*/
121
122
123 /** @name Mode Register
124  *
125  * The mode register (MR) defines the mode of transfer as well as the data
126  * format. If this register is modified during transmission or reception,
127  * data validity cannot be guaranteed.
128  *
129  * Mode Register Bit Definition
130  * @{
131  */
132 #define XUARTPS_MR_CCLK                         0x00000400U /**< Input clock selection */
133 #define XUARTPS_MR_CHMODE_R_LOOP        0x00000300U /**< Remote loopback mode */
134 #define XUARTPS_MR_CHMODE_L_LOOP        0x00000200U /**< Local loopback mode */
135 #define XUARTPS_MR_CHMODE_ECHO          0x00000100U /**< Auto echo mode */
136 #define XUARTPS_MR_CHMODE_NORM          0x00000000U /**< Normal mode */
137 #define XUARTPS_MR_CHMODE_SHIFT                         8U  /**< Mode shift */
138 #define XUARTPS_MR_CHMODE_MASK          0x00000300U /**< Mode mask */
139 #define XUARTPS_MR_STOPMODE_2_BIT       0x00000080U /**< 2 stop bits */
140 #define XUARTPS_MR_STOPMODE_1_5_BIT     0x00000040U /**< 1.5 stop bits */
141 #define XUARTPS_MR_STOPMODE_1_BIT       0x00000000U /**< 1 stop bit */
142 #define XUARTPS_MR_STOPMODE_SHIFT                       6U  /**< Stop bits shift */
143 #define XUARTPS_MR_STOPMODE_MASK        0x000000A0U /**< Stop bits mask */
144 #define XUARTPS_MR_PARITY_NONE          0x00000020U /**< No parity mode */
145 #define XUARTPS_MR_PARITY_MARK          0x00000018U /**< Mark parity mode */
146 #define XUARTPS_MR_PARITY_SPACE         0x00000010U /**< Space parity mode */
147 #define XUARTPS_MR_PARITY_ODD           0x00000008U /**< Odd parity mode */
148 #define XUARTPS_MR_PARITY_EVEN          0x00000000U /**< Even parity mode */
149 #define XUARTPS_MR_PARITY_SHIFT                         3U  /**< Parity setting shift */
150 #define XUARTPS_MR_PARITY_MASK          0x00000038U /**< Parity mask */
151 #define XUARTPS_MR_CHARLEN_6_BIT        0x00000006U /**< 6 bits data */
152 #define XUARTPS_MR_CHARLEN_7_BIT        0x00000004U /**< 7 bits data */
153 #define XUARTPS_MR_CHARLEN_8_BIT        0x00000000U /**< 8 bits data */
154 #define XUARTPS_MR_CHARLEN_SHIFT                        1U  /**< Data Length shift */
155 #define XUARTPS_MR_CHARLEN_MASK         0x00000006U /**< Data length mask */
156 #define XUARTPS_MR_CLKSEL                       0x00000001U /**< Input clock selection */
157 /* @} */
158
159
160 /** @name Interrupt Registers
161  *
162  * Interrupt control logic uses the interrupt enable register (IER) and the
163  * interrupt disable register (IDR) to set the value of the bits in the
164  * interrupt mask register (IMR). The IMR determines whether to pass an
165  * interrupt to the interrupt status register (ISR).
166  * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an
167  * interrupt. IMR and ISR are read only, and IER and IDR are write only.
168  * Reading either IER or IDR returns 0x00.
169  *
170  * All four registers have the same bit definitions.
171  *
172  * @{
173  */
174 #define XUARTPS_IXR_RBRK        0x00002000U /**< Rx FIFO break detect interrupt */
175 #define XUARTPS_IXR_TOVR        0x00001000U /**< Tx FIFO Overflow interrupt */
176 #define XUARTPS_IXR_TNFUL       0x00000800U /**< Tx FIFO Nearly Full interrupt */
177 #define XUARTPS_IXR_TTRIG       0x00000400U /**< Tx Trig interrupt */
178 #define XUARTPS_IXR_DMS         0x00000200U /**< Modem status change interrupt */
179 #define XUARTPS_IXR_TOUT        0x00000100U /**< Timeout error interrupt */
180 #define XUARTPS_IXR_PARITY      0x00000080U /**< Parity error interrupt */
181 #define XUARTPS_IXR_FRAMING     0x00000040U /**< Framing error interrupt */
182 #define XUARTPS_IXR_OVER        0x00000020U /**< Overrun error interrupt */
183 #define XUARTPS_IXR_TXFULL      0x00000010U /**< TX FIFO full interrupt. */
184 #define XUARTPS_IXR_TXEMPTY     0x00000008U /**< TX FIFO empty interrupt. */
185 #define XUARTPS_IXR_RXFULL      0x00000004U /**< RX FIFO full interrupt. */
186 #define XUARTPS_IXR_RXEMPTY     0x00000002U /**< RX FIFO empty interrupt. */
187 #define XUARTPS_IXR_RXOVR       0x00000001U /**< RX FIFO trigger interrupt. */
188 #define XUARTPS_IXR_MASK        0x00003FFFU /**< Valid bit mask */
189 /* @} */
190
191
192 /** @name Baud Rate Generator Register
193  *
194  * The baud rate generator control register (BRGR) is a 16 bit register that
195  * controls the receiver bit sample clock and baud rate.
196  * Valid values are 1 - 65535.
197  *
198  * Bit Sample Rate = CCLK / BRGR, where the CCLK is selected by the MR_CCLK bit
199  * in the MR register.
200  * @{
201  */
202 #define XUARTPS_BAUDGEN_DISABLE         0x00000000U /**< Disable clock */
203 #define XUARTPS_BAUDGEN_MASK            0x0000FFFFU /**< Valid bits mask */
204 #define XUARTPS_BAUDGEN_RESET_VAL       0x0000028BU /**< Reset value */
205
206 /** @name Baud Divisor Rate register
207  *
208  * The baud rate divider register (BDIV) controls how much the bit sample
209  * rate is divided by. It sets the baud rate.
210  * Valid values are 0x04 to 0xFF. Writing a value less than 4 will be ignored.
211  *
212  * Baud rate = CCLK / ((BAUDDIV + 1) x BRGR), where the CCLK is selected by
213  * the MR_CCLK bit in the MR register.
214  * @{
215  */
216 #define XUARTPS_BAUDDIV_MASK        0x000000FFU /**< 8 bit baud divider mask */
217 #define XUARTPS_BAUDDIV_RESET_VAL   0x0000000FU /**< Reset value */
218 /* @} */
219
220
221 /** @name Receiver Timeout Register
222  *
223  * Use the receiver timeout register (RTR) to detect an idle condition on
224  * the receiver data line.
225  *
226  * @{
227  */
228 #define XUARTPS_RXTOUT_DISABLE          0x00000000U  /**< Disable time out */
229 #define XUARTPS_RXTOUT_MASK                     0x000000FFU  /**< Valid bits mask */
230
231 /** @name Receiver FIFO Trigger Level Register
232  *
233  * Use the Receiver FIFO Trigger Level Register (RTRIG) to set the value at
234  * which the RX FIFO triggers an interrupt event.
235  * @{
236  */
237
238 #define XUARTPS_RXWM_DISABLE    0x00000000U  /**< Disable RX trigger interrupt */
239 #define XUARTPS_RXWM_MASK               0x0000003FU  /**< Valid bits mask */
240 #define XUARTPS_RXWM_RESET_VAL  0x00000020U  /**< Reset value */
241 /* @} */
242
243 /** @name Transmit FIFO Trigger Level Register
244  *
245  * Use the Transmit FIFO Trigger Level Register (TTRIG) to set the value at
246  * which the TX FIFO triggers an interrupt event.
247  * @{
248  */
249
250 #define XUARTPS_TXWM_MASK               0x0000003FU  /**< Valid bits mask */
251 #define XUARTPS_TXWM_RESET_VAL  0x00000020U  /**< Reset value */
252 /* @} */
253
254 /** @name Modem Control Register
255  *
256  * This register (MODEMCR) controls the interface with the modem or data set,
257  * or a peripheral device emulating a modem.
258  *
259  * @{
260  */
261 #define XUARTPS_MODEMCR_FCM     0x00000020U  /**< Flow control mode */
262 #define XUARTPS_MODEMCR_RTS     0x00000002U  /**< Request to send */
263 #define XUARTPS_MODEMCR_DTR     0x00000001U  /**< Data terminal ready */
264 /* @} */
265
266 /** @name Modem Status Register
267  *
268  * This register (MODEMSR) indicates the current state of the control lines
269  * from a modem, or another peripheral device, to the CPU. In addition, four
270  * bits of the modem status register provide change information. These bits
271  * are set to a logic 1 whenever a control input from the modem changes state.
272  *
273  * Note: Whenever the DCTS, DDSR, TERI, or DDCD bit is set to logic 1, a modem
274  * status interrupt is generated and this is reflected in the modem status
275  * register.
276  *
277  * @{
278  */
279 #define XUARTPS_MODEMSR_FCMS    0x00000100U  /**< Flow control mode (FCMS) */
280 #define XUARTPS_MODEMSR_DCD             0x00000080U  /**< Complement of DCD input */
281 #define XUARTPS_MODEMSR_RI              0x00000040U  /**< Complement of RI input */
282 #define XUARTPS_MODEMSR_DSR             0x00000020U  /**< Complement of DSR input */
283 #define XUARTPS_MODEMSR_CTS             0x00000010U  /**< Complement of CTS input */
284 #define XUARTPS_MODEMSR_DDCD    0x00000008U  /**< Delta DCD indicator */
285 #define XUARTPS_MODEMSR_TERI  0x00000004U  /**< Trailing Edge Ring Indicator */
286 #define XUARTPS_MODEMSR_DDSR    0x00000002U  /**< Change of DSR */
287 #define XUARTPS_MODEMSR_DCTS    0x00000001U  /**< Change of CTS */
288 /* @} */
289
290 /** @name Channel Status Register
291  *
292  * The channel status register (CSR) is provided to enable the control logic
293  * to monitor the status of bits in the channel interrupt status register,
294  * even if these are masked out by the interrupt mask register.
295  *
296  * @{
297  */
298 #define XUARTPS_SR_TNFUL        0x00004000U /**< TX FIFO Nearly Full Status */
299 #define XUARTPS_SR_TTRIG        0x00002000U /**< TX FIFO Trigger Status */
300 #define XUARTPS_SR_FLOWDEL      0x00001000U /**< RX FIFO fill over flow delay */
301 #define XUARTPS_SR_TACTIVE      0x00000800U /**< TX active */
302 #define XUARTPS_SR_RACTIVE      0x00000400U /**< RX active */
303 #define XUARTPS_SR_TXFULL       0x00000010U /**< TX FIFO full */
304 #define XUARTPS_SR_TXEMPTY      0x00000008U /**< TX FIFO empty */
305 #define XUARTPS_SR_RXFULL       0x00000004U /**< RX FIFO full */
306 #define XUARTPS_SR_RXEMPTY      0x00000002U /**< RX FIFO empty */
307 #define XUARTPS_SR_RXOVR        0x00000001U /**< RX FIFO fill over trigger */
308 /* @} */
309
310 /** @name Flow Delay Register
311  *
312  * Operation of the flow delay register (FLOWDEL) is very similar to the
313  * receive FIFO trigger register. An internal trigger signal activates when the
314  * FIFO is filled to the level set by this register. This trigger will not
315  * cause an interrupt, although it can be read through the channel status
316  * register. In hardware flow control mode, RTS is deactivated when the trigger
317  * becomes active. RTS only resets when the FIFO level is four less than the
318  * level of the flow delay trigger and the flow delay trigger is not activated.
319  * A value less than 4 disables the flow delay.
320  * @{
321  */
322 #define XUARTPS_FLOWDEL_MASK    XUARTPS_RXWM_MASK       /**< Valid bit mask */
323 /* @} */
324
325 /** @name Receiver FIFO Byte Status Register
326  *
327  * The Receiver FIFO Status register is used to have a continuous
328  * monitoring of the raw unmasked byte status information. The register
329  * contains frame, parity and break status information for the top
330  * four bytes in the RX FIFO.
331  *
332  * Receiver FIFO Byte Status Register Bit Definition
333  * @{
334  */
335 #define XUARTPS_RXBS_BYTE3_BRKE         0x00000800U /**< Byte3 Break Error */
336 #define XUARTPS_RXBS_BYTE3_FRME         0x00000400U /**< Byte3 Frame Error */
337 #define XUARTPS_RXBS_BYTE3_PARE         0x00000200U /**< Byte3 Parity Error */
338 #define XUARTPS_RXBS_BYTE2_BRKE         0x00000100U /**< Byte2 Break Error */
339 #define XUARTPS_RXBS_BYTE2_FRME         0x00000080U /**< Byte2 Frame Error */
340 #define XUARTPS_RXBS_BYTE2_PARE         0x00000040U /**< Byte2 Parity Error */
341 #define XUARTPS_RXBS_BYTE1_BRKE         0x00000020U /**< Byte1 Break Error */
342 #define XUARTPS_RXBS_BYTE1_FRME         0x00000010U /**< Byte1 Frame Error */
343 #define XUARTPS_RXBS_BYTE1_PARE         0x00000008U /**< Byte1 Parity Error */
344 #define XUARTPS_RXBS_BYTE0_BRKE         0x00000004U /**< Byte0 Break Error */
345 #define XUARTPS_RXBS_BYTE0_FRME         0x00000002U /**< Byte0 Frame Error */
346 #define XUARTPS_RXBS_BYTE0_PARE         0x00000001U /**< Byte0 Parity Error */
347 #define XUARTPS_RXBS_MASK               0x00000007U /**< 3 bit RX byte status mask */
348 /* @} */
349
350
351 /*
352  * Defines for backwards compatabilty, will be removed
353  * in the next version of the driver
354  */
355 #define XUARTPS_MEDEMSR_DCDX  XUARTPS_MODEMSR_DDCD
356 #define XUARTPS_MEDEMSR_RIX   XUARTPS_MODEMSR_TERI
357 #define XUARTPS_MEDEMSR_DSRX  XUARTPS_MODEMSR_DDSR
358 #define XUARTPS_MEDEMSR_CTSX  XUARTPS_MODEMSR_DCTS
359
360
361
362 /**************************** Type Definitions *******************************/
363
364
365 /***************** Macros (Inline Functions) Definitions *********************/
366
367 /****************************************************************************/
368 /**
369 * Read a UART register.
370 *
371 * @param        BaseAddress contains the base address of the device.
372 * @param        RegOffset contains the offset from the base address of the
373 *               device.
374 *
375 * @return       The value read from the register.
376 *
377 * @note         C-Style signature:
378 *               u32 XUartPs_ReadReg(u32 BaseAddress, int RegOffset)
379 *
380 ******************************************************************************/
381 #define XUartPs_ReadReg(BaseAddress, RegOffset) \
382         Xil_In32((BaseAddress) + (u32)(RegOffset))
383
384 /***************************************************************************/
385 /**
386 * Write a UART register.
387 *
388 * @param        BaseAddress contains the base address of the device.
389 * @param        RegOffset contains the offset from the base address of the
390 *               device.
391 * @param        RegisterValue is the value to be written to the register.
392 *
393 * @return       None.
394 *
395 * @note         C-Style signature:
396 *               void XUartPs_WriteReg(u32 BaseAddress, int RegOffset,
397 *                                                  u16 RegisterValue)
398 *
399 ******************************************************************************/
400 #define XUartPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \
401         Xil_Out32((BaseAddress) + (u32)(RegOffset), (u32)(RegisterValue))
402
403 /****************************************************************************/
404 /**
405 * Determine if there is receive data in the receiver and/or FIFO.
406 *
407 * @param        BaseAddress contains the base address of the device.
408 *
409 * @return       TRUE if there is receive data, FALSE otherwise.
410 *
411 * @note         C-Style signature:
412 *               u32 XUartPs_IsReceiveData(u32 BaseAddress)
413 *
414 ******************************************************************************/
415 #define XUartPs_IsReceiveData(BaseAddress)                       \
416         !((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) &        \
417         (u32)XUARTPS_SR_RXEMPTY) == (u32)XUARTPS_SR_RXEMPTY)
418
419 /****************************************************************************/
420 /**
421 * Determine if a byte of data can be sent with the transmitter.
422 *
423 * @param        BaseAddress contains the base address of the device.
424 *
425 * @return       TRUE if the TX FIFO is full, FALSE if a byte can be put in the
426 *               FIFO.
427 *
428 * @note         C-Style signature:
429 *               u32 XUartPs_IsTransmitFull(u32 BaseAddress)
430 *
431 ******************************************************************************/
432 #define XUartPs_IsTransmitFull(BaseAddress)                      \
433         ((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) &         \
434          (u32)XUARTPS_SR_TXFULL) == (u32)XUARTPS_SR_TXFULL)
435
436 /************************** Function Prototypes ******************************/
437
438 void XUartPs_SendByte(u32 BaseAddress, u8 Data);
439
440 u8 XUartPs_RecvByte(u32 BaseAddress);
441
442 void XUartPs_ResetHw(u32 BaseAddress);
443
444 /************************** Variable Definitions *****************************/
445
446 #ifdef __cplusplus
447 }
448 #endif
449
450 #endif /* end of protection macro */
451 /** @} */