diff options
Diffstat (limited to 'Private/Source')
| -rw-r--r-- | Private/Source/Storage/ATA-Wrapper.cxx | 102 | ||||
| -rw-r--r-- | Private/Source/Storage/ATAWrapper.cxx | 64 |
2 files changed, 64 insertions, 102 deletions
diff --git a/Private/Source/Storage/ATA-Wrapper.cxx b/Private/Source/Storage/ATA-Wrapper.cxx deleted file mode 100644 index 407cd30f..00000000 --- a/Private/Source/Storage/ATA-Wrapper.cxx +++ /dev/null @@ -1,102 +0,0 @@ -/* ------------------------------------------- - - Copyright Mahrouss Logic - -------------------------------------------- */ - -#include <ArchKit/ArchKit.hpp> -#include <StorageKit/ATA.hpp> - -#define kBufferLen 512 - -//! @brief ATA DMA Driver -//! The idea is to let a driver do the transfer. - -/// bugs 0 - -#define kATAError 2 - -namespace HCore { -Ref<PRDT*> kPrdt = nullptr; - -bool set_prdt_struct(Ref<PRDT*>& refCtrl) { - if (!kPrdt) { - kPrdt = refCtrl; - kcout << "[set_prdt_struct] PRDT is set."; - - return true; - } - - kcout << "[set_prdt_struct] [WARNING] Trying to change PRDT.\n"; - return false; -} - -enum { - k28BitRead = 0xC8, - k48BitRead = 0x25, - k28BitWrite = 0xCA, - k48BitWrite = 0x35, -}; - -const char* ata_read_28(ULong lba) { - if (!kPrdt) return nullptr; - - char* buffer = reinterpret_cast<char*>(Alloca(sizeof(char) * kBufferLen)); - rt_set_memory(buffer, 0, kBufferLen); - - UIntPtr* packet = reinterpret_cast<UIntPtr*>(kPrdt.Leak()->PhysicalAddress()); - - packet[0] = k28BitRead; - packet[1] = (UIntPtr)&buffer; - packet[4] = lba; - - rt_wait_400ns(); - - return buffer; -} - -const char* ata_read_48(ULong lba) { - if (!kPrdt) return nullptr; - - char* buffer = reinterpret_cast<char*>(Alloca(sizeof(char) * kBufferLen)); - rt_set_memory(buffer, 0, kBufferLen); - - UIntPtr* packet = reinterpret_cast<UIntPtr*>(kPrdt.Leak()->PhysicalAddress()); - - packet[0] = k48BitRead; - packet[1] = (UIntPtr)buffer; - packet[4] = lba; - - rt_wait_400ns(); - - return buffer; -} - -Int32 ata_write_48(ULong lba, const char* buffer) { - if (!kPrdt) return kATAError; - - UIntPtr* packet = reinterpret_cast<UIntPtr*>(kPrdt.Leak()->PhysicalAddress()); - - packet[0] = k48BitWrite; - packet[1] = (UIntPtr)buffer; - packet[2] = lba; - - rt_wait_400ns(); - - return packet[1] == 2 ? kATAError : 0; -} - -Int32 ata_write_28(ULong lba, const char* buffer) { - if (!kPrdt) return kATAError; - - UIntPtr* packet = (UIntPtr*)kPrdt.Leak()->PhysicalAddress(); - - packet[0] = k28BitWrite; - packet[1] = (UIntPtr)buffer; - packet[2] = lba; - - rt_wait_400ns(); - - return packet[1] == 2 ? kATAError : 0; -} -} // namespace HCore diff --git a/Private/Source/Storage/ATAWrapper.cxx b/Private/Source/Storage/ATAWrapper.cxx new file mode 100644 index 00000000..22996d12 --- /dev/null +++ b/Private/Source/Storage/ATAWrapper.cxx @@ -0,0 +1,64 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + +------------------------------------------- */ + +#include <ArchKit/ArchKit.hpp> +#include <Builtins/ATA/Defines.hxx> +#include <StorageKit/ATA.hpp> + +#define kBufferLen 512 +#define kSectorCount 512 + +//! @brief ATA DMA Driver +//! The idea is to let a driver do the transfer. +/// @author Amlal EL Mahrouss +/// BUGS: 0 + +#define kATAError 2 + +namespace HCore { +Ref<PRDT*> kPrdt = nullptr; + +bool set_prdt_struct(Ref<PRDT*>& refCtrl) { + if (!kPrdt) { + kPrdt = refCtrl; + kcout << "[set_prdt_struct] PRDT is set."; + + return true; + } + + kcout << "[set_prdt_struct] [WARNING] Trying to change PRDT.\n"; + return false; +} + +enum { + k28BitRead = 0xC8, + k48BitRead = 0x25, + k28BitWrite = 0xCA, + k48BitWrite = 0x35, +}; + +const char* ata_read_28(ULong lba) { + if (!kPrdt) return nullptr; + + Char* packet = reinterpret_cast<Char*>(kPrdt.Leak()->PhysicalAddress()); + + drv_ata_read(lba, ATA_PRIMARY_IO, ATA_MASTER, packet, kSectorCount, + kBufferLen); + + return packet; +} + +const char* ata_read_48(ULong lba) { return nullptr; } + +Int32 ata_write_48(ULong lba, char* buffer) { return kATAError; } + +Int32 ata_write_28(ULong lba, char* buffer) { + drv_ata_write(lba, ATA_PRIMARY_IO, ATA_MASTER, buffer, kSectorCount, + kBufferLen); + + return kATAError; +} +} // namespace HCore |
