6 * 16550-compatible UART
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
14 /** Transmitter holding register */
17 /** Receiver buffer register */
20 /** Interrupt enable register */
23 /** FIFO control register */
25 #define UART_FCR_FE 0x01 /**< FIFO enable */
27 /** Line control register */
29 #define UART_LCR_WLS0 0x01 /**< Word length select bit 0 */
30 #define UART_LCR_WLS1 0x02 /**< Word length select bit 1 */
31 #define UART_LCR_STB 0x04 /**< Number of stop bits */
32 #define UART_LCR_PEN 0x08 /**< Parity enable */
33 #define UART_LCR_EPS 0x10 /**< Even parity select */
34 #define UART_LCR_DLAB 0x80 /**< Divisor latch access bit */
36 #define UART_LCR_WORD_LEN(x) ( ( (x) - 5 ) << 0 ) /**< Word length */
37 #define UART_LCR_STOP_BITS(x) ( ( (x) - 1 ) << 2 ) /**< Stop bits */
38 #define UART_LCR_PARITY(x) ( ( (x) - 0 ) << 3 ) /**< Parity */
41 * Calculate line control register value
43 * @v word_len Word length (5-8)
44 * @v parity Parity (0=none, 1=odd, 3=even)
45 * @v stop_bits Stop bits (1-2)
46 * @ret lcr Line control register value
48 #define UART_LCR_WPS( word_len, parity, stop_bits ) \
49 ( UART_LCR_WORD_LEN ( (word_len) ) | \
50 UART_LCR_PARITY ( (parity) ) | \
51 UART_LCR_STOP_BITS ( (stop_bits) ) )
53 /** Default LCR value: 8 data bits, no parity, one stop bit */
54 #define UART_LCR_8N1 UART_LCR_WPS ( 8, 0, 1 )
56 /** Modem control register */
58 #define UART_MCR_DTR 0x01 /**< Data terminal ready */
59 #define UART_MCR_RTS 0x02 /**< Request to send */
61 /** Line status register */
63 #define UART_LSR_DR 0x01 /**< Data ready */
64 #define UART_LSR_THRE 0x20 /**< Transmitter holding register empty */
65 #define UART_LSR_TEMT 0x40 /**< Transmitter empty */
67 /** Scratch register */
70 /** Divisor latch (least significant byte) */
73 /** Divisor latch (most significant byte) */
76 /** Maximum baud rate */
77 #define UART_MAX_BAUD 115200
79 /** A 16550-compatible UART */
81 /** I/O port base address */
83 /** Baud rate divisor */
85 /** Line control register */
89 /** Symbolic names for port indexes */
97 #include <bits/uart.h>
99 void uart_write ( struct uart *uart, unsigned int addr, uint8_t data );
100 uint8_t uart_read ( struct uart *uart, unsigned int addr );
101 int uart_select ( struct uart *uart, unsigned int port );
104 * Check if received data is ready
107 * @ret ready Data is ready
109 static inline int uart_data_ready ( struct uart *uart ) {
112 lsr = uart_read ( uart, UART_LSR );
113 return ( lsr & UART_LSR_DR );
122 static inline uint8_t uart_receive ( struct uart *uart ) {
124 return uart_read ( uart, UART_RBR );
127 extern void uart_transmit ( struct uart *uart, uint8_t data );
128 extern void uart_flush ( struct uart *uart );
129 extern int uart_exists ( struct uart *uart );
130 extern int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr );
132 #endif /* _IPXE_UART_H */