3 #include <lunaix/peripheral/serial.h>
4 #include <lunaix/syslog.h>
9 serial_init_port(uintptr_t port)
11 // disable interrupt, use irq instead
12 io_outb(COM_RIE(port), 0);
14 // baud rate config (DLAB = 1)
15 io_outb(COM_RCLINE(port), 0x80);
16 io_outb(COM_RRXTX(port), BAUD_9600);
17 io_outb(COM_RIE(port), 0);
19 // transmission size = 7bits, no parity, 1 stop bits
20 io_outb(COM_RCLINE(port), 0x2);
22 // rx trigger level = 14, clear rx/tx buffer, enable buffer
23 io_outb(COM_RCFIFO(port), 0xcf);
25 io_outb(COM_RCMODEM(port), 0x1e);
27 io_outb(COM_RRXTX(port), 0xaa);
29 if (io_inb(COM_RRXTX(port)) != 0xaa) {
30 kprintf(KWARN "Port (%p) is faulty, use other instead.\n", port);
34 io_outb(COM_RCMODEM(port), 0xf);
35 io_outb(COM_RIE(port), 0x1);
36 kprintf("Port (%p) ok\n", port);
42 cpu_disable_interrupt();
43 serial_init_port(SERIAL_COM1);
44 serial_init_port(SERIAL_COM2);
45 cpu_enable_interrupt();
49 serial_rx_byte(uintptr_t port)
51 while (!(io_inb(COM_RSLINE(port)) & 0x01))
54 return io_inb(COM_RRXTX(port));
58 serial_rx_buffer(uintptr_t port, char* data, size_t len)
60 for (size_t i = 0; i < len; i++) {
61 data[i] = serial_rx_byte(port);
66 serial_tx_byte(uintptr_t port, char data)
68 while (!(io_inb(COM_RSLINE(port)) & 0x20))
71 io_outb(COM_RRXTX(port), data);
75 serial_tx_buffer(uintptr_t port, char* data, size_t len)
77 for (size_t i = 0; i < len; i++) {
78 serial_tx_byte(port, data[i]);
83 serial_clear_fifo(uintptr_t port)
85 io_outb(COM_RIE(port), 0x0);
86 io_outb(COM_RCFIFO(port), 0x00);
88 io_outb(COM_RCFIFO(port), 0xcf);
89 io_outb(COM_RIE(port), 0x1);
93 serial_disable_irq(uintptr_t port)
95 io_outb(COM_RIE(port), 0x0);
99 serial_enable_irq(uintptr_t port)
101 io_outb(COM_RIE(port), 0x1);