From 6d960bd9556b00a3fdf18ce8e12f6b213f704ac6 Mon Sep 17 00:00:00 2001 From: KingLuigi4932 Date: Fri, 8 Sep 2017 00:13:54 -0700 Subject: [PATCH] Move IDE to a new Location --- source/Cosmos.HAL2/Drivers/Controllers/IDE.cs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 source/Cosmos.HAL2/Drivers/Controllers/IDE.cs diff --git a/source/Cosmos.HAL2/Drivers/Controllers/IDE.cs b/source/Cosmos.HAL2/Drivers/Controllers/IDE.cs new file mode 100644 index 000000000..f5670029e --- /dev/null +++ b/source/Cosmos.HAL2/Drivers/Controllers/IDE.cs @@ -0,0 +1,65 @@ +using System; +using Cosmos.HAL.BlockDevice; + +namespace Cosmos.HAL.Drivers.PCI.SATA +{ + public class IDE + { + public static void InitAta(Ata.ControllerIdEnum aControllerID, Ata.BusPositionEnum aBusPosition) + { + var xIO = aControllerID == Ata.ControllerIdEnum.Primary ? Core.Global.BaseIOGroups.ATA1 : Core.Global.BaseIOGroups.ATA2; + var xATA = new AtaPio(xIO, aControllerID, aBusPosition); + if (xATA.DriveType == AtaPio.SpecLevel.Null) + { + return; + } + if (xATA.DriveType == AtaPio.SpecLevel.ATA) + { + BlockDevice.BlockDevice.Devices.Add(xATA); + Ata.AtaDebugger.Send("ATA device with speclevel ATA found."); + } + else + { + //Ata.AtaDebugger.Send("ATA device with spec level " + (int)xATA.DriveType + + // " found, which is not supported!"); + return; + } + var xMbrData = new byte[512]; + xATA.ReadBlock(0UL, 1U, xMbrData); + var xMBR = new MBR(xMbrData); + + if (xMBR.EBRLocation != 0) + { + //EBR Detected + var xEbrData = new byte[512]; + xATA.ReadBlock(xMBR.EBRLocation, 1U, xEbrData); + var xEBR = new EBR(xEbrData); + + for (int i = 0; i < xEBR.Partitions.Count; i++) + { + //var xPart = xEBR.Partitions[i]; + //var xPartDevice = new BlockDevice.Partition(xATA, xPart.StartSector, xPart.SectorCount); + //BlockDevice.BlockDevice.Devices.Add(xPartDevice); + } + } + + // TODO Change this to foreach when foreach is supported + Ata.AtaDebugger.Send("Number of MBR partitions found:"); + Ata.AtaDebugger.SendNumber(xMBR.Partitions.Count); + for (int i = 0; i < xMBR.Partitions.Count; i++) + { + var xPart = xMBR.Partitions[i]; + if (xPart == null) + { + Console.WriteLine("Null partition found at idx: " + i); + } + else + { + var xPartDevice = new Partition(xATA, xPart.StartSector, xPart.SectorCount); + BlockDevice.BlockDevice.Devices.Add(xPartDevice); + Console.WriteLine("Found partition at idx" + i); + } + } + } + } +}