1 /******************************************************************************
3 * Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved.
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:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
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.
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
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.
31 ******************************************************************************/
32 /*****************************************************************************/
37 * This header file contains the hardware interface of an XUartPs device.
40 * MODIFICATION HISTORY:
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.
58 ******************************************************************************/
59 #ifndef XUARTPS_HW_H /* prevent circular inclusions */
60 #define XUARTPS_HW_H /* by using protection macros */
66 /***************************** Include Files *********************************/
68 #include "xil_types.h"
69 #include "xil_assert.h"
72 /************************** Constant Definitions *****************************/
74 /** @name Register Map
76 * Register offsets for the UART.
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] */
97 /** @name Control Register
99 * The Control register (CR) controls the major functions of the device.
101 * Control Register Bit Definition
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 */
117 /** @name Mode Register
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.
123 * Mode Register Bit Definition
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 */
154 /** @name Interrupt Registers
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.
164 * All four registers have the same bit definitions.
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 */
185 /** @name Baud Rate Generator Register
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.
191 * Bit Sample Rate = CCLK / BRGR, where the CCLK is selected by the MR_CCLK bit
192 * in the MR register.
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 */
199 /** @name Baud Divisor Rate register
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.
205 * Baud rate = CCLK / ((BAUDDIV + 1) x BRGR), where the CCLK is selected by
206 * the MR_CCLK bit in the MR register.
209 #define XUARTPS_BAUDDIV_MASK 0x000000FFU /**< 8 bit baud divider mask */
210 #define XUARTPS_BAUDDIV_RESET_VAL 0x0000000FU /**< Reset value */
214 /** @name Receiver Timeout Register
216 * Use the receiver timeout register (RTR) to detect an idle condition on
217 * the receiver data line.
221 #define XUARTPS_RXTOUT_DISABLE 0x00000000U /**< Disable time out */
222 #define XUARTPS_RXTOUT_MASK 0x000000FFU /**< Valid bits mask */
224 /** @name Receiver FIFO Trigger Level Register
226 * Use the Receiver FIFO Trigger Level Register (RTRIG) to set the value at
227 * which the RX FIFO triggers an interrupt event.
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 */
236 /** @name Transmit FIFO Trigger Level Register
238 * Use the Transmit FIFO Trigger Level Register (TTRIG) to set the value at
239 * which the TX FIFO triggers an interrupt event.
243 #define XUARTPS_TXWM_MASK 0x0000003FU /**< Valid bits mask */
244 #define XUARTPS_TXWM_RESET_VAL 0x00000020U /**< Reset value */
247 /** @name Modem Control Register
249 * This register (MODEMCR) controls the interface with the modem or data set,
250 * or a peripheral device emulating a modem.
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 */
259 /** @name Modem Status Register
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.
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
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 */
283 /** @name Channel Status Register
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.
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 */
308 /** @name Flow Delay Register
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.
320 #define XUARTPS_FLOWDEL_MASK XUARTPS_RXWM_MASK /**< Valid bit mask */
326 * Defines for backwards compatabilty, will be removed
327 * in the next version of the driver
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
336 /**************************** Type Definitions *******************************/
339 /***************** Macros (Inline Functions) Definitions *********************/
341 /****************************************************************************/
343 * Read a UART register.
345 * @param BaseAddress contains the base address of the device.
346 * @param RegOffset contains the offset from the base address of the
349 * @return The value read from the register.
351 * @note C-Style signature:
352 * u32 XUartPs_ReadReg(u32 BaseAddress, int RegOffset)
354 ******************************************************************************/
355 #define XUartPs_ReadReg(BaseAddress, RegOffset) \
356 Xil_In32((BaseAddress) + (u32)(RegOffset))
358 /***************************************************************************/
360 * Write a UART register.
362 * @param BaseAddress contains the base address of the device.
363 * @param RegOffset contains the offset from the base address of the
365 * @param RegisterValue is the value to be written to the register.
369 * @note C-Style signature:
370 * void XUartPs_WriteReg(u32 BaseAddress, int RegOffset,
373 ******************************************************************************/
374 #define XUartPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \
375 Xil_Out32((BaseAddress) + (u32)(RegOffset), (u32)(RegisterValue))
377 /****************************************************************************/
379 * Determine if there is receive data in the receiver and/or FIFO.
381 * @param BaseAddress contains the base address of the device.
383 * @return TRUE if there is receive data, FALSE otherwise.
385 * @note C-Style signature:
386 * u32 XUartPs_IsReceiveData(u32 BaseAddress)
388 ******************************************************************************/
389 #define XUartPs_IsReceiveData(BaseAddress) \
390 !((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \
391 (u32)XUARTPS_SR_RXEMPTY) == (u32)XUARTPS_SR_RXEMPTY)
393 /****************************************************************************/
395 * Determine if a byte of data can be sent with the transmitter.
397 * @param BaseAddress contains the base address of the device.
399 * @return TRUE if the TX FIFO is full, FALSE if a byte can be put in the
402 * @note C-Style signature:
403 * u32 XUartPs_IsTransmitFull(u32 BaseAddress)
405 ******************************************************************************/
406 #define XUartPs_IsTransmitFull(BaseAddress) \
407 ((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \
408 (u32)XUARTPS_SR_TXFULL) == (u32)XUARTPS_SR_TXFULL)
410 /************************** Function Prototypes ******************************/
412 void XUartPs_SendByte(u32 BaseAddress, u8 Data);
414 u8 XUartPs_RecvByte(u32 BaseAddress);
416 void XUartPs_ResetHw(u32 BaseAddress);
418 /************************** Variable Definitions *****************************/
424 #endif /* end of protection macro */