using System; using System.Collections.Generic; using System.Linq; using System.Text; using Cosmos.Debug.Kernel; namespace Cosmos.HAL { public class PCI { private static List devices; private static Debugger mDebugger; public static void Setup() { mDebugger = Global.Dbg; EnumerateDevices(); } public static PCIDevice GetDevice(ushort VendorID, ushort DeviceID) { for (int i = 0; i < devices.Count; i++) { if (devices[i].VendorID == VendorID && devices[i].DeviceID == DeviceID) return devices[i]; } return null; } private static void EnumerateDevices() { devices = new List(); EnumerateBus(0, 0); } private static void EnumerateBus(uint xBus, uint step) { for (uint xDevice = 0; xDevice < 32; xDevice++) { PCIDevice xPCIDevice = new PCIDevice(xBus, xDevice, 0x00); if (xPCIDevice.DeviceExists) { if (xPCIDevice.HeaderType == PCIDevice.PCIHeaderType.Bridge) { for (uint xFunction = 0; xFunction < 8; xFunction++) { xPCIDevice = new PCIDevice(xBus, xDevice, xFunction); if (xPCIDevice.DeviceExists) AddDevice(new PCIDeviceBridge(xBus, xDevice, xFunction), step); } } else if (xPCIDevice.HeaderType == PCIDevice.PCIHeaderType.Cardbus) { AddDevice(new PCIDeviceCardbus(xBus, xDevice, 0x00), step); } else { AddDevice(new PCIDeviceNormal(xBus, xDevice, 0x00), step); } } } } private static void AddDevice(PCIDevice device, uint step) { string str = ""; for (int i = 0; i < step; i++) str += " "; var xText = str + device.bus + ":" + device.slot + ":" + device.function + " " + PCIDevice.DeviceClass.GetString(device); mDebugger.Send(xText); Console.WriteLine(xText); devices.Add(device); if (device is PCIDeviceBridge) EnumerateBus(((PCIDeviceBridge)device).SecondaryBusNumber, step + 1); } } }