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>
19
#include <kernel/irq.h>
20
#include <mem/misc/pool.h>
22
#include <drivers/device.h>
23
#include <drivers/serial/uart_dev.h>
25
ARRAY_SPREAD_DEF(struct uart *const, __uart_device_registry);
27
DLIST_DEFINE(uart_list);
29
struct dlist_head *uart_get_list(void) {
33
static int uart_attach_irq(struct uart *uart) {
36
if (!(uart->params.uart_param_flags & UART_PARAM_FLAGS_USE_IRQ)) {
40
if (!uart->irq_handler) {
44
r = irq_attach(uart->irq_num, uart->irq_handler, 0, uart, uart->dev_name);
46
log_debug("setup tty %s irq num %d result %d", uart->dev_name , uart->irq_num, r);
51
static int uart_detach_irq(struct uart *uart) {
53
if (uart->params.uart_param_flags & UART_PARAM_FLAGS_USE_IRQ) {
54
return irq_detach(uart->irq_num, uart);
60
static int uart_setup(struct uart *uart) {
61
const struct uart_ops *uops = uart->uart_ops;
63
if (uops->uart_setup) {
64
log_debug("setup tty %s", uart->dev_name);
65
return uops->uart_setup(uart, &uart->params);
71
static void uart_internal_init(struct uart *uart) {
72
if (uart_state_test(uart, UART_STATE_INITED)) {
76
uart_state_set(uart, UART_STATE_INITED);
78
ring_buff_init(&uart->uart_rx_ring, sizeof(uart->uart_rx_buff[0]),
79
UART_RX_BUFF_SZ, uart->uart_rx_buff);
81
dlist_add_next(&uart->uart_lnk, &uart_list);
84
int uart_open(struct uart *uart) {
85
if (uart_state_test(uart, UART_STATE_OPEN)) {
88
uart_state_set(uart, UART_STATE_OPEN);
90
uart_internal_init(uart);
94
return uart_attach_irq(uart);
97
int uart_close(struct uart *uart) {
98
if (!uart_state_test(uart, UART_STATE_OPEN)) {
102
uart_state_clear(uart, UART_STATE_OPEN);
104
return uart_detach_irq(uart);
107
int uart_set_params(struct uart *uart, const struct uart_params *params) {
109
if (uart_state_test(uart, UART_STATE_OPEN)) {
110
uart_detach_irq(uart);
113
memcpy(&uart->params, params, sizeof(struct uart_params));
115
if (uart_state_test(uart, UART_STATE_OPEN)) {
116
uart_attach_irq(uart);
123
int uart_get_params(struct uart *uart, struct uart_params *params) {
125
memcpy(params, &uart->params, sizeof(struct uart_params));