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:
parent
8df1e07416
commit
3814785a54
@ -16,7 +16,8 @@ uses
|
|||||||
drivertypes,
|
drivertypes,
|
||||||
console,
|
console,
|
||||||
terminal,
|
terminal,
|
||||||
isr76;
|
isr76,
|
||||||
|
vmemorymanager;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -73,12 +74,15 @@ procedure callback(data : void);
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
procedure init(_controller : TPCI_device);
|
procedure init(_controller : TPCI_device); //alloc, pmem; map_page vmem;
|
||||||
begin
|
begin
|
||||||
console.writestringln('ATA: INIT BEGIN.');
|
console.writestringln('ATA: INIT BEGIN.');
|
||||||
isr76.hook(uint32(@callback));
|
isr76.hook(uint32(@callback));
|
||||||
|
|
||||||
controller := _controller;
|
controller := _controller;
|
||||||
|
|
||||||
|
new_page_at_address(controller.address4);
|
||||||
|
|
||||||
devices[0].primary := true;
|
devices[0].primary := true;
|
||||||
devices[0].Command_Register := controller.address4;
|
devices[0].Command_Register := controller.address4;
|
||||||
devices[0].Status_Register := controller.address4 + 2;
|
devices[0].Status_Register := controller.address4 + 2;
|
||||||
|
@ -62,7 +62,7 @@ var
|
|||||||
busses : array[0..256] of TPCI_Device_Bridge;
|
busses : array[0..256] of TPCI_Device_Bridge;
|
||||||
|
|
||||||
device_count : uint16;
|
device_count : uint16;
|
||||||
bus_count : uint8;
|
bus_count : uint8 = 1;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
procedure scanBus(bus : uint8);
|
procedure scanBus(bus : uint8);
|
||||||
@ -72,11 +72,26 @@ function getDeviceInfo(class_code : uint8; subclass_code : uint8) : TPCI_Device;
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
var
|
||||||
|
current_bus : uint8;
|
||||||
begin
|
begin
|
||||||
console.writestringln('PCI: INIT BEGIN.');
|
console.writestringln('PCI: INIT BEGIN.');
|
||||||
|
console.writestringln('PCI: Scanning Bus: 0');
|
||||||
scanBus(0);
|
scanBus(0);
|
||||||
|
scanbus(1);
|
||||||
|
scanbus(2);
|
||||||
|
|
||||||
//while unscanned busses scan busses
|
//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.');
|
console.writestringln('PCI: INIT END.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -92,6 +107,7 @@ begin
|
|||||||
if devices[device_count - 1].header_type and $40 = 40 then begin
|
if devices[device_count - 1].header_type and $40 = 40 then begin
|
||||||
for ii := 1 to 8 do begin
|
for ii := 1 to 8 do begin
|
||||||
loadDeviceConfig(bus, i, ii);
|
loadDeviceConfig(bus, i, ii);
|
||||||
|
psleep(1000);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -183,6 +199,9 @@ begin
|
|||||||
busT.interrupt_pin := getbyte(data, 2);
|
busT.interrupt_pin := getbyte(data, 2);
|
||||||
busT.interrupt_line := getbyte(data, 3);
|
busT.interrupt_line := getbyte(data, 3);
|
||||||
|
|
||||||
|
busses[bus_count] := busT;
|
||||||
|
bus_count := bus_count + 1;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function loadDeviceConfig(bus : uint8; slot : uint8; func : uint8) : boolean;
|
function loadDeviceConfig(bus : uint8; slot : uint8; func : uint8) : boolean;
|
||||||
@ -207,22 +226,23 @@ begin
|
|||||||
|
|
||||||
requestConfig(bus, slot, func, 2);
|
requestConfig(bus, slot, func, 2);
|
||||||
data := inl($CFC);
|
data := inl($CFC);
|
||||||
device.class_code := getbyte(data, 0);
|
device.class_code := getbyte(data, 3);
|
||||||
device.subclass_class := getbyte(data, 1);
|
device.subclass_class := getbyte(data, 2);
|
||||||
device.prog_if := getbyte(data, 2);
|
device.prog_if := getbyte(data, 1);
|
||||||
device.revision_id := getbyte(data, 3);
|
device.revision_id := getbyte(data, 0);
|
||||||
|
|
||||||
requestConfig(bus, slot, func, 3);
|
requestConfig(bus, slot, func, 3);
|
||||||
data := inl($CFC);
|
data := inl($CFC);
|
||||||
device.BIST := getbyte(data, 0);
|
device.BIST := getbyte(data, 3);
|
||||||
device.header_type := getbyte(data, 1);
|
device.header_type := getbyte(data, 2);
|
||||||
device.latency_timer := getbyte(data, 2);
|
device.latency_timer := getbyte(data, 1);
|
||||||
device.cache_size := getbyte(data, 3);
|
device.cache_size := getbyte(data, 0);
|
||||||
|
|
||||||
if device.header_type and $7 = 0 then begin
|
if device.header_type and $7 = 0 then begin
|
||||||
loadDeviceConfig := true;
|
loadDeviceConfig := true;
|
||||||
end else begin
|
end else begin
|
||||||
loadBusConfig(bus, slot, func, device);
|
loadBusConfig(bus, slot, func, device);
|
||||||
|
exit(false);
|
||||||
end;
|
end;
|
||||||
//TODO implement other types?
|
//TODO implement other types?
|
||||||
|
|
||||||
@ -268,7 +288,7 @@ begin
|
|||||||
|
|
||||||
|
|
||||||
console.writestring('PCI: Found Device: ');
|
console.writestring('PCI: Found Device: ');
|
||||||
console.writehex(slot);
|
console.writehex(device.header_type);
|
||||||
console.writestring(' ');
|
console.writestring(' ');
|
||||||
console.writehex(device.device_id);
|
console.writehex(device.device_id);
|
||||||
console.writestring(' ');
|
console.writestring(' ');
|
||||||
|
@ -118,10 +118,10 @@ begin
|
|||||||
mouse.init();
|
mouse.init();
|
||||||
console.writestringln('DRIVERS: INIT END.');
|
console.writestringln('DRIVERS: INIT END.');
|
||||||
|
|
||||||
temp := 8294;
|
//temp := 8294;
|
||||||
ata.write(uint32(@temp), 0, 4);
|
//ata.write(uint32(@temp), 10, 4);
|
||||||
//temp := 1234;
|
//temp := 1234;
|
||||||
//ata.read(uint32(@temp), 0, 4);
|
//ata.read(uint32(@temp), 10, 4);
|
||||||
//console.writeintln(temp);
|
//console.writeintln(temp);
|
||||||
|
|
||||||
console.writestringln('');
|
console.writestringln('');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user