Add PCI driver

This commit is contained in:
2025-11-30 10:47:59 +01:00
parent af5d8c709b
commit f483a34d3c
9 changed files with 338 additions and 25 deletions

View File

@@ -0,0 +1,113 @@
import { Logger } from "../../../libs/logger";
export function kdriver_dev_pci_init() {}
export function kdriver_dev_pci_detectDevices() {
Logger.log("[PCI] Scanning...");
for (let bus = 0; bus < 256; bus++) {
for (let device = 0; device < 32; device++) {
kdriver_dev_pci_checkDevice(bus, device, 0);
const headerType = kdriver_dev_pci_getHeaderType(bus, device, 0);
if ((headerType & 0x80) !== 0) {
for (let func = 1; func < 8; func++) {
kdriver_dev_pci_checkDevice(bus, device, func);
}
}
}
}
}
export function kdriver_dev_pci_checkDevice(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
if (data === 0 || data === -1) return;
const vendorId = data & 0xffff;
const deviceId = data >>> 16;
if (vendorId === 0 || vendorId === 0xffff) return;
const classCode = kdriver_dev_pci_getClassCode(bus, device, func);
const subclass = kdriver_dev_pci_getSubclass(bus, device, func);
const filename = bus + ":" + device + ":" + func;
Logger.log(
"[PCI] Found device pci:" +
filename +
" (vendor:" +
vendorId.toString(16) +
", device:" +
deviceId.toString(16) +
", class:" +
classCode.toString(16) +
", subclass:" +
subclass.toString(16) +
")"
);
}
export function kdriver_dev_pci_getDeviceId(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
return data >>> 16;
}
export function kdriver_dev_pci_getVendorId(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
return data & 0xffff;
}
export function kdriver_dev_pci_getClassCode(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 8);
return (data >> 24) & 0xff;
}
export function kdriver_dev_pci_getSubclass(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 8);
return (data >> 16) & 0xff;
}
export function kdriver_dev_pci_getHeaderType(
bus: number,
device: number,
func: number
) {
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 12);
return (data >> 16) & 0xff;
}
export function kdriver_dev_pci_readConfigDword(
bus: number,
device: number,
func: number,
offset: number
) {
return $___native_systable_pci_read_config(bus, device, func, offset);
}

View File

@@ -1,13 +1,19 @@
import { Logger } from "../libs/logger";
import { kdriver_dev_pci_detectDevices } from "./drivers/dev/pci.kdriver";
import {
kmod_console_clearScreen,
kmod_console_outputString,
} from "./modules/console/console.kmod";
import { kmod_drivers_init } from "./modules/drivers.kmod";
export function kmain() {
kmod_console_clearScreen();
Logger.log("[Kernel] Starting kernel...");
kmod_drivers_init();
kdriver_dev_pci_detectDevices();
return 0;
}

View File

@@ -0,0 +1,12 @@
import { Logger } from "../../libs/logger";
import { kdriver_dev_pci_init } from "../drivers/dev/pci.kdriver";
const drivers = [kdriver_dev_pci_init];
export function kmod_drivers_init() {
Logger.log("[Kernel] Initializing drivers...");
for (let i = 0; i < drivers.length; i++) {
drivers[i]!();
}
}

7
os/src/libs/io.ts Normal file
View File

@@ -0,0 +1,7 @@
export function dwordin(port: number): number {
return $___native_systable_io_dwordin(port);
}
export function dwordout(port: number, value: number) {
$___native_systable_io_dwordout(port, value);
}

View File

@@ -3,3 +3,24 @@ declare function $___native_systable_conout_clearScreen(): void;
declare function $___native_systable_conout_setAttribute(
attribute: number
): void;
declare function $___native_systable_io_dwordin(port: number): number;
declare function $___native_systable_io_dwordout(
port: number,
value: number
): void;
declare function $___native_systable_pci_read_config(
bus: number,
device: number,
func: number,
offset: number
): number;
declare function $___native_systable_pci_write_config(
bus: number,
device: number,
func: number,
offset: number,
value: number
): void;