1 #include <lunaix/mm/valloc.h>
2 #include <lunaix/status.h>
4 #include <usr/lunaix/serial.h>
9 uart_alloc(ptr_t base_addr)
11 struct uart16550* uart = valloc(sizeof(struct uart16550));
13 // load registers default value
14 uart->cntl_save.rmc = UART_rMC_DTR | UART_rMC_RTS | UART_rMC_IEN;
15 uart->cntl_save.rie = 0;
17 uart->base_addr = base_addr;
22 uart_free(struct uart16550* uart)
28 uart_general_tx(struct serial_dev* sdev, u8_t* data, size_t len)
30 struct uart16550* uart = UART16550(sdev);
34 while (!uart_can_transmit(uart))
36 uart_write_byte(uart, data[i++]);
39 serial_end_xmit(sdev, len);
45 uart_general_exec_cmd(struct serial_dev* sdev, u32_t req, va_list args)
47 struct uart16550* uart = UART16550(sdev);
62 uart_general_irq_handler(int iv, struct llist_header* ports)
65 struct uart16550 *pos, *n;
66 llist_for_each(pos, n, ports, local_ports)
68 int is = uart_intr_identify(pos);
69 if (iv == pos->iv && (is == UART_CHR_TIMEOUT)) {
79 while ((recv = uart_read_byte(pos))) {
85 if (!serial_accept_buffer(pos->sdev, tmpbuf, i)) {
86 uart_clear_rxfifo(pos);
93 serial_accept_buffer(pos->sdev, tmpbuf, i);
94 serial_accept_one(pos->sdev, 0);
96 serial_end_recv(pos->sdev);