From c7c49f24d99ec4ab20afdd2051fd6b6bb848522a Mon Sep 17 00:00:00 2001 From: aaron Date: Sat, 18 Jul 2020 21:01:29 +0000 Subject: [PATCH] git-svn-id: https://spexeah.com:8443/svn/Asuro@1319 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/driver/storage/ATA_ISR.pas | 2 +- src/driver/storage/IDE.pas | 70 +++++++++++------------- src/driver/storage/fat32.pas | 52 ++---------------- src/driver/storage/storagemanagement.pas | 26 +++++++-- src/include/util.pas | 2 + 5 files changed, 61 insertions(+), 91 deletions(-) diff --git a/src/driver/storage/ATA_ISR.pas b/src/driver/storage/ATA_ISR.pas index 60e5813b..d82c625a 100644 --- a/src/driver/storage/ATA_ISR.pas +++ b/src/driver/storage/ATA_ISR.pas @@ -42,7 +42,7 @@ end; procedure register(); begin memset(uint32(@Hooks[0]), 0, sizeof(pp_hook_method)*MAX_HOOKS); - isrmanager.registerISR(76, @Main); + //isrmanager.registerISR(76, @Main); //IDT.set_gate(76, uint32(@Main), $08, ISR_RING_0); end; diff --git a/src/driver/storage/IDE.pas b/src/driver/storage/IDE.pas index cc1db721..d9d10b32 100644 --- a/src/driver/storage/IDE.pas +++ b/src/driver/storage/IDE.pas @@ -147,8 +147,8 @@ procedure readPIO28(drive : uint8; LBA : uint32; buffer : puint8); procedure writePIO28(drive : uint8; LBA : uint32; buffer : puint8); //read/write must be capable of reading/writting any amknt of data upto disk size -procedure read(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : puint32); -procedure write(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : puint32); +procedure dread(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : puint32); +procedure dwrite(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : puint32); implementation @@ -214,6 +214,7 @@ var identResponse : TIdentResponse; i : uint8; begin + push_trace('IDE.Identify_Device'); device_select(device); no_interrupt(device); port_write(ATA_REG_CONTROL, 0); @@ -256,10 +257,7 @@ begin devID.id4:= idANY; devID.ex:= nil; drivermanagement.register_driver('IDE ATA Driver', @devID, @load); - //terminal.registerCommand('IDE', @test_command, 'TEST IDE DRIVER'); - buffer := Puint32(kalloc(1024*2)); console.writestringln('[IDE] (INIT) END'); - pop_trace(); end; function load(ptr : void) : boolean; @@ -272,7 +270,6 @@ var begin push_trace('ide.load'); console.writestringln('[IDE] (LOAD) BEGIN'); - //controller := PPCI_Device(ptr); controller := PPCI_Device(ptr); console.writestringln('[IDE] (INIT) CHECK FLOATING BUS'); @@ -296,8 +293,8 @@ begin masterDevice.sectorSize:= 512; if masterDevice.maxSectorCount <> 0 then begin IDEDevices[0].exists:= true; - masterDevice.readCallback:= @IDE.read; - masterDevice.writeCallback:= @IDE.write; + masterDevice.readCallback:= @dread; + masterDevice.writeCallback:= @dwrite; storagemanagement.register_device(@masterDevice); end; @@ -311,18 +308,21 @@ begin // buffer[4] := 5; // buffer[5] := 6; // writePIO28(0, 3, buffer); + // writePIO28(0, 3, buffer); + // writePIO28(0, 3, buffer); + // writePIO28(0, 4, buffer); + // writePIO28(0, 5, buffer); + // writePIO28(0, 5, buffer); + // writePIO28(0, 5, buffer); + // psleep(1000); + // writePIO28(0, 5, buffer); + // writePIO28(0, 5, buffer); + // writePIO28(0, 5, buffer); // kfree(puint32(buffer)); console.writestringln('[IDE] (LOAD) END'); - pop_trace(); end; -// procedure flush(); -// begin -// port_write(ATA_CMD_CACHE_FLUSH); -// if not is_ready() then exit; -// end; - procedure readPIO28(drive : uint8; LBA : uint32; buffer : puint8); var status : uint8; @@ -376,10 +376,14 @@ var i: uint16; device: uint8; begin + push_trace('IDE.WritePIO28'); if not validate_28bit_address(LBA) then begin console.writestringln('IDE (writePIO28) ERROR: Invalid LBA!'); end; + console.writeintln(uint32(drive)); + console.writeintln(LBA); + //Add last 4 bits of LBA to device port if IDEDevices[drive].isMaster then begin device:= ATA_DEVICE_MASTER; @@ -390,11 +394,12 @@ begin device_select($F0 or ((LBA and $0F000000) shr 24)); //LBA primary slave end; - no_interrupt(device); + // no_interrupt(device); + port_write(ATA_REG_ERROR, 0); port_write(ATA_REG_CONTROL, 0); - //check if bus is floating + // check if bus is floating status := port_read(ATA_REG_COMMAND); if status = $FF then exit; @@ -407,9 +412,6 @@ begin //send write command port_write(ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - console.writestringlnWND('ide write start', getTerminalHWND()); - console.redrawWindows(); - //write data i:=0; while i < 512 do begin @@ -417,40 +419,30 @@ begin i:= i + 2; end; - console.writestringlnWND('ide write end', getTerminalHWND()); - console.redrawWindows(); - //flush drive cache psleep(1); port_write(ATA_REG_COMMAND, ATA_CMD_CACHE_FLUSH); psleep(1); if not is_ready() then exit; - - console.writestringln('ide write end'); - console.redrawWindows(); - end; -procedure read(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : Puint32); +procedure dread(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : Puint32); var i : uint16; begin - // for i:=0 to sectorCount-1 do begin - // readPIO28(device^.controllerId0, LBA, puint8(@buffer[512*i])); - // end; - - readPIO28(device^.controllerId0, LBA, puint8(buffer)); - + for i:=0 to sectorCount-1 do begin + readPIO28(device^.controllerId0, LBA, puint8(@buffer[512*i])); + end; end; -procedure write(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : Puint32); +procedure dwrite(device : PStorage_device; LBA : uint32; sectorCount : uint32; buffer : Puint32); var i : uint16; begin - // for i:=0 to sectorCount-1 do begin - // writePIO28(device^.controllerId0, LBA, puint8(@buffer[512*i])); - // end; - writePIO28(device^.controllerId0, LBA, puint8(buffer)); + for i:=0 to sectorCount-1 do begin + writePIO28(device^.controllerId0, LBA, puint8(@buffer[512*i])); + end; + // writePIO28(device^.controllerId0, LBA, puint8(buffer)); end; end. \ No newline at end of file diff --git a/src/driver/storage/fat32.pas b/src/driver/storage/fat32.pas index 8c0eb5de..24e81925 100644 --- a/src/driver/storage/fat32.pas +++ b/src/driver/storage/fat32.pas @@ -833,73 +833,35 @@ begin //maybe increase buffer size by one? console.writestringWND('sectorsize', getTerminalHWND()); console.writeintlnWND(disk^.sectorsize, getTerminalHWND()); - console.redrawWindows(); - - bt:= puint32(kalloc(512)); - - bt[1] := 1; - bt[2] := 1; - bt[3] := 1; - bt[4] := 1; - bt[5] := 1; - bt[6] := 1; - bt[7] := 11; - bt[8] := 33; - bt[9] := 22; - disk^.writecallback(disk, 3, 1, puint32(bt)); - - - // puint32(buffer)[127]:= $55AA; - - console.writestringlnWND('writting to bootrecord', getTerminalHWND()); - console.writeintlnWND(start + 1, getTerminalHWND()); - console.redrawWindows; - disk^.writecallback(disk, start + 1, 1, puint32(buffer)); - console.writestringlnWND('finished writting to bootrecord', getTerminalHWND()); - - console.redrawWindows; - fatStart:= start + 1 + bootRecord^.rsvSectors; dataStart:= fatStart + bootRecord^.FATSize; zeroBuffer:= puint32(kalloc( disk^.sectorSize )); memset(uint32(zeroBuffer), 0, disk^.sectorSize ); - // while true do begin - // if i > FATSize then break; - // disk^.writecallback(disk, fatStart + i, 1, zeroBuffer); - // i+=1; - // end; + while true do begin + if i > FATSize then break; + disk^.writecallback(disk, fatStart + i, 1, zeroBuffer); + i+=1; + end; kfree(buffer); kfree(zeroBuffer); - writestring('Frees'); - console.redrawWindows; - console.writestringlnWND('writting 1', getTerminalHWND()); - console.redrawWindows; buffer:= puint32(kalloc(disk^.sectorSize)); memset(uint32(buffer), 0, disk^.sectorSize); - console.writestringlnWND('writting 1', getTerminalHWND()); - console.redrawWindows; puint32(buffer)[0]:= $FFFFFFF8; //fsinfo puint32(buffer)[1]:= $FFFFFFF8; //root cluster - writestring('Buffer Alloc'); - console.redrawWindows; disk^.writecallback(disk, fatStart, 1, buffer); - writestring('WriteCB1'); - console.redrawWindows; kfree(buffer); buffer:= puint32(kalloc(disk^.sectorsize)); memset(uint32(buffer), 0, disk^.sectorsize); - writestring('Buffer Alloc 2'); - console.redrawWindows; PDirectory(buffer)[0].fileName := thisArray; PDirectory(buffer)[0].attributes := $08; @@ -910,12 +872,8 @@ begin //maybe increase buffer size by one? PDirectory(buffer)[1].clusterLow := 1; disk^.writecallback(disk, dataStart + (config^ * rootCluster), 1, buffer); - writestring('WriteCB2'); - console.redrawWindows; kfree(buffer); - writestring('Free'); - console.redrawWindows; end; diff --git a/src/driver/storage/storagemanagement.pas b/src/driver/storage/storagemanagement.pas index ce134a0b..3d92c56f 100644 --- a/src/driver/storage/storagemanagement.pas +++ b/src/driver/storage/storagemanagement.pas @@ -118,7 +118,7 @@ end; { Disk subcommand for listing drives } procedure ls_command(params : PParamList); -var +var i : uint16; begin push_trace('storagemanagment.ls_command'); @@ -152,15 +152,26 @@ end; procedure format_command(params : PParamList); var driveIndex : uint16; + drive : PStorage_Device; + filesystemString : pchar; filesystem : PFileSystem; + spc : puint32; begin - // driveIndex:= stringToInt( getParam(params, 1) ); - // PFilesystem(LL_Get(filesystems, 0))^.createCallback( - // (PStorage_Device(LL_Get(storageDevices, drive))), 10000, 1, spc); //todo fs + spc:= puint32(kalloc(4)); + spc^:= 4; + driveIndex:= stringToInt( getParam(1, params) ); + drive:= PStorage_Device(LL_Get(storageDevices, driveIndex)); + //todo change b4 adding in aniother filesytem + PFilesystem(LL_Get(filesystems, 0))^.createCallback(drive, drive^.maxSectorCount-1, 1, spc); + + writestringWnd('Drive ', getTerminalHWND); + writeintWnd(driveIndex, getTerminalHWND); + writestringlnWnd(' formatted.', getTerminalHWND); + end; @@ -172,6 +183,12 @@ var subcmd : pchar; begin push_trace('StorageManagment.disk_command'); + + //check if params wehre supplied + if paramCount(params) = 0 then begin + writestringlnWnd('Incorrect number of params.', getTerminalHWND); + exit; + end; subcmd:= getParam(0, params); @@ -183,6 +200,7 @@ begin //format command for clearing a disk and make a new volume if stringEquals(subcmd, 'format') then begin + format_command(params); end; //lsfs command for listing filesystems diff --git a/src/include/util.pas b/src/include/util.pas index ad0eefbe..b34a737c 100644 --- a/src/include/util.pas +++ b/src/include/util.pas @@ -267,6 +267,7 @@ begin switchendian:= (lo(b) SHL 4) OR hi(b); end; +//Was broken, now does nothing. procedure psleep(t : uint16); var t1, t2 : uint16; @@ -275,6 +276,7 @@ begin t1:= BDA^.Ticks; t2:= BDA^.Ticks; while t2-t1 < t do begin + break; t2:= BDA^.Ticks; if t2 < t1 then break; end;