embox

Форк
0
127 строк · 3.3 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @author  Andrew Bursian
6
 * @date    20.02.2023
7
 */
8

9
#include <stdint.h>
10
#include <hal/reg.h>
11
#include <drivers/diag.h>
12
#include <drivers/serial/uart_dev.h>
13
#include <drivers/serial/diag_serial.h>
14

15
#include <framework/mod/options.h>
16

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

21
/* UART Registers */
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)
33

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
40

41
/* Flag register */
42
#define FR_RXFE         0x10 /* Receive FIFO empty */
43
#define FR_TXFF         0x20 /* Transmit FIFO full */
44

45
#define IMSC_RXIM       (0x1 << 4)
46

47
#include "uart_setup_hw_board_config.inc"
48

49
static void niiet_uart_set_baudrate(struct uart *dev) {
50
	/* FIXME Init baud rate only if UARTCLK is really used.
51
	 * Currenly it is not so for the teplates which use pl011. */
52
#if UARTCLK != 0
53
	uint32_t baud_rate;
54
	int ibrd, fbrd;
55

56
	/* Baud Rate Divisor = UARTCLK/(16×Baud Rate) = BRDI + BRDF,
57
	 * See 2.4.3 UART operation.  */
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);
63
#endif
64
}
65

66
static int niiet_uart_setup(struct uart *dev, const struct uart_params *params) {
67
	uart_setup_hw(dev);
68

69
	/* Disable uart. */
70
	REG32_STORE(UART_CR(dev->base_addr), 0);
71

72
	if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
73
		REG32_STORE(UART_IMSC(dev->base_addr), IMSC_RXIM);
74
	}
75

76
	niiet_uart_set_baudrate(dev);
77

78
	/* Word len 8 bit. */
79
	REG32_STORE(UART_LCRH(dev->base_addr), UART_WLEN_8BIT << UART_WLEN_SHIFT);
80

81
	/* Enable uart. */
82
	REG32_STORE(UART_CR(dev->base_addr), UART_UARTEN | UART_TXE | UART_RXE);
83

84
	return 0;
85
}
86

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);
91
	}
92
	return 0;
93
}
94

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);
98

99
	return 0;
100
}
101

102
static int niiet_uart_putc(struct uart *dev, int ch) {
103
	while (REG32_LOAD(UART_FR(dev->base_addr)) & FR_TXFF) {
104
		;
105
	}
106

107
	REG32_STORE(UART_DR(dev->base_addr), (uint32_t)ch);
108

109
	return 0;
110
}
111

112
static int niiet_uart_hasrx(struct uart *dev) {
113
	return !(REG32_LOAD(UART_FR(dev->base_addr)) & FR_RXFE);
114
}
115

116
static int niiet_uart_getc(struct uart *dev) {
117
	return REG32_LOAD(UART_DR(dev->base_addr));
118
}
119

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,
127
};
128

129

130

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

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

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

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