Add serial driver
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
./scripts/build.sh
|
./scripts/build.sh
|
||||||
|
|
||||||
qemu-system-i386 -kernel "build/out/kernel"
|
qemu-system-i386 -serial stdio -kernel "build/out/kernel"
|
||||||
27
src/os/src/kernel/drivers/etc/serial.ts
Normal file
27
src/os/src/kernel/drivers/etc/serial.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import { portin, portout } from "../../../lib/libts/port";
|
||||||
|
|
||||||
|
const SERIAL_PORT_COM1 = 0x3f8;
|
||||||
|
|
||||||
|
export function kdriver_etc_serial_init() {
|
||||||
|
portout(SERIAL_PORT_COM1 + 1, 0x00); // Disable all interrupts
|
||||||
|
portout(SERIAL_PORT_COM1 + 3, 0x80); // Enable DLAB
|
||||||
|
portout(SERIAL_PORT_COM1 + 0, 0x03); // 38400 baud
|
||||||
|
portout(SERIAL_PORT_COM1 + 1, 0x00);
|
||||||
|
portout(SERIAL_PORT_COM1 + 3, 0x03); // 8 bits, no parity, one stop bit
|
||||||
|
portout(SERIAL_PORT_COM1 + 2, 0xc7); // Enable FIFO, clear them, with 14-byte threshold
|
||||||
|
portout(SERIAL_PORT_COM1 + 4, 0x0b);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function kdriver_etc_serial_isTransmitBufferEmpty(): boolean {
|
||||||
|
return (portin(SERIAL_PORT_COM1 + 5) & 0x20) !== 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function kdriver_etc_serial_transmit(byte: number): void {
|
||||||
|
while (!kdriver_etc_serial_isTransmitBufferEmpty()) {}
|
||||||
|
|
||||||
|
portout(SERIAL_PORT_COM1, byte);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function kdriver_etc_serial_read(): number {
|
||||||
|
return portin(SERIAL_PORT_COM1);
|
||||||
|
}
|
||||||
@@ -1,10 +1,39 @@
|
|||||||
|
import { charc } from "../lib/libts/byte";
|
||||||
|
import { padStart } from "../lib/libts/string";
|
||||||
|
import { getDate } from "../lib/sys/date";
|
||||||
|
import {
|
||||||
|
kdriver_etc_serial_read,
|
||||||
|
kdriver_etc_serial_transmit,
|
||||||
|
} from "./drivers/etc/serial";
|
||||||
|
import {
|
||||||
|
kmod_drivers_init,
|
||||||
|
kmod_drivers_register,
|
||||||
|
} from "./modules/drivers/drivers.kmod";
|
||||||
import {
|
import {
|
||||||
kmod_graphics_vga_clear,
|
kmod_graphics_vga_clear,
|
||||||
kmod_graphics_vga_init,
|
kmod_graphics_vga_init,
|
||||||
kmod_graphics_vga_pushLine,
|
kmod_graphics_vga_pushLine,
|
||||||
} from "./modules/graphics/vga";
|
} from "./modules/graphics/graphics.kmod";
|
||||||
|
|
||||||
export function kmain() {
|
export function kmain() {
|
||||||
|
kmod_drivers_init();
|
||||||
|
|
||||||
|
kmod_drivers_register();
|
||||||
|
|
||||||
|
kdriver_etc_serial_transmit(charc("H"));
|
||||||
|
kdriver_etc_serial_transmit(charc("e"));
|
||||||
|
kdriver_etc_serial_transmit(charc("l"));
|
||||||
|
kdriver_etc_serial_transmit(charc("l"));
|
||||||
|
kdriver_etc_serial_transmit(charc("o"));
|
||||||
|
|
||||||
kmod_graphics_vga_init();
|
kmod_graphics_vga_init();
|
||||||
kmod_graphics_vga_pushLine("[Kernel] Kernel initialized successfully.");
|
kmod_graphics_vga_pushLine("[Kernel] Kernel initialized successfully.");
|
||||||
|
kmod_graphics_vga_pushLine("Current date: " + getDate().toDateString());
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
const d = kdriver_etc_serial_read();
|
||||||
|
kmod_graphics_vga_pushLine(
|
||||||
|
"Serial input: 0x" + padStart(d.toString(16), 2, "0")
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
src/os/src/kernel/modules/drivers/drivers.kmod.ts
Normal file
11
src/os/src/kernel/modules/drivers/drivers.kmod.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import { kdriver_etc_serial_init } from "../../drivers/etc/serial";
|
||||||
|
|
||||||
|
const drivers = [kdriver_etc_serial_init];
|
||||||
|
|
||||||
|
export function kmod_drivers_init(): void {}
|
||||||
|
|
||||||
|
export function kmod_drivers_register(): void {
|
||||||
|
for (let i = 0; i < drivers.length; i++) {
|
||||||
|
drivers[i]!();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user