11
#include <drivers/serial/uart_dev.h>
12
#include <framework/mod/options.h>
15
#define UARTCLK OPTION_GET(NUMBER, uartclk)
16
#define USE_BOARD_CONF OPTION_GET(BOOLEAN, use_bconf)
19
#define UART_DR(base) (base + 0x00)
20
#define UART_RSR(base) (base + 0x04)
21
#define UART_ECR(base) (base + 0x04)
22
#define UART_FR(base) (base + 0x18)
23
#define UART_IBRD(base) (base + 0x24)
24
#define UART_FBRD(base) (base + 0x28)
25
#define UART_LCRH(base) (base + 0x2c)
26
#define UART_CR(base) (base + 0x30)
27
#define UART_IMSC(base) (base + 0x38)
28
#define UART_MIS(base) (base + 0x40)
29
#define UART_ICR(base) (base + 0x44)
31
#define UART_FEN (1 << 4)
32
#define UART_UARTEN (1 << 0)
33
#define UART_TXE (1 << 8)
34
#define UART_RXE (1 << 9)
35
#define UART_WLEN_8BIT 0x3
36
#define UART_WLEN_SHIFT 5
42
#define IMSC_RXIM (0x1 << 4)
45
#include "uart_setup_hw_board_config.inc"
47
static inline int uart_setup_hw(struct uart *dev) {
52
static void pl011_set_baudrate(struct uart *dev) {
61
baud_rate = dev->params.baud_rate;
62
ibrd = (UARTCLK / (16 * baud_rate));
63
fbrd = ((UARTCLK % (16 * baud_rate)) * 64) / (16 * baud_rate);
64
REG32_STORE(UART_IBRD(dev->base_addr), ibrd);
65
REG32_STORE(UART_FBRD(dev->base_addr), fbrd);
69
static int pl011_irq_enable(struct uart *dev,
70
const struct uart_params *params) {
71
if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
72
REG32_STORE(UART_IMSC(dev->base_addr), IMSC_RXIM);
77
static int pl011_irq_disable(struct uart *dev,
78
const struct uart_params *params) {
79
REG32_STORE(UART_IMSC(dev->base_addr), 0);
84
static int pl011_setup(struct uart *dev, const struct uart_params *params) {
86
REG32_STORE(UART_CR(dev->base_addr), 0);
90
if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
91
REG32_STORE(UART_IMSC(dev->base_addr), IMSC_RXIM);
94
pl011_set_baudrate(dev);
97
REG32_STORE(UART_LCRH(dev->base_addr), UART_WLEN_8BIT << UART_WLEN_SHIFT);
100
REG32_STORE(UART_CR(dev->base_addr), UART_UARTEN | UART_TXE | UART_RXE);
105
static int pl011_putc(struct uart *dev, int ch) {
106
while (REG32_LOAD(UART_FR(dev->base_addr)) & FR_TXFF)
109
REG32_STORE(UART_DR(dev->base_addr), (uint32_t)ch);
114
static int pl011_getc(struct uart *dev) {
115
return REG32_LOAD(UART_DR(dev->base_addr));
118
static int pl011_has_symbol(struct uart *dev) {
119
return !(REG32_LOAD(UART_FR(dev->base_addr)) & FR_RXFE);
122
const struct uart_ops pl011_uart_ops = {
123
.uart_getc = pl011_getc,
124
.uart_putc = pl011_putc,
125
.uart_hasrx = pl011_has_symbol,
126
.uart_setup = pl011_setup,
127
.uart_irq_en = pl011_irq_enable,
128
.uart_irq_dis = pl011_irq_disable,