3
* @brief This file implemented functions for work with xilix uart
7
* @author Anton Bondarev
12
#include <asm/bitops.h>
13
#include <kernel/irq.h>
14
#include <embox/unit.h>
15
#include <framework/mod/options.h>
16
#include <drivers/common/memory.h>
17
#include <drivers/diag.h>
18
#include <drivers/serial/uart_dev.h>
19
#include <drivers/serial/diag_serial.h>
21
#include <module/embox/driver/serial/xuartlite.h>
23
EMBOX_UNIT_INIT(xuartlite_init);
25
#define UARTLITE_BASEADDR OPTION_GET(NUMBER,xuartlite_base)
26
#define UARTLITE_IRQ_NUM OPTION_GET(NUMBER,irq_num)
28
/* There is no buad rate setup in QEMU, so it is unused. */
29
#define UARTLITE_BAUD_RATE 115200
31
struct xuartlite_regs {
38
/* status registers bit definitions */
39
#define STATUS_PAR_ERROR 0x80
40
#define STATUS_FRAME_ERROR 0x40
41
#define STATUS_OVERUN_ERROR 0x20
42
#define STATUS_INTR_ENABLED 0x10
43
#define STATUS_TX_FIFO_FULL 0x08
44
#define STATUS_TX_FIFO_EMPTY 0x04
45
#define STATUS_RX_FIFO_FULL 0x02
46
#define STATUS_RX_FIFO_VALID_DATA 0x01
48
/* ctrl registers bit definitions */
49
#define CTRL_ENABLE_INTR 0x10
50
#define CTRL_RST_RX_FIFO 0x02
51
#define CTRL_RST_TX_FIFO 0x01
54
static volatile struct xuartlite_regs *xuartlite_regs =
55
(struct xuartlite_regs *) UARTLITE_BASEADDR;
57
static inline int xuartlite_is_rx_empty(void) {
58
return !(xuartlite_regs->status & STATUS_RX_FIFO_VALID_DATA);
61
static inline int xuartlite_can_tx_trans(void) {
62
return !(xuartlite_regs->status & STATUS_TX_FIFO_FULL);
65
static int xuartlite_setup(struct uart *dev, const struct uart_params *params) {
66
if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
67
xuartlite_regs->ctrl |= CTRL_ENABLE_INTR;
73
static int xuartlite_putc(struct uart *dev, int ch) {
74
while (!xuartlite_can_tx_trans()) {
76
xuartlite_regs->tx_data = (unsigned int)ch;
81
static int xuartlite_getc(struct uart *dev) {
82
return xuartlite_regs->rx_data & 0xFF;
85
static int xuartlite_has_symbol(struct uart *dev) {
86
return !xuartlite_is_rx_empty();
89
static const struct uart_ops xuartlite_uart_ops = {
90
.uart_getc = xuartlite_getc,
91
.uart_putc = xuartlite_putc,
92
.uart_hasrx = xuartlite_has_symbol,
93
.uart_setup = xuartlite_setup,
96
static struct uart uart0 = {
97
.uart_ops = &xuartlite_uart_ops,
98
.irq_num = UARTLITE_IRQ_NUM,
99
.base_addr = UARTLITE_BASEADDR,
102
static const struct uart_params uart_defparams = {
103
.baud_rate = UARTLITE_BAUD_RATE,
104
.uart_param_flags = UART_PARAM_FLAGS_8BIT_WORD | UART_PARAM_FLAGS_USE_IRQ,
107
static const struct uart_params uart_diag_params = {
108
.baud_rate = UARTLITE_BAUD_RATE,
109
.uart_param_flags = UART_PARAM_FLAGS_8BIT_WORD,
112
DIAG_SERIAL_DEF(&uart0, &uart_diag_params);
114
static int xuartlite_init(void) {
115
return uart_register(&uart0, &uart_defparams);
118
PERIPH_MEMORY_DEFINE(xuartlite, UARTLITE_BASEADDR, sizeof(struct xuartlite_regs));