This commit is contained in:
2025-03-22 10:20:26 +00:00
parent babe4290e4
commit a2f6d7e76d
9 changed files with 77 additions and 896 deletions
+51 -11
View File
@@ -50,6 +50,7 @@ function send_read_dma(device : PAHCI_Device; lba : uint64; count : uint32; buff
function send_write_dma(device : PAHCI_Device; lba : uint64; count : uint32; buffer : puint32) : boolean;
function read_atapi(device : PAHCI_Device; lba : uint64; count : uint32; buffer : puint32) : boolean;
implementation
procedure init();
@@ -113,8 +114,44 @@ begin
// Clear the SERR register by writing 1s to it.
port^.sata_error := $FFFFFFFF;
start_port(port);
end;
// procedure reset_port(port : PHBA_Port);
// var
// ssts, serr, timeout : uint32;
// begin
// console.writestringln('AHCI: Performing a full port reset.');
// port^.cmd := port^.cmd and not $1;
// // Wait until CR (bit 15) is cleared.
// timeout := 0;
// while (port^.cmd and $8000) <> 0 do begin
// timeout := timeout + 1;
// if timeout > 1000000 then begin
// console.writestringln('AHCI: Port reset timeout.');
// break;
// end;
// end;
// port^.sata_ctrl := port^.sata_ctrl and $FFFF0000;
// port^.sata_ctrl := port^.sata_ctrl or $1;
// psleep(10);
// port^.sata_ctrl := port^.sata_ctrl and $FFFF0000;
// while (port^.sata_status and $F) <> $3 do begin
// //wait for the port to be ready
// end;
// // Clear the SERR register by writing 1s to it.
// port^.sata_error := $FFFFFFFF;
// // start_port(port);
// end;
{
Check the ports on the controller and setup the command list, FIS, and command table
}
@@ -229,7 +266,6 @@ begin
//reset the port
reset_port(port);
start_port(port);
//print sata status
console.writestring('AHCI: sata status: ');
@@ -383,19 +419,23 @@ begin
console.writestringln('');
buffer := puint32(kalloc(512));
memset(uint32(buffer), 0, 512);
buffer := puint32(kalloc(2048));
memset(uint32(buffer), 0, 2048);
//send a read DMA command to the device
if isATAPI then begin
read_atapi(device, 16, 512, buffer);
read_atapi(device, 0, 2048, buffer);
end else begin
send_read_dma(device, 10, 512, buffer);
memset(uint32(buffer), $77, 2048);
send_write_dma(device, 22, 512, buffer);
memset(uint32(buffer), 0, 2048);
send_read_dma(device, 22, 512, buffer);
end;
//print the buffer
for i:=0 to 63 do begin
console.writehex(uint32(buffer[i]));
console.writehex(puInt8(buffer)[i]);
console.writestring(' ');
end;
console.writestringln('');
@@ -536,7 +576,6 @@ begin
console.writestringln('AHCI: Sending read DMA command');
reset_port(device^.port);
start_port(device^.port);
//prdt count is 22 bits
prdt_count := (count div 4194304) + 1;
@@ -647,7 +686,6 @@ begin
console.writestringln('AHCI: Sending write DMA command');
reset_port(device^.port);
start_port(device^.port);
//prdt count is 22 bits
prdt_count := (count div 4194304) + 1;
@@ -688,6 +726,8 @@ begin
fis^.command := ATA_CMD_WRITE_DMA_EXT;
fis^.device := $40; // LBA mode 48?
count:= count div 512;
fis^.lba0 := lba and $FF;
fis^.lba1 := (
lba shr 8) and $FF;
@@ -764,7 +804,6 @@ begin
console.writestringln('AHCI: Sending read ATAPI command');
reset_port(device^.port);
start_port(device^.port);
//prdt count is 22 bits
prdt_count := (count div 4194304) + 1;
@@ -781,12 +820,13 @@ begin
cmd_header^.wrt := 0;
cmd_header^.prdtl := 1;
cmd_header^.atapi := 1;
cmd_header^.clear_busy := 1;
// Setup the command table (using slot 0)
cmd_table := PHBA_CMD_TABLE(uint32(device^.command_table) + (slot * sizeof(THBA_CMD_TABLE)));
cmd_table^.prdt[0].dba := vtop(uint32(buffer));
cmd_table^.prdt[0].dbc := 512 - 1; // 512 bytes (0-based count
cmd_table^.prdt[0].dbc := 2048 - 1; // 512 bytes (0-based count
cmd_table^.prdt[0].int := 1; // Interrupt on completion
// Construct the Command FIS in the command table's CFIS area
@@ -795,7 +835,7 @@ begin
fis^.fis_type := uint8(FIS_TYPE_REG_H2D);
fis^.c := $1;
fis^.command := ATA_CMD_PACKET;
fis^.device := $A0; // LBA mode 48?
fis^.device := $A0;
fis^.featurel := fis^.featurel or 1; //setting both of these might not work on real hardware
fis^.featurel := fis^.featurel or (1 shl 2);
File diff suppressed because it is too large Load Diff
-85
View File
@@ -1,85 +0,0 @@
// Copyright 2021 Aaron Hance
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Drivers->Storage->ATA_ISR - Primary ATA IRQ.
@author(Aaron Hance <[email protected]>)
}
unit ATA_ISR;
interface
uses
util,
console,
isr_types,
isrmanager,
IDT;
procedure register();
procedure hook(hook_method : uint32);
procedure unhook(hook_method : uint32);
implementation
var
Hooks : Array[1..MAX_HOOKS] of pp_hook_method;
procedure Main(); interrupt;
var
i : integer;
begin
CLI;
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) <> 0 then Hooks[i](void($00000000));
end;
console.writestringln('Disk Operation Complete');
end;
procedure register();
begin
memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS);
//isrmanager.registerISR(76, @Main);
//IDT.set_gate(76, uint32(@Main), $08, ISR_RING_0);
end;
procedure hook(hook_method : uint32);
var
i : uint32;
begin
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) = hook_method then exit;
end;
for i:=0 to MAX_HOOKS-1 do begin
if uint32(Hooks[i]) = 0 then begin
Hooks[i]:= pp_hook_method(hook_method);
exit;
end;
end;
end;
procedure unhook(hook_method : uint32);
var
i : uint32;
begin
for i:=0 to MAX_HOOKS-1 do begin
If uint32(Hooks[i]) = hook_method then Hooks[i]:= nil;
exit;
end;
end;
end.
+2
View File
@@ -14,6 +14,8 @@
{
Drivers->Storage->ide - IDE Driver.
NOT FINSIHED NEEDS WORK
@author(Aaron Hance <[email protected]>)
}
+24
View File
@@ -1,3 +1,27 @@
// Copyright 2021 Aaron Hance
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
{
Drivers->Storage->ATAPI - ATAPI Driver.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!! CURRENTLY NOT FUNCTIONAL !!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@author(Aaron Hance <[email protected]>)
}
unit atapi;
interface
File diff suppressed because it is too large Load Diff