11
#include <drivers/diag.h>
12
#include <drivers/serial/uart_dev.h>
13
#include <drivers/serial/diag_serial.h>
15
#include <framework/mod/options.h>
17
#define UARTCLK OPTION_GET(NUMBER, uartclk)
18
#define BAUD_ICOEF(baud_rate) (UARTCLK / (16 * baud_rate))
19
#define BAUD_FCOEF(baud_rate) ((UARTCLK / (16.0f * baud_rate) - BAUD_ICOEF(baud_rate)) * 64 + 0.5f)
22
#define UART_DR(base) (base + 0x00)
23
#define UART_RSR(base) (base + 0x04)
24
#define UART_ECR(base) (base + 0x04)
25
#define UART_FR(base) (base + 0x18)
26
#define UART_IBRD(base) (base + 0x24)
27
#define UART_FBRD(base) (base + 0x28)
28
#define UART_LCRH(base) (base + 0x2c)
29
#define UART_CR(base) (base + 0x30)
30
#define UART_IMSC(base) (base + 0x38)
31
#define UART_MIS(base) (base + 0x40)
32
#define UART_ICR(base) (base + 0x44)
34
#define UART_FEN (1 << 4)
35
#define UART_UARTEN (1 << 0)
36
#define UART_TXE (1 << 8)
37
#define UART_RXE (1 << 9)
38
#define UART_WLEN_8BIT 0x3
39
#define UART_WLEN_SHIFT 5
45
#define IMSC_RXIM (0x1 << 4)
47
#include "uart_setup_hw_board_config.inc"
49
static void niiet_uart_set_baudrate(struct uart *dev) {
58
baud_rate = dev->params.baud_rate;
59
ibrd = BAUD_ICOEF(baud_rate);
60
fbrd = BAUD_FCOEF(baud_rate);
61
REG32_STORE(UART_IBRD(dev->base_addr), ibrd);
62
REG32_STORE(UART_FBRD(dev->base_addr), fbrd);
66
static int niiet_uart_setup(struct uart *dev, const struct uart_params *params) {
70
REG32_STORE(UART_CR(dev->base_addr), 0);
72
if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
73
REG32_STORE(UART_IMSC(dev->base_addr), IMSC_RXIM);
76
niiet_uart_set_baudrate(dev);
79
REG32_STORE(UART_LCRH(dev->base_addr), UART_WLEN_8BIT << UART_WLEN_SHIFT);
82
REG32_STORE(UART_CR(dev->base_addr), UART_UARTEN | UART_TXE | UART_RXE);
87
static int niiet_uart_irq_enable(struct uart *dev,
88
const struct uart_params *params) {
89
if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
90
REG32_STORE(UART_IMSC(dev->base_addr), IMSC_RXIM);
95
static int niiet_uart_irq_disable(struct uart *dev,
96
const struct uart_params *params) {
97
REG32_STORE(UART_IMSC(dev->base_addr), 0);
102
static int niiet_uart_putc(struct uart *dev, int ch) {
103
while (REG32_LOAD(UART_FR(dev->base_addr)) & FR_TXFF) {
107
REG32_STORE(UART_DR(dev->base_addr), (uint32_t)ch);
112
static int niiet_uart_hasrx(struct uart *dev) {
113
return !(REG32_LOAD(UART_FR(dev->base_addr)) & FR_RXFE);
116
static int niiet_uart_getc(struct uart *dev) {
117
return REG32_LOAD(UART_DR(dev->base_addr));
120
const struct uart_ops niiet_uart_ops = {
121
.uart_setup = niiet_uart_setup,
122
.uart_putc = niiet_uart_putc,
123
.uart_hasrx = niiet_uart_hasrx,
124
.uart_getc = niiet_uart_getc,
125
.uart_irq_en = niiet_uart_irq_enable,
126
.uart_irq_dis = niiet_uart_irq_disable,