~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/ipxe/src/include/ipxe/uart.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _IPXE_UART_H
 
2
#define _IPXE_UART_H
 
3
 
 
4
/** @file
 
5
 *
 
6
 * 16550-compatible UART
 
7
 *
 
8
 */
 
9
 
 
10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
11
 
 
12
#include <stdint.h>
 
13
 
 
14
/** Transmitter holding register */
 
15
#define UART_THR 0x00
 
16
 
 
17
/** Receiver buffer register */
 
18
#define UART_RBR 0x00
 
19
 
 
20
/** Interrupt enable register */
 
21
#define UART_IER 0x01
 
22
 
 
23
/** FIFO control register */
 
24
#define UART_FCR 0x02
 
25
#define UART_FCR_FE     0x01    /**< FIFO enable */
 
26
 
 
27
/** Line control register */
 
28
#define UART_LCR 0x03
 
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 */
 
35
 
 
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 */
 
39
 
 
40
/**
 
41
 * Calculate line control register value
 
42
 *
 
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
 
47
 */
 
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) ) )
 
52
 
 
53
/** Default LCR value: 8 data bits, no parity, one stop bit */
 
54
#define UART_LCR_8N1 UART_LCR_WPS ( 8, 0, 1 )
 
55
 
 
56
/** Modem control register */
 
57
#define UART_MCR 0x04
 
58
#define UART_MCR_DTR    0x01    /**< Data terminal ready */
 
59
#define UART_MCR_RTS    0x02    /**< Request to send */
 
60
 
 
61
/** Line status register */
 
62
#define UART_LSR 0x05
 
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 */
 
66
 
 
67
/** Scratch register */
 
68
#define UART_SCR 0x07
 
69
 
 
70
/** Divisor latch (least significant byte) */
 
71
#define UART_DLL 0x00
 
72
 
 
73
/** Divisor latch (most significant byte) */
 
74
#define UART_DLM 0x01
 
75
 
 
76
/** Maximum baud rate */
 
77
#define UART_MAX_BAUD 115200
 
78
 
 
79
/** A 16550-compatible UART */
 
80
struct uart {
 
81
        /** I/O port base address */
 
82
        void *base;
 
83
        /** Baud rate divisor */
 
84
        uint16_t divisor;
 
85
        /** Line control register */
 
86
        uint8_t lcr;
 
87
};
 
88
 
 
89
/** Symbolic names for port indexes */
 
90
enum uart_port {
 
91
        COM1 = 1,
 
92
        COM2 = 2,
 
93
        COM3 = 3,
 
94
        COM4 = 4,
 
95
};
 
96
 
 
97
#include <bits/uart.h>
 
98
 
 
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 );
 
102
 
 
103
/**
 
104
 * Check if received data is ready
 
105
 *
 
106
 * @v uart              UART
 
107
 * @ret ready           Data is ready
 
108
 */
 
109
static inline int uart_data_ready ( struct uart *uart ) {
 
110
        uint8_t lsr;
 
111
 
 
112
        lsr = uart_read ( uart, UART_LSR );
 
113
        return ( lsr & UART_LSR_DR );
 
114
}
 
115
 
 
116
/**
 
117
 * Receive data
 
118
 *
 
119
 * @v uart              UART
 
120
 * @ret data            Data
 
121
 */
 
122
static inline uint8_t uart_receive ( struct uart *uart ) {
 
123
 
 
124
        return uart_read ( uart, UART_RBR );
 
125
}
 
126
 
 
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 );
 
131
 
 
132
#endif /* _IPXE_UART_H */