/// <summary> /// Starts the device. /// </summary> /// <param name="deviceDriver">The device driver.</param> static public void StartDevice(DeviceDriver deviceDriver) { ISADeviceDriverAttribute driverAtttribute = deviceDriver.Attribute as ISADeviceDriverAttribute; if (driverAtttribute.AutoLoad) { IHardwareDevice hardwareDevice = System.Activator.CreateInstance(deviceDriver.DriverType) as IHardwareDevice; //UNUSED: //ISADeviceDriverAttribute attribute = deviceDriver.Attribute as ISADeviceDriverAttribute; LinkedList <IIOPortRegion> ioPortRegions = new LinkedList <IIOPortRegion>(); LinkedList <IMemoryRegion> memoryRegions = new LinkedList <IMemoryRegion>(); ioPortRegions.Add(new IOPortRegion(driverAtttribute.BasePort, driverAtttribute.PortRange)); if (driverAtttribute.AltBasePort != 0x00) { ioPortRegions.Add(new IOPortRegion(driverAtttribute.AltBasePort, driverAtttribute.AltPortRange)); } if (driverAtttribute.BaseAddress != 0x00) { memoryRegions.Add(new MemoryRegion(driverAtttribute.BaseAddress, driverAtttribute.AddressRange)); } foreach (DeviceDriverPhysicalMemoryAttribute memoryAttribute in deviceDriver.MemoryAttributes) { if (memoryAttribute.MemorySize > 0) { IMemory memory = HAL.RequestPhysicalMemory(memoryAttribute.MemorySize, memoryAttribute.MemoryAlignment); memoryRegions.Add(new MemoryRegion(memory.Address, memory.Size)); } } IHardwareResources hardwareResources = new HardwareResources(resourceManager, ioPortRegions.ToArray(), memoryRegions.ToArray(), new InterruptHandler(resourceManager.InterruptManager, driverAtttribute.IRQ, hardwareDevice)); hardwareDevice.Setup(hardwareResources); if (resourceManager.ClaimResources(hardwareResources)) { hardwareResources.EnableIRQ(); if (hardwareDevice.Start() == DeviceDriverStartStatus.Started) { deviceManager.Add(hardwareDevice); } else { hardwareResources.DisableIRQ(); resourceManager.ReleaseResources(hardwareResources); } } } }
private IDeviceDriver GetIDeviceDriver(CustomAttributeData attributeData) { if (attributeData.AttributeType == typeof(ISADeviceDriverAttribute)) { var attribute = new ISADeviceDriverAttribute(); foreach (var arg in attributeData.NamedArguments) { if (arg.MemberName == "Platforms") { attribute.Platforms = (PlatformArchitecture)arg.TypedValue.Value; } else if (arg.MemberName == "BasePort") { attribute.BasePort = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "PortRange") { attribute.PortRange = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "AltBasePort") { attribute.AltBasePort = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "AltPortRange") { attribute.AltPortRange = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "AutoLoad") { attribute.AutoLoad = (bool)arg.TypedValue.Value; } else if (arg.MemberName == "ForceOption") { attribute.ForceOption = (string)arg.TypedValue.Value; } else if (arg.MemberName == "IRQ") { attribute.IRQ = (byte)arg.TypedValue.Value; } else if (arg.MemberName == "BaseAddress") { attribute.BaseAddress = (uint)arg.TypedValue.Value; } else if (arg.MemberName == "AddressRange") { attribute.AddressRange = (uint)arg.TypedValue.Value; } } return(attribute); } else { var attribute = new PCIDeviceDriverAttribute(); foreach (var arg in attributeData.NamedArguments) { if (arg.MemberName == "Platforms") { attribute.Platforms = (PlatformArchitecture)arg.TypedValue.Value; } else if (arg.MemberName == "DeviceID") { attribute.DeviceID = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "VendorID") { attribute.VendorID = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "SubVendorID") { attribute.SubVendorID = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "SubDeviceID") { attribute.SubDeviceID = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "RevisionID") { attribute.RevisionID = (byte)arg.TypedValue.Value; } else if (arg.MemberName == "ProgIF") { attribute.ProgIF = (byte)arg.TypedValue.Value; } else if (arg.MemberName == "ClassCode") { attribute.ClassCode = (ushort)arg.TypedValue.Value; } else if (arg.MemberName == "SubClassCode") { attribute.SubClassCode = (byte)arg.TypedValue.Value; } } return(attribute); } }
/// <summary> /// Starts the ISA devices. /// </summary> public static void StartISADevices() { //LinkedList<DeviceDriver> deviceDrivers = deviceDriverRegistry.GetISADeviceDrivers(); //foreach (DeviceDriver deviceDriver in deviceDrivers) // StartDevice(deviceDriver); //[ISADeviceDriver(AutoLoad = true, BasePort = 0x60, PortRange = 1, AltBasePort = 0x64, AltPortRange = 1, IRQ = 1, Platforms = PlatformArchitecture.X86AndX64)] ISADeviceDriverAttribute keyboardDeviceAttributes = new ISADeviceDriverAttribute(); keyboardDeviceAttributes.AutoLoad = true; keyboardDeviceAttributes.BasePort = 0x60; keyboardDeviceAttributes.PortRange = 1; keyboardDeviceAttributes.AltBasePort = 0x64; keyboardDeviceAttributes.IRQ = 1; keyboardDeviceAttributes.Platforms = PlatformArchitecture.X86AndX64; //[ISADeviceDriver(AutoLoad = true, BasePort = 0x0CF8, PortRange = 8, Platforms = PlatformArchitecture.X86AndX64)] ISADeviceDriverAttribute pciAttributes = new ISADeviceDriverAttribute(); pciAttributes.AutoLoad = true; pciAttributes.BasePort = 0x0CF8; pciAttributes.PortRange = 8; pciAttributes.Platforms = PlatformArchitecture.X86AndX64; //[ISADeviceDriver(AutoLoad = true, BasePort = 0x20, PortRange = 2, AltBasePort = 0xA0, AltPortRange = 2, Platforms = PlatformArchitecture.X86AndX64)] ISADeviceDriverAttribute picAttributes = new ISADeviceDriverAttribute(); picAttributes.AutoLoad = true; picAttributes.BasePort = 0x20; picAttributes.PortRange = 2; picAttributes.AltBasePort = 0xA0; picAttributes.AltPortRange = 2; picAttributes.Platforms = PlatformArchitecture.X86AndX64; //[ISADeviceDriver(AutoLoad = true, BasePort = 0x40, PortRange = 4, IRQ = 0, Platforms = PlatformArchitecture.X86AndX64)] ISADeviceDriverAttribute pitAttributes = new ISADeviceDriverAttribute(); pitAttributes.AutoLoad = true; pitAttributes.BasePort = 0x40; pitAttributes.PortRange = 4; pitAttributes.IRQ = 0; pitAttributes.Platforms = PlatformArchitecture.X86AndX64; Keyboard = new StandardKeyboard(); PCI = new PCIController(); PIC = new PIC(); PIT = new PIT(); //StartDevice(picAttributes, PIC); StartDevice(pitAttributes, PIT); StartDevice(pciAttributes, PCI); StartDevice(keyboardDeviceAttributes, Keyboard); PCIControllerManager pciController = new PCIControllerManager(deviceManager); Console.Write("Probing PCI devices..."); //pciController.CreatePCIDevices(); Console.WriteLine("[Completed]"); }
/// <summary> /// Starts the device. /// </summary> /// <param name="deviceDriver">The device driver.</param> public static void StartDevice(ISADeviceDriverAttribute driverAtttribute, IHardwareDevice hardwareDevice) { int ioRegionCount = 1; int memoryRegionCount = 0; if (driverAtttribute.AltBasePort != 0x00) { ioRegionCount++; } if (driverAtttribute.BaseAddress != 0x00) memoryRegionCount++; IIOPortRegion[] ioPortRegions = new IIOPortRegion[ioRegionCount]; IMemoryRegion[] memoryRegions = new IMemoryRegion[memoryRegionCount]; ioPortRegions[0] = new IOPortRegion(driverAtttribute.BasePort, driverAtttribute.PortRange); if (driverAtttribute.AltBasePort != 0x00) { ioPortRegions[1] = new IOPortRegion(driverAtttribute.AltBasePort, driverAtttribute.AltPortRange); } if (driverAtttribute.BaseAddress != 0x00) { memoryRegions[0] = new MemoryRegion(driverAtttribute.BaseAddress, driverAtttribute.AddressRange); } IHardwareResources hardwareResources = new HardwareResources(resourceManager, ioPortRegions, memoryRegions, new InterruptHandler(resourceManager.InterruptManager, driverAtttribute.IRQ, hardwareDevice)); hardwareDevice.Setup(hardwareResources); Mosa.Kernel.x86.Screen.NextLine(); Mosa.CoolWorld.x86.Boot.BulletPoint(); Console.Write("Adding device "); Boot.InBrackets(hardwareDevice.Name, Colors.White, Colors.LightGreen); Console.WriteLine(); if (resourceManager.ClaimResources(hardwareResources)) { hardwareResources.EnableIRQ(); if (hardwareDevice.Start() == DeviceDriverStartStatus.Started) { deviceManager.Add(hardwareDevice); } else { hardwareResources.DisableIRQ(); resourceManager.ReleaseResources(hardwareResources); } } }
private IDeviceDriver GetIDeviceDriver(CustomAttributeData attributeData) { if (attributeData.AttributeType == typeof(ISADeviceDriverAttribute)) { var attribute = new ISADeviceDriverAttribute(); foreach (var arg in attributeData.NamedArguments) { if (arg.MemberName == "Platforms") attribute.Platforms = (PlatformArchitecture)arg.TypedValue.Value; else if (arg.MemberName == "BasePort") attribute.BasePort = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "PortRange") attribute.PortRange = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "AltBasePort") attribute.AltBasePort = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "AltPortRange") attribute.AltPortRange = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "AutoLoad") attribute.AutoLoad = (bool)arg.TypedValue.Value; else if (arg.MemberName == "ForceOption") attribute.ForceOption = (string)arg.TypedValue.Value; else if (arg.MemberName == "IRQ") attribute.IRQ = (byte)arg.TypedValue.Value; else if (arg.MemberName == "BaseAddress") attribute.BaseAddress = (uint)arg.TypedValue.Value; else if (arg.MemberName == "AddressRange") attribute.AddressRange = (uint)arg.TypedValue.Value; } return attribute; } else { var attribute = new PCIDeviceDriverAttribute(); foreach (var arg in attributeData.NamedArguments) { if (arg.MemberName == "Platforms") attribute.Platforms = (PlatformArchitecture)arg.TypedValue.Value; else if (arg.MemberName == "DeviceID") attribute.DeviceID = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "VendorID") attribute.VendorID = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "SubVendorID") attribute.SubSystemVendorID = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "SubDeviceID") attribute.SubSystemID = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "RevisionID") attribute.RevisionID = (byte)arg.TypedValue.Value; else if (arg.MemberName == "ProgIF") attribute.ProgIF = (byte)arg.TypedValue.Value; else if (arg.MemberName == "ClassCode") attribute.ClassCode = (ushort)arg.TypedValue.Value; else if (arg.MemberName == "SubClassCode") attribute.SubClassCode = (byte)arg.TypedValue.Value; } return attribute; } }