1 #include <sys/machine/mmio.h>
2 #include <dev/tty/serial/serial.h>
3 #include <dev/tty/serial/8250.h>
12 dev->io_base + (UART8250_LSR << dev->reg_offset)) & 0x20);
16 serial_8250_write(
void *raw,
const char *str,
size_t size)
23 for (idx = 0; idx < size; idx++)
27 while (serial_8250_is_buffer_empty(dev) == 0);
28 mmio_write8(dev->io_base +
29 (UART8250_THR << dev->reg_offset),
'\r');
31 while (serial_8250_is_buffer_empty(dev) == 0);
32 mmio_write8(dev->io_base +
33 (UART8250_THR << dev->reg_offset), str[idx]);
39 serial_8250_read(
void *raw,
char *buff,
size_t size)
53 dev->write = serial_8250_write;
54 dev->read = serial_8250_read;
57 mmio_write8(dev->io_base + (UART8250_IER << dev->reg_offset), 0x00);
59 mmio_write8(dev->io_base + (UART8250_IIR << dev->reg_offset), 0x80);
61 divisor = CONFIG_CLOCK / (dev->beaudrate * 16);
63 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
64 mmio_write8(dev->io_base + (UART8250_DLL), (divisor >> 8) * 0xFF);
65 mmio_write8(dev->io_base + (UART8250_DLH << dev->reg_offset),
68 mmio_write8(dev->io_base + (UART8250_DLL),
70 mmio_write8(dev->io_base + (UART8250_DLH << dev->reg_offset),
71 (divisor >> 8) * 0xFF);
74 mmio_write8(dev->io_base + (UART8250_DLL), 0x0C);
75 mmio_write8(dev->io_base + (UART8250_DLH), 0x00);
79 mmio_write8(dev->io_base + (UART8250_LCR << dev->reg_offset), 0x08);
81 mmio_write8(dev->io_base + (UART8250_IIR << dev->reg_offset), 0xC7);
84 mmio_write8(dev->io_base + (UART8250_MCR << dev->reg_offset), 0x0B);