summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoramlal <amlal@el-mahrouss-logic.com>2024-03-22 14:36:41 +0100
committeramlal <amlal@el-mahrouss-logic.com>2024-03-22 14:36:41 +0100
commit0c61ea5560f26990d08ecbc8207776b308c48db5 (patch)
treef87a77f92321e5f1821afd641739d9d4c33a7d32
parenta955ca743b129839f43ecaef243d84d0dc7b8043 (diff)
NewBoot: BootATA.cxx: Improve driver.
Signed-off-by: amlal <amlal@el-mahrouss-logic.com>
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/BootATA.cxx43
1 files changed, 18 insertions, 25 deletions
diff --git a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
index 72340d01..1d94c776 100644
--- a/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
+++ b/Private/NewBoot/Source/HEL/AMD64/BootATA.cxx
@@ -92,16 +92,6 @@ ATAInit_Retry:
kATAData[indexData] = In16(IO + ATA_REG_DATA);
}
- writer.Write(L"NewBoot: Drive Model: ");
-
- for (SizeT indexData = 0; indexData < kATADataLen; indexData += 1) {
- writer.WriteCharacter(kATAData[indexData]);
- }
-
- writer.Write(L"\r\n");
-
- writer.Write(L"\r\n");
-
OutBus =
(Bus == ATA_PRIMARY_IO) ? BDeviceATA::kPrimary : BDeviceATA::kSecondary;
OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE;
@@ -145,6 +135,8 @@ Void boot_ata_read(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
SizeT SectorSz, SizeT Size) {
UInt8 Command = (!Master ? 0xE0 : 0xF0);
+ boot_ata_wait_io(IO);
+
Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
Out8(IO + ATA_REG_SEC_COUNT0, SectorSz);
@@ -154,16 +146,21 @@ Void boot_ata_read(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
- boot_ata_wait_io(IO);
+ while ((In8(ATA_COMMAND(IO))) & ATA_SR_BSY) boot_ata_wait_io(IO);
- BTextWriter writer;
+ UInt16 byte = In16(IO + ATA_REG_DATA);
+ SizeT IndexOff = 0UL;
+ Buf[IndexOff] = byte;
- writer.Write(L"NewBoot: Port: ").Write(IO).Write(L"\r\n");
+ while (byte != 0xFF) {
+ if (IndexOff > Size) break;
- for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
- WideChar chr = In16(IO + ATA_REG_DATA);
+ ++IndexOff;
+
+ while ((In8(ATA_COMMAND(IO))) & ATA_SR_BSY) boot_ata_wait_io(IO);
- Buf[IndexOff] = chr;
+ byte = In16(IO + ATA_REG_DATA);
+ Buf[IndexOff] = byte;
}
}
@@ -171,6 +168,8 @@ Void boot_ata_write(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
SizeT SectorSz, SizeT Size) {
UInt8 Command = (!Master ? 0xE0 : 0xF0);
+ boot_ata_wait_io(IO);
+
Out8(IO + ATA_REG_HDDEVSEL, (Command) | (((Lba) >> 24) & 0xF));
Out8(IO + ATA_REG_SEC_COUNT0, SectorSz);
@@ -180,11 +179,9 @@ Void boot_ata_write(UInt32 Lba, UInt16 IO, UInt8 Master, CharacterTypeUTF8* Buf,
Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
- boot_ata_wait_io(IO);
-
for (SizeT IndexOff = 0; IndexOff < Size; ++IndexOff) {
+ boot_ata_wait_io(IO);
Out16(IO + ATA_REG_DATA, Buf[IndexOff]);
-
}
}
@@ -213,12 +210,8 @@ BDeviceATA::BDeviceATA() noexcept {
kATADetected = true;
BTextWriter writer;
+
writer.Write(L"NewBoot: Drive is OnLine.\r\n");
- writer.Write(L"NewBoot: IO: ")
- .Write(this->Leak().mBus)
- .Write(L" Master: ")
- .Write(this->Leak().mMaster)
- .Write(L"\r\n");
}
}
/**
@@ -262,7 +255,7 @@ BDeviceATA& BDeviceATA::Write(CharacterTypeUTF8* Buf, const SizeT& SectorSz) {
if (!Buf || SectorSz < 1) return *this;
- boot_ata_read(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
+ boot_ata_write(this->Leak().mBase, this->Leak().mBus, this->Leak().mMaster,
Buf, SectorSz, this->Leak().mSize);
return *this;