public static bool GetFixedIoIrqRange(uint range, out byte line, out byte size) { bool ret = false; line = 0; size = 0; IoConfig config = Thread.CurrentProcess.IoConfig; if (config != null && config.FixedRanges.Length > range) { IoIrqRange iir = config.FixedRanges[range] as IoIrqRange; if (iir != null) { line = iir.Line; size = iir.Size; ret = true; } } Tracing.Log(Tracing.Debug, "DeviceService.GetFixedIoIrqRange(range={0}, out line={1:x2}, out size={2:x2})", range, line, size); return(ret); }
public static bool Create(byte irqNum, out InterruptHandle handle) { bool ret = false; handle = new InterruptHandle(); // // Create an IoIrq, and a handle in the current process to hold it. // IoConfig config = Thread.CurrentProcess.IoConfig; for (int i = 0; i < config.DynamicRanges.Length; i++) { IoIrqRange iir = config.DynamicRanges[i] as IoIrqRange; if (iir != null && iir.Irq <= irqNum && irqNum < iir.Irq + iir.Size) { IoIrq irq = iir.IrqAtOffset((byte)(irqNum - iir.Irq)); handle = new InterruptHandle( Thread.CurrentProcess.AllocateHandle(irq)); irq.RegisterInterrupt(); ret = true; break; } } Tracing.Log(Tracing.Debug, "InterruptHandle.Create(irq={0:x2}, out id={0:x8})", irqNum, handle.id); return(ret); }
// CTR will create the rest of this class: public TimerResources(IoConfig config) { // dynamic resources registers = (IoMemoryRange)config.DynamicRanges[0]; irq = (IoIrqRange)config.DynamicRanges[1]; }