1 #include <lunaix/mm/valloc.h>
2 #include <lunaix/status.h>
4 #include <usr/lunaix/serial.h>
5 #include <usr/lunaix/term.h>
10 uart_alloc(ptr_t base_addr)
12 struct uart16550* uart = valloc(sizeof(struct uart16550));
14 // load registers default value
15 uart->cntl_save.rmc = UART_rMC_DTR | UART_rMC_RTS | UART_rMC_IEN;
16 uart->cntl_save.rie = 0;
18 uart->base_addr = base_addr;
23 uart_free(struct uart16550* uart)
29 uart_general_tx(struct serial_dev* sdev, u8_t* data, size_t len)
31 struct uart16550* uart = UART16550(sdev);
35 while (!uart_can_transmit(uart))
37 uart_write_byte(uart, data[i++]);
40 serial_end_xmit(sdev, len);
46 uart_set_control_mode(struct uart16550* uart, tcflag_t cflags)
48 uart->cntl_save.rie &= ~(UART_rIE_ERBFI | UART_rIE_EDSSI);
49 uart->cntl_save.rie |= (!(cflags & _CLOCAL)) * UART_rIE_EDSSI;
50 uart->cntl_save.rie |= (!!(cflags & _CREAD)) * UART_rIE_ERBFI;
53 uart->cntl_save.rlc &= ~(UART_rLC_STOPB | UART_rLC_PAREN | UART_rLC_PAREVN | 0b11);
54 uart->cntl_save.rlc |= (!!(cflags & _CSTOPB)) * UART_rLC_STOPB;
55 uart->cntl_save.rlc |= (!!(cflags & _CPARENB)) * UART_rLC_PAREN;
56 uart->cntl_save.rlc |= (!(cflags & _CPARODD)) * UART_rLC_PAREVN;
57 uart->cntl_save.rlc |= (cflags & _CSZ_MASK) >> 2;
62 uart_general_exec_cmd(struct serial_dev* sdev, u32_t req, va_list args)
64 struct uart16550* uart = UART16550(sdev);
75 case SERIO_SETCNTRLMODE:
76 uart_set_control_mode(uart, va_arg(args, tcflag_t));
85 uart_general_irq_handler(int iv, struct llist_header* ports)
88 struct uart16550 *pos, *n;
89 llist_for_each(pos, n, ports, local_ports)
91 int is = uart_intr_identify(pos);
92 if (iv == pos->iv && (is == UART_CHR_TIMEOUT)) {
102 while ((recv = uart_read_byte(pos))) {
104 if (likely(i < 32)) {
108 if (!serial_accept_buffer(pos->sdev, tmpbuf, i)) {
109 uart_clear_rxfifo(pos);
116 serial_accept_buffer(pos->sdev, tmpbuf, i);
117 serial_accept_one(pos->sdev, 0);
119 serial_end_recv(pos->sdev);