Пример #1
0
        /// <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);
                    }
                }
            }
        }
Пример #2
0
 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);
     }
 }
Пример #3
0
        /// <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]");
        }
Пример #4
0
        /// <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;
     }
 }