Add PCI driver
This commit is contained in:
113
os/src/kernel/drivers/dev/pci.kdriver.ts
Normal file
113
os/src/kernel/drivers/dev/pci.kdriver.ts
Normal 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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
12
os/src/kernel/modules/drivers.kmod.ts
Normal file
12
os/src/kernel/modules/drivers.kmod.ts
Normal 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
7
os/src/libs/io.ts
Normal 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);
|
||||
}
|
||||
21
os/src/types/global_c_bindings.d.ts
vendored
21
os/src/types/global_c_bindings.d.ts
vendored
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user