embox

Форк
0
/
elvees_uart_ttys0.c 
81 строка · 2.1 Кб
1
/**
2
 * @file
3
 *
4
 * @date Feb 11, 2023
5
 * @author Anton Bondarev
6
 */
7

8
#include <kernel/irq.h>
9

10
#include <util/macro.h>
11

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

15
#include <drivers/common/memory.h>
16

17
#include <framework/mod/options.h>
18

19
#define UART_BASE      OPTION_GET(NUMBER, base_addr)
20
#define IRQ_NUM        OPTION_GET(NUMBER, irq_num)
21

22
#define PINS_INIT      OPTION_GET(NUMBER, pins_init)
23

24
#define TTY_NAME    ttyS0
25

26
extern int elvees_uart_setup_common(struct uart *dev, const struct uart_params *params);
27
extern int elvees_uart_has_symbol(struct uart *dev);
28
extern int elvees_uart_getc(struct uart *dev);
29
extern int elvees_uart_putc(struct uart *dev, int ch);
30

31
#if PINS_INIT == 0
32

33
static int elvees_uart_setup(struct uart *dev, const struct uart_params *params) {
34
	return 0;
35
}
36

37
#else
38

39
#include <drivers/gpio/gpio_driver.h>
40

41
#define PIN_RX_PORT      OPTION_GET(NUMBER, pin_rx_port)
42
#define PIN_RX_PIN       OPTION_GET(NUMBER, pin_rx_pin)
43
#define PIN_TX_PORT      OPTION_GET(NUMBER, pin_tx_port)
44
#define PIN_TX_PIN       OPTION_GET(NUMBER, pin_tx_pin)
45

46
static int elvees_uart_setup(struct uart *dev, const struct uart_params *params) {
47
#define GPIO_ALT_FUNC_UART   (4)
48

49
	gpio_setup_mode(PIN_RX_PORT, 1 << PIN_RX_PIN, GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(GPIO_ALT_FUNC_UART));
50
	gpio_setup_mode(PIN_TX_PORT, 1 << PIN_TX_PIN, GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(GPIO_ALT_FUNC_UART));
51

52
	elvees_uart_setup_common(dev, params);
53

54
	return 0;
55
}
56
#endif
57

58
static const struct uart_ops elvees_uart_uart_ops = {
59
		.uart_getc = elvees_uart_getc,
60
		.uart_putc = elvees_uart_putc,
61
		.uart_hasrx = elvees_uart_has_symbol,
62
		.uart_setup = elvees_uart_setup,
63
};
64

65
extern irq_return_t uart_irq_handler(unsigned int irq_nr, void *data);
66

67
static struct uart uart_ttyS0 = {
68
		.uart_ops = &elvees_uart_uart_ops,
69
		.irq_num = IRQ_NUM,
70
		.base_addr = UART_BASE,
71
		.params =  {
72
		.baud_rate = OPTION_GET(NUMBER,baud_rate),
73
		.uart_param_flags = UART_PARAM_FLAGS_8BIT_WORD | UART_PARAM_FLAGS_USE_IRQ,
74
		},
75
};
76

77
PERIPH_MEMORY_DEFINE(elvees_uart, UART_BASE, 0x1000);
78

79
STATIC_IRQ_ATTACH(IRQ_NUM, uart_irq_handler, &uart_ttyS0);
80

81
TTYS_DEF(TTY_NAME, &uart_ttyS0);
82

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

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

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

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