:: limine / common / drivers / serial.c 926 B raw

1
#if defined (BIOS)
2
3
#include <stdint.h>
4
#include <stdbool.h>
5
#include <lib/misc.h>
6
#include <drivers/serial.h>
7
#include <sys/cpu.h>
8
9
static bool serial_initialised = false;
10
uint32_t serial_baudrate;
11
12
static void serial_initialise(void) {
13
    if (serial_initialised || !serial) {
14
        return;
15
    }
16
17
    // Init com1
18
    outb(0x3f8 + 3, 0x00);
19
    outb(0x3f8 + 1, 0x00);
20
    outb(0x3f8 + 3, 0x80);
21
22
    uint16_t divisor = (uint16_t)(115200 / serial_baudrate);
23
    outb(0x3f8 + 0, divisor & 0xff);
24
    outb(0x3f8 + 1, (divisor >> 8) & 0xff);
25
26
    outb(0x3f8 + 3, 0x03);
27
    outb(0x3f8 + 2, 0xc7);
28
    outb(0x3f8 + 4, 0x0b);
29
30
    serial_initialised = true;
31
}
32
33
void serial_out(uint8_t b) {
34
    serial_initialise();
35
36
    while ((inb(0x3f8 + 5) & 0x20) == 0);
37
    outb(0x3f8, b);
38
}
39
40
int serial_in(void) {
41
    serial_initialise();
42
43
    if ((inb(0x3f8 + 5) & 0x01) == 0) {
44
        return -1;
45
    }
46
    return inb(0x3f8);
47
}
48
49
#endif
tab: 248 wrap: offon