embox

Форк
0
128 строк · 2.5 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @author  Anton Kozlov
6
 * @date    09.08.2013
7
 */
8

9
#include <string.h>
10
#include <errno.h>
11

12
#include <util/err.h>
13
#include <util/log.h>
14
#include <lib/libds/indexator.h>
15
#include <lib/libds/dlist.h>
16
#include <lib/libds/ring_buff.h>
17
#include <lib/libds/array.h>
18

19
#include <kernel/irq.h>
20
#include <mem/misc/pool.h>
21

22
#include <drivers/device.h>
23
#include <drivers/serial/uart_dev.h>
24

25
ARRAY_SPREAD_DEF(struct uart *const, __uart_device_registry);
26

27
DLIST_DEFINE(uart_list);
28

29
struct dlist_head *uart_get_list(void) {
30
	return &uart_list;
31
}
32

33
static int uart_attach_irq(struct uart *uart) {
34
	int r;
35

36
	if (!(uart->params.uart_param_flags & UART_PARAM_FLAGS_USE_IRQ)) {
37
		return 0;
38
	}
39

40
	if (!uart->irq_handler) {
41
		return -EINVAL;
42
	}
43

44
	r = irq_attach(uart->irq_num, uart->irq_handler, 0, uart, uart->dev_name);
45

46
	log_debug("setup tty %s irq num %d result %d", uart->dev_name , uart->irq_num, r);
47

48
	return r;
49
}
50

51
static int uart_detach_irq(struct uart *uart) {
52

53
	if (uart->params.uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
54
		return irq_detach(uart->irq_num, uart);
55
	}
56

57
	return 0;
58
}
59

60
static int uart_setup(struct uart *uart) {
61
	const struct uart_ops *uops = uart->uart_ops;
62

63
	if (uops->uart_setup) {
64
		log_debug("setup tty %s", uart->dev_name);
65
		return uops->uart_setup(uart, &uart->params);
66
	}
67

68
	return 0;
69
}
70

71
static void uart_internal_init(struct uart *uart) {
72
	if (uart_state_test(uart, UART_STATE_INITED)) {
73
		return;
74
	}
75

76
	uart_state_set(uart, UART_STATE_INITED);
77

78
	ring_buff_init(&uart->uart_rx_ring, sizeof(uart->uart_rx_buff[0]),
79
			UART_RX_BUFF_SZ, uart->uart_rx_buff);
80

81
	dlist_add_next(&uart->uart_lnk, &uart_list);
82
}
83

84
int uart_open(struct uart *uart) {
85
	if (uart_state_test(uart, UART_STATE_OPEN)) {
86
		return -EINVAL;
87
	}
88
	uart_state_set(uart, UART_STATE_OPEN);
89

90
	uart_internal_init(uart);
91

92
	uart_setup(uart);
93

94
	return uart_attach_irq(uart);
95
}
96

97
int uart_close(struct uart *uart) {
98
	if (!uart_state_test(uart, UART_STATE_OPEN)) {
99
		return -EINVAL;
100
	}
101

102
	uart_state_clear(uart, UART_STATE_OPEN);
103

104
	return uart_detach_irq(uart);
105
}
106

107
int uart_set_params(struct uart *uart, const struct uart_params *params) {
108

109
	if (uart_state_test(uart, UART_STATE_OPEN)) {
110
		uart_detach_irq(uart);
111
	}
112

113
	memcpy(&uart->params, params, sizeof(struct uart_params));
114

115
	if (uart_state_test(uart, UART_STATE_OPEN)) {
116
		uart_attach_irq(uart);
117
		uart_setup(uart);
118
	}
119

120
	return 0;
121
}
122

123
int uart_get_params(struct uart *uart, struct uart_params *params) {
124

125
	memcpy(params, &uart->params, sizeof(struct uart_params));
126

127
	return 0;
128
}
129

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

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

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

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