Finished re-writting PCI driver, it is now fully functional.

git-svn-id: https://spexeah.com:8443/svn/Asuro@268 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
aaron 2017-10-27 02:43:42 +00:00
parent 8df1e07416
commit 3814785a54
3 changed files with 39 additions and 15 deletions

View File

@ -16,7 +16,8 @@ uses
drivertypes,
console,
terminal,
isr76;
isr76,
vmemorymanager;
type
@ -73,12 +74,15 @@ procedure callback(data : void);
implementation
procedure init(_controller : TPCI_device);
procedure init(_controller : TPCI_device); //alloc, pmem; map_page vmem;
begin
console.writestringln('ATA: INIT BEGIN.');
isr76.hook(uint32(@callback));
controller := _controller;
new_page_at_address(controller.address4);
devices[0].primary := true;
devices[0].Command_Register := controller.address4;
devices[0].Status_Register := controller.address4 + 2;

View File

@ -62,7 +62,7 @@ var
busses : array[0..256] of TPCI_Device_Bridge;
device_count : uint16;
bus_count : uint8;
bus_count : uint8 = 1;
procedure init();
procedure scanBus(bus : uint8);
@ -72,11 +72,26 @@ function getDeviceInfo(class_code : uint8; subclass_code : uint8) : TPCI_Device;
implementation
procedure init();
var
current_bus : uint8;
begin
console.writestringln('PCI: INIT BEGIN.');
console.writestringln('PCI: Scanning Bus: 0');
scanBus(0);
scanbus(1);
scanbus(2);
//while unscanned busses scan busses
current_bus := 1;
while true do begin
if current_bus < bus_count then begin
console.writestringln('PCI: Scanning Bus: ');
console.writeint(bus_count);
scanBus(current_bus);
current_bus := current_bus + 1;
end else break;
end;
console.writestringln('PCI: INIT END.');
end;
@ -92,6 +107,7 @@ begin
if devices[device_count - 1].header_type and $40 = 40 then begin
for ii := 1 to 8 do begin
loadDeviceConfig(bus, i, ii);
psleep(1000);
end;
end;
end;
@ -183,6 +199,9 @@ begin
busT.interrupt_pin := getbyte(data, 2);
busT.interrupt_line := getbyte(data, 3);
busses[bus_count] := busT;
bus_count := bus_count + 1;
end;
function loadDeviceConfig(bus : uint8; slot : uint8; func : uint8) : boolean;
@ -207,22 +226,23 @@ begin
requestConfig(bus, slot, func, 2);
data := inl($CFC);
device.class_code := getbyte(data, 0);
device.subclass_class := getbyte(data, 1);
device.prog_if := getbyte(data, 2);
device.revision_id := getbyte(data, 3);
device.class_code := getbyte(data, 3);
device.subclass_class := getbyte(data, 2);
device.prog_if := getbyte(data, 1);
device.revision_id := getbyte(data, 0);
requestConfig(bus, slot, func, 3);
data := inl($CFC);
device.BIST := getbyte(data, 0);
device.header_type := getbyte(data, 1);
device.latency_timer := getbyte(data, 2);
device.cache_size := getbyte(data, 3);
device.BIST := getbyte(data, 3);
device.header_type := getbyte(data, 2);
device.latency_timer := getbyte(data, 1);
device.cache_size := getbyte(data, 0);
if device.header_type and $7 = 0 then begin
loadDeviceConfig := true;
end else begin
loadBusConfig(bus, slot, func, device);
exit(false);
end;
//TODO implement other types?
@ -268,7 +288,7 @@ begin
console.writestring('PCI: Found Device: ');
console.writehex(slot);
console.writehex(device.header_type);
console.writestring(' ');
console.writehex(device.device_id);
console.writestring(' ');

View File

@ -118,10 +118,10 @@ begin
mouse.init();
console.writestringln('DRIVERS: INIT END.');
temp := 8294;
ata.write(uint32(@temp), 0, 4);
//temp := 8294;
//ata.write(uint32(@temp), 10, 4);
//temp := 1234;
//ata.read(uint32(@temp), 0, 4);
//ata.read(uint32(@temp), 10, 4);
//console.writeintln(temp);
console.writestringln('');