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