embox

Форк
0
118 строк · 3.0 Кб
1
/**
2
 * @file
3
 * @brief This file implemented functions for work with xilix uart
4
 *        (for microblaze)
5
 *
6
 * @date 19.11.09
7
 * @author Anton Bondarev
8
 */
9

10
#include <stdint.h>
11

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>
20

21
#include <module/embox/driver/serial/xuartlite.h>
22

23
EMBOX_UNIT_INIT(xuartlite_init);
24

25
#define UARTLITE_BASEADDR OPTION_GET(NUMBER,xuartlite_base)
26
#define UARTLITE_IRQ_NUM  OPTION_GET(NUMBER,irq_num)
27

28
/* There is no buad rate setup in QEMU, so it is unused. */
29
#define UARTLITE_BAUD_RATE 115200
30

31
struct xuartlite_regs {
32
	uint32_t rx_data;
33
	uint32_t tx_data;
34
	uint32_t status;
35
	uint32_t ctrl;
36
};
37

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
47

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
52

53
/*set registers base*/
54
static volatile struct xuartlite_regs *xuartlite_regs =
55
		(struct xuartlite_regs *) UARTLITE_BASEADDR;
56

57
static inline int xuartlite_is_rx_empty(void) {
58
	return !(xuartlite_regs->status & STATUS_RX_FIFO_VALID_DATA);
59
}
60

61
static inline int xuartlite_can_tx_trans(void) {
62
	return !(xuartlite_regs->status & STATUS_TX_FIFO_FULL);
63
}
64

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;
68
	}
69

70
	return 0;
71
}
72

73
static int xuartlite_putc(struct uart *dev, int ch) {
74
	while (!xuartlite_can_tx_trans()) {
75
	}
76
	xuartlite_regs->tx_data = (unsigned int)ch;
77

78
	return 0;
79
}
80

81
static int xuartlite_getc(struct uart *dev) {
82
	return xuartlite_regs->rx_data & 0xFF;
83
}
84

85
static int xuartlite_has_symbol(struct uart *dev) {
86
	return !xuartlite_is_rx_empty();
87
}
88

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,
94
};
95

96
static struct uart uart0 = {
97
		.uart_ops = &xuartlite_uart_ops,
98
		.irq_num = UARTLITE_IRQ_NUM,
99
		.base_addr = UARTLITE_BASEADDR,
100
};
101

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,
105
};
106

107
static const struct uart_params uart_diag_params = {
108
		.baud_rate = UARTLITE_BAUD_RATE,
109
		.uart_param_flags = UART_PARAM_FLAGS_8BIT_WORD,
110
};
111

112
DIAG_SERIAL_DEF(&uart0, &uart_diag_params);
113

114
static int xuartlite_init(void) {
115
	return uart_register(&uart0, &uart_defparams);
116
}
117

118
PERIPH_MEMORY_DEFINE(xuartlite, UARTLITE_BASEADDR, sizeof(struct xuartlite_regs));
119

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.