embox

Форк
0
76 строк · 1.7 Кб
1
/**
2
 * @file
3
 *
4
 * @date Mar 11, 2023
5
 * @author Anton Bondarev
6
 */
7

8
#include <stdint.h>
9

10
#include <hal/reg.h>
11

12
#include <drivers/serial/uart_dev.h>
13
#include <drivers/serial/diag_serial.h>
14

15
#include "muart.h"
16

17
static int muart_uart_setup(struct uart *dev, const struct uart_params *params) {
18
	struct muart_regs *regs = (struct muart_regs *)dev->base_addr;
19

20
	REG32_STORE(&regs->bdiv, 50000000UL/params->baud_rate);
21

22
	REG32_STORE(&regs->ctrl,
23
			MUART_CTRL_STOP_BITS(MUART_1_STOP_BIT) |
24
			MUART_CTRL_WORD_LEN(MUART_WORD_LEN_8) |
25
			MUART_CTRL_POL_MODE |
26
			MUART_CTRL_APB_FIFO_MODE |
27
			MUART_CTRL_ENABLE);
28

29
	if (params->uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
30
		REG16_STORE(&regs->fifowm.rx_num , 0); /* 1 byte */
31
		REG32_STORE(&regs->mask, MUART_IRQ_RX);
32
	}
33

34
	return 0;
35
}
36

37
static int muart_uart_has_symbol(struct uart *dev) {
38
	struct muart_regs *regs = (struct muart_regs *)dev->base_addr;
39
	uint16_t rx_state;
40

41
	rx_state = REG16_LOAD(&regs->fifo_status.rx_num);
42

43
	return (int)rx_state;
44
}
45

46
static int muart_uart_getc(struct uart *dev) {
47
	struct muart_regs *regs = (struct muart_regs *)dev->base_addr;
48
	int ch;
49

50
	ch = (int)(REG32_LOAD(&regs->drec) & 0xFF);
51

52
	if (muart_uart_has_symbol(dev) == 0) {
53
		/* read status reg to switch off interrupt bit */
54
		REG32_LOAD(&regs->status);
55
	}
56

57
	return ch;
58
}
59

60
static int muart_uart_putc(struct uart *dev, int ch) {
61
	struct muart_regs *regs = (struct muart_regs *)dev->base_addr;
62

63
	while ( REG16_LOAD(&regs->fifo_status.tx_num)) {
64
	}
65

66
	REG32_STORE(&regs->dtrans, ch);
67

68
	return 0;
69
}
70

71
const struct uart_ops muart_uart_uart_ops = {
72
		.uart_getc = muart_uart_getc,
73
		.uart_putc = muart_uart_putc,
74
		.uart_hasrx = muart_uart_has_symbol,
75
		.uart_setup = muart_uart_setup,
76
};
77

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

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

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

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