internal static void SetInterruptHandler(KnownInterrupt interrupt, InterruptHandler interruptHandler) { if (interruptHandler == null) { interruptHandler = UndefinedHandler; } handlers[(uint)interrupt].Handler = interruptHandler; }
public InterruptTriggeredMemoryMappedDevice(IMemoryBus memoryBus, InterruptHandler interruptHandler, String irqName, int memoryRangeStart, int memoryRangeLength) { _memoryBus = memoryBus; this.MemoryRangeStart = memoryRangeStart; this.MemoryRangeLength = memoryRangeLength; interruptHandler.RegisterHardwareInterrupt(irqName, 1048568, 127, true, RefreshInterruptTriggered); }
internal static void SetInterruptHandler(uint interrupt, InterruptHandler interruptHandler, ProcessService service = null) { if (interruptHandler == null) { interruptHandler = InterruptHandlers.Undefined; } Handlers[interrupt].Handler = interruptHandler; Handlers[interrupt].Service = service; }
public KeyboardDevice(IMemoryBus memoryBus, InterruptHandler interruptHandler, int memoryRangeStart, int memoryRangeLength) { this.MemoryRangeStart = memoryRangeStart; this.MemoryRangeLength = memoryRangeLength; _memoryBus = memoryBus; interruptHandler.RegisterSoftwareInterruptQueue("Keyboard request queue", "Keyboard", 1048439, 1048431); }
public void registerInterruptHandler(byte pin, GTI.InterruptMode mode, InterruptHandler handler) { InterruptRegistraton reg = new InterruptRegistraton(); reg.handler = handler; reg.mode = mode; reg.pin = pin; lock (this.interruptHandlers) this.interruptHandlers.Add(reg); }
public override bool RegisterHandler(InterruptHandler handler) { System.Diagnostics.Debugger.Log(0, "ACPIInterrupt", ShortName + " RegisterHandler"); bool ret = base.RegisterHandler(handler); if (ret == false) { return(false); } gsi.SetMode(is_level_trigger, is_low_active); return(true); }
public static bool ForceInterrupt(ModuleBase module, MixInstruction.Instance instance) { if (!(module is Mix)) { module.ReportRuntimeError(string.Format("The {0} instruction is only available in Mix", instance.Instruction.Mnemonic)); return(false); } InterruptHandler.HandleInterrupt((Mix)module, new Interrupt(Interrupt.Types.Forced)); return(false); }
public static IDigitalInterrupt Bind(Pin pin, InterruptHandler handler, string name = null, ResistorMode internalResistorMode = ResistorMode.Disabled, InterruptMode interruptMode = InterruptMode.InterruptNone, int debounceMilliseconds = 0) { var result = NewInstance(pin, name, internalResistorMode, interruptMode, debounceMilliseconds); result.OnInterrupt += handler; Cache.Add(pin, result); return(result); }
public override bool RegisterHandler(InterruptHandler handler) { System.Diagnostics.Debugger.Log(0, "SharedInterruptLine", ShortName + " RegisterHandler"); handlers.Add(handler); handler_threads.Add(Program.arch.CurrentCpu.CurrentThread); if (handlers.Count == 1) { if (shared_line != null) { shared_line.RegisterHandler(new InterruptHandler(Handler)); } } return(true); }
public void RaiseInterrupt(bool state, DateTime time) { if (!InterruptEnabled) { return; } InterruptHandler handler = _onInterrupt; if (handler != null) { bool newValue = InvertReading ? !state : state; handler(this, newValue, time); } }
public override bool RegisterHandler(InterruptHandler handler) { System.Diagnostics.Debugger.Log(0, "IOAPICGSI", ShortName + " RegisterHandler"); /* Get a free CPU interrupt */ if (cpu_int == null) { lock (apic.ints) { if (apic.ints.Count == 0) { System.Diagnostics.Debugger.Log(0, "ioapic", "Unable to register handler for GSI " + gsi_num.ToString() + ": no free cpu interrupts available"); return(false); } cpu_int = apic.ints[apic.ints.Count - 1] as tysos.x86_64.x86_64_Interrupt; apic.ints.RemoveAt(apic.ints.Count - 1); } } if (cpu_int == null) { System.Diagnostics.Debugger.Log(0, "ioapic", "CPU register is not a x86_64 interrupt"); return(false); } /* Disable the ioapic entry for now, then re-enable later once we have * set up the cpu interrupt and the trigger mode */ int ioredtbl_idx = 0x10 + 2 * ioapic_idx; uint ioredtbl = apic.ReadRegister(ioredtbl_idx); ioredtbl &= 0xfffe0000U; ioredtbl |= 0x1U << 16; apic.WriteRegister(ioredtbl_idx, ioredtbl); /* Register the handler with the cpu */ cpu_int.RegisterHandler(handler); /* Don't enable the ioapic entry yet - we do not know the trigger * mode or polarity - these need to be provided by a separate call * from the acpi driver (which does know these things) */ return(true); }
private void ProxyToUserHandler(uint pinNumber, uint value, DateTime time) { ThrowIfDisposed(); if (!InterruptEnabled) { return; } DateTime debounceEnds = LastTriggered.AddMilliseconds(DebounceMilliseconds); if (DebounceMilliseconds > 0 && debounceEnds > time) { return; } _lastTriggered = time; InterruptHandler handler = _onInterrupt; if (handler != null) { bool newValue = InvertReading ? value == 0 : value == 1; handler(this, newValue, time); } //todo - need callback to possibly fire after debounce time if were toggled }
public ConsoleDevice(IMemoryBus memoryBus, InterruptHandler interruptHandler, int memoryRangeStart, int memoryRangeLength) : base(memoryBus, interruptHandler, "Console refresh trigger", memoryRangeStart, memoryRangeLength) { }
private void OnInterruptOccurred(TrackingSensorStatus status) { InterruptHandler?.Invoke(this, new TrackingSensorEventArgs(status)); }
internal static void SetInterruptHandler(KnownInterrupt interrupt, InterruptHandler interruptHandler) { SetInterruptHandler((uint)interrupt, interruptHandler); }
internal static void SetInterruptPreHandler(uint interrupt, InterruptHandler interruptHandler) { Handlers[interrupt].PreHandler = interruptHandler; }
public abstract bool RegisterHandler(InterruptHandler handler);
public void StartChurn(InterruptHandler handler) { if (_churnInt == null || _churnInt.Active) return; _churnInt.AddInterruption (handler); _churnInt.Start (); }
public CC2538RF() { rxLock = new object(); rxQueue = new Queue<Frame>(); txQueue = new Queue<byte>(); shortAddress = new Address(AddressingMode.ShortAddress); extendedAddress = new Address(AddressingMode.ExtendedAddress); random = new Random(); IRQ = new GPIO(); srcShortEnabled = new bool[24]; srcExtendedEnabled = new bool[12]; matchedSourceAddresses = new bool[24]; srcShortPendEnabled = new bool[24]; srcExtendedPendEnabled = new bool[12]; ffsmMemory = new uint[96]; irqHandler = new InterruptHandler<InterruptRegister, InterruptSource>(IRQ); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.StartOfFrameDelimiter, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FifoP, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchDone, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchFound, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FrameAccepted, 5); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxPktDone, 6); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxMaskZero, 7); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxAckDone, 0); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxDone, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.RfIdle, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorManualInterrupt, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorStop, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorWait, 5); var matchedSourceIndex = new DoubleWordRegister(this); matchedSourceIndexField = matchedSourceIndex.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write); var srcResMask = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcResMaskRegister, writeCallback: WriteSrcResMaskRegister); var srcExtendedAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcExtendedAddressPendingEnabledRegister, writeCallback: WriteSrcExtendedAddressPendingEnabledRegister); var srcShortAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, name: "SrcShortAddressPendingEnabled", valueProviderCallback: ReadSrcShortAddressPendingEnabledRegister, writeCallback: WriteSrcShortAddressPendingEnabledRegister); var extAddress = CreateRegistersGroup(8, this, 0, 8, valueProviderCallback: i => extendedAddress.Bytes[i], writeCallback: (i, @new) => extendedAddress.SetByte((byte)@new, i)); panId = CreateRegistersGroup(2, this, 0, 8); var shortAddressRegister = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => shortAddress.Bytes[i], writeCallback: (i, @new) => shortAddress.SetByte((byte)@new, i)); var sourceExtendedAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceExtendedAddressEnableRegister, writeCallback: WriteSourceExtendedAddressEnableRegister); var sourceShortAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceShortAddressEnableRegister, writeCallback: WriteSourceShortAddressEnableRegister); var frameHandling0 = new DoubleWordRegister(this, 0x40); autoAck = frameHandling0.DefineFlagField(5); autoCrc = frameHandling0.DefineFlagField(6); appendDataMode = frameHandling0.DefineFlagField(7); var frameHandling1 = new DoubleWordRegister(this, 0x1); pendingOr = frameHandling1.DefineFlagField(2); var sourceAddressMatching = new DoubleWordRegister(this, 0x7); sourceAddressMatchingEnabled = sourceAddressMatching.DefineFlagField(0); autoPendEnabled = sourceAddressMatching.DefineFlagField(1); pendDataRequestOnly = sourceAddressMatching.DefineFlagField(2); var radioStatus0 = new DoubleWordRegister(this, 0x81).WithValueField(0, 8, FieldMode.Read); var radioStatus1 = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: ReadRadioStatus1Register); var rssiValidStatus = new DoubleWordRegister(this, 0x1).WithFlag(0, FieldMode.Read); var interruptMask = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i), @new); }); var randomData = new DoubleWordRegister(this, 0).WithValueField(0, 2, FieldMode.Read, valueProviderCallback: _ => (uint)(random.Next() & 3)); var frameFiltering0 = new DoubleWordRegister(this, 0xD); frameFilterEnabled = frameFiltering0.DefineFlagField(0); isPanCoordinator = frameFiltering0.DefineFlagField(1); maxFrameVersion = frameFiltering0.DefineValueField(2, 2); var frameFiltering1 = new DoubleWordRegister(this, 0x78); acceptBeaconFrames = frameFiltering1.DefineFlagField(3); acceptDataFrames = frameFiltering1.DefineFlagField(4); acceptAckFrames = frameFiltering1.DefineFlagField(5); acceptMacCmdFrames = frameFiltering1.DefineFlagField(6); var rfData = new DoubleWordRegister(this, 0).WithValueField(0, 8, valueProviderCallback: _ => DequeueData(), writeCallback: (_, @new) => { EnqueueData((byte)@new); }); var interruptFlag = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterValue(InterruptRegisterHelper.GetValueRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterValue(InterruptRegisterHelper.GetValueRegister(i), @new); }); var commandStrobeProcessor = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Write, writeCallback: (_, @new) => { HandleSFRInstruction(@new); }); var addresses = new Dictionary<long, DoubleWordRegister> { { (uint)Register.RfData, rfData }, { (uint)Register.CommandStrobeProcessor, commandStrobeProcessor }, { (uint)Register.FrameFiltering0, frameFiltering0 }, { (uint)Register.FrameFiltering1, frameFiltering1 }, { (uint)Register.SourceAddressMatching, sourceAddressMatching }, { (uint)Register.FrameHandling0, frameHandling0 }, { (uint)Register.FrameHandling1, frameHandling1 }, { (uint)Register.RadioStatus0, radioStatus0 }, { (uint)Register.RadioStatus1, radioStatus1 }, { (uint)Register.RssiValidStatus, rssiValidStatus }, { (uint)Register.RandomData, randomData }, { (uint)Register.SourceAddressMatchingResult, matchedSourceIndex } }; RegisterGroup(addresses, (uint)Register.InterruptFlag, interruptFlag); RegisterGroup(addresses, (uint)Register.SourceExtendedAdressEnable, sourceExtendedAddressEnable); RegisterGroup(addresses, (uint)Register.SourceShortAddressEnable, sourceShortAddressEnable); RegisterGroup(addresses, (uint)Register.InterruptMask, interruptMask); RegisterGroup(addresses, (uint)Register.SourceAddressMatchingResultMask, srcResMask); RegisterGroup(addresses, (uint)Register.SourceExtendedAddressPendingEnabled, srcExtendedAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.SourceShortAddressPendingEnabled, srcShortAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.ExtendedAddress, extAddress); RegisterGroup(addresses, (uint)Register.PanId, panId); RegisterGroup(addresses, (uint)Register.ShortAddressRegister, shortAddressRegister); registers = new DoubleWordRegisterCollection(this, addresses); Reset(); }
public unsafe override bool RegisterHandler(InterruptHandler handler) { System.Diagnostics.Debugger.Log(0, "x86_64_Interrupt", ShortName + " RegisterHandler"); /* Build a new interrupt handler which does: * * push rax * push rbx * push rcx * push rdx * push rsi * push rdi * push rbp * push r8 * push r9 * push r10 * push r11 * push r12 * push r13 * push r14 * push r15 * push all xmms * * mov rdi, target * call handler * * if returns true send eoi * * restore all xmms * restore all gprs * * iret * */ List <byte> func = new List <byte>(); func.AddRange(new byte[] { 0x9c, 0x50, 0x53, 0x51, 0x52, 0x56, 0x57, 0x55, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x81, 0xec, 0x80, 0x00, 0x00, 0x00, }); func.AddRange(new byte[] { 0x66, 0x0f, 0xd6, 0x04, 0x24, 0x66, 0x0f, 0xd6, 0x4c, 0x24, 0x08, 0x66, 0x0f, 0xd6, 0x54, 0x24, 0x10, 0x66, 0x0f, 0xd6, 0x5c, 0x24, 0x18, 0x66, 0x0f, 0xd6, 0x64, 0x24, 0x20, 0x66, 0x0f, 0xd6, 0x6c, 0x24, 0x28, 0x66, 0x0f, 0xd6, 0x74, 0x24, 0x30, 0x66, 0x0f, 0xd6, 0x7c, 0x24, 0x38, 0x66, 0x44, 0x0f, 0xd6, 0x44, 0x24, 0x40, 0x66, 0x44, 0x0f, 0xd6, 0x4c, 0x24, 0x48, 0x66, 0x44, 0x0f, 0xd6, 0x54, 0x24, 0x50, 0x66, 0x44, 0x0f, 0xd6, 0x5c, 0x24, 0x58, 0x66, 0x44, 0x0f, 0xd6, 0x64, 0x24, 0x60, 0x66, 0x44, 0x0f, 0xd6, 0x6c, 0x24, 0x68, 0x66, 0x44, 0x0f, 0xd6, 0x74, 0x24, 0x70, 0x66, 0x44, 0x0f, 0xd6, 0x7c, 0x24, 0x78, 0x48, 0xbf }); ulong target = libsupcs.CastOperations.ReinterpretAsUlong(handler.Target); func.AddRange(BitConverter.GetBytes(target)); func.AddRange(new byte[] { 0x48, 0xb8 }); ulong meth = (ulong)System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(handler); func.AddRange(BitConverter.GetBytes(meth)); func.AddRange(new byte[] { 0xff, 0xd0, 0x48, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x74, 0x16, 0x48, 0xbf }); ulong cpu_ptr = libsupcs.CastOperations.ReinterpretAsUlong(cpu); func.AddRange(BitConverter.GetBytes(cpu_ptr)); func.AddRange(new byte[] { 0x48, 0xb8 }); ulong send_lapic = (ulong)System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(new SendLapicEOIDelegate(SendLapicEOI)); func.AddRange(BitConverter.GetBytes(send_lapic)); func.AddRange(new byte[] { 0xff, 0xd0 }); func.AddRange(new byte[] { 0xf3, 0x0f, 0x7e, 0x04, 0x24, 0xf3, 0x0f, 0x7e, 0x4c, 0x24, 0x08, 0xf3, 0x0f, 0x7e, 0x54, 0x24, 0x10, 0xf3, 0x0f, 0x7e, 0x5c, 0x24, 0x18, 0xf3, 0x0f, 0x7e, 0x64, 0x24, 0x20, 0xf3, 0x0f, 0x7e, 0x6c, 0x24, 0x28, 0xf3, 0x0f, 0x7e, 0x74, 0x24, 0x30, 0xf3, 0x0f, 0x7e, 0x7c, 0x24, 0x38, 0xf3, 0x44, 0x0f, 0x7e, 0x44, 0x24, 0x40, 0xf3, 0x44, 0x0f, 0x7e, 0x4c, 0x24, 0x48, 0xf3, 0x44, 0x0f, 0x7e, 0x54, 0x24, 0x50, 0xf3, 0x44, 0x0f, 0x7e, 0x5c, 0x24, 0x58, 0xf3, 0x44, 0x0f, 0x7e, 0x64, 0x24, 0x60, 0xf3, 0x44, 0x0f, 0x7e, 0x6c, 0x24, 0x68, 0xf3, 0x44, 0x0f, 0x7e, 0x74, 0x24, 0x70, 0xf3, 0x44, 0x0f, 0x7e, 0x7c, 0x24, 0x78, 0x48, 0x81, 0xc4, 0x80, 0x00, 0x00, 0x00, 0x41, 0x5f, 0x41, 0x5e, 0x41, 0x5d, 0x41, 0x5c, 0x41, 0x5b, 0x41, 0x5a, 0x41, 0x59, 0x41, 0x58, 0x5d, 0x5f, 0x5e, 0x5a, 0x59, 0x5b, 0x58, 0x9d, 0x48, 0xcf }); byte[] arr_func = func.ToArray(); func_ptr = (ulong)libsupcs.MemoryOperations.GetInternalArray(arr_func); System.Diagnostics.Debugger.Log(0, null, "CPU Interrupt Handler @ " + func_ptr.ToString("X16")); System.Diagnostics.Debugger.Log(0, null, "First bytes: " + func[0].ToString("X2") + " " + func[1].ToString("X2") + " " + func[2].ToString("X2") + " " + func[3].ToString("X2")); // TODO make Interrupts cpu-specific Program.arch.Interrupts.InstallHandler(cpu_int_no, func_ptr); // Store the handler so it is not garbage collected handler_func = arr_func; return(true); }
protected override void DisposeManagedResources() { _interrupt.Dispose(); _onInterrupt = null; }
public static void SetInterruptHandler(InterruptHandler interruptHandler) { IDT.interruptHandler = interruptHandler; }
internal static void RegisterInterrupt(InterruptHandler xHandler, uint Interrupt) { xINT[Interrupt] = xHandler; Debug.Write("Interrupt Handler Registered: %d\n", Interrupt); }
public static void SetInterruptHandler(InterruptHandler interruptHandler) { Interrupt = interruptHandler; }
public CC2538RF(Machine machine) { this.machine = machine; rxLock = new object(); rxQueue = new Queue <Frame>(); txQueue = new Queue <byte>(); shortAddress = new Address(AddressingMode.ShortAddress); extendedAddress = new Address(AddressingMode.ExtendedAddress); random = EmulationManager.Instance.CurrentEmulation.RandomGenerator; IRQ = new GPIO(); AlternativeIRQ = new GPIO(); irqMultiplexer = new GPIOMultiplexer(IRQ, AlternativeIRQ); srcShortEnabled = new bool[24]; srcExtendedEnabled = new bool[12]; matchedSourceAddresses = new bool[24]; srcShortPendEnabled = new bool[24]; srcExtendedPendEnabled = new bool[12]; ffsmMemory = new uint[96]; irqHandler = new InterruptHandler <InterruptRegister, InterruptSource>(irqMultiplexer); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.StartOfFrameDelimiter, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FifoP, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchDone, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchFound, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FrameAccepted, 5); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxPktDone, 6); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxMaskZero, 7); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxAckDone, 0); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxDone, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.RfIdle, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorManualInterrupt, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorStop, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorWait, 5); var matchedSourceIndex = new DoubleWordRegister(this); matchedSourceIndexField = matchedSourceIndex.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write); var srcResMask = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcResMaskRegister, writeCallback: WriteSrcResMaskRegister); var srcExtendedAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcExtendedAddressPendingEnabledRegister, writeCallback: WriteSrcExtendedAddressPendingEnabledRegister); var srcShortAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, name: "SrcShortAddressPendingEnabled", valueProviderCallback: ReadSrcShortAddressPendingEnabledRegister, writeCallback: WriteSrcShortAddressPendingEnabledRegister); var extAddress = CreateRegistersGroup(8, this, 0, 8, valueProviderCallback: i => extendedAddress.Bytes[i], writeCallback: (i, @new) => extendedAddress.SetByte((byte)@new, i)); panId = CreateRegistersGroup(2, this, 0, 8); var shortAddressRegister = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => shortAddress.Bytes[i], writeCallback: (i, @new) => shortAddress.SetByte((byte)@new, i)); var sourceExtendedAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceExtendedAddressEnableRegister, writeCallback: WriteSourceExtendedAddressEnableRegister); var sourceShortAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceShortAddressEnableRegister, writeCallback: WriteSourceShortAddressEnableRegister); var frameHandling0 = new DoubleWordRegister(this, 0x40); autoAck = frameHandling0.DefineFlagField(5); autoCrc = frameHandling0.DefineFlagField(6); appendDataMode = frameHandling0.DefineFlagField(7); var frameHandling1 = new DoubleWordRegister(this, 0x1); pendingOr = frameHandling1.DefineFlagField(2); var sourceAddressMatching = new DoubleWordRegister(this, 0x7); sourceAddressMatchingEnabled = sourceAddressMatching.DefineFlagField(0); autoPendEnabled = sourceAddressMatching.DefineFlagField(1); pendDataRequestOnly = sourceAddressMatching.DefineFlagField(2); var radioStatus0 = new DoubleWordRegister(this, 0).WithValueField(0, 6, FieldMode.Read, valueProviderCallback: _ => (uint)fsmState) .WithFlag(7, FieldMode.Read, valueProviderCallback: _ => true); var radioStatus1 = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: ReadRadioStatus1Register); var rssiValidStatus = new DoubleWordRegister(this, 0x1).WithFlag(0, FieldMode.Read); var interruptMask = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i), @new); }); var randomData = new DoubleWordRegister(this, 0).WithValueField(0, 2, FieldMode.Read, valueProviderCallback: _ => (uint)(random.Next() & 3)); var frameFiltering0 = new DoubleWordRegister(this, 0xD); frameFilterEnabled = frameFiltering0.DefineFlagField(0); isPanCoordinator = frameFiltering0.DefineFlagField(1); maxFrameVersion = frameFiltering0.DefineValueField(2, 2); var frameFiltering1 = new DoubleWordRegister(this, 0x78); acceptBeaconFrames = frameFiltering1.DefineFlagField(3); acceptDataFrames = frameFiltering1.DefineFlagField(4); acceptAckFrames = frameFiltering1.DefineFlagField(5); acceptMacCmdFrames = frameFiltering1.DefineFlagField(6); //Reset value set according to the documentation, but register value is caluculated from Channel value. var frequencyControl = new DoubleWordRegister(this, 0xB).WithValueField(0, 7, changeCallback: (_, value) => Channel = (int)(((value > 113 ? 113 : value) - 11) / 5 + 11), //FREQ = 11 + 5(channel - 11), maximum value is 113. valueProviderCallback: (value) => 11 + 5 * ((uint)Channel - 11)); var rfData = new DoubleWordRegister(this, 0).WithValueField(0, 8, valueProviderCallback: _ => DequeueData(), writeCallback: (_, @new) => { EnqueueData((byte)@new); }); var interruptFlag = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterValue(InterruptRegisterHelper.GetValueRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterValue(InterruptRegisterHelper.GetValueRegister(i), @new); }); var commandStrobeProcessor = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Write, writeCallback: (_, @new) => { HandleSFRInstruction(@new); }); var rxFifoBytesCount = new DoubleWordRegister(this).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: (_) => GetRxFifoBytesCount()); var addresses = new Dictionary <long, DoubleWordRegister> { { (uint)Register.RfData, rfData }, { (uint)Register.CommandStrobeProcessor, commandStrobeProcessor }, { (uint)Register.FrameFiltering0, frameFiltering0 }, { (uint)Register.FrameFiltering1, frameFiltering1 }, { (uint)Register.SourceAddressMatching, sourceAddressMatching }, { (uint)Register.FrameHandling0, frameHandling0 }, { (uint)Register.FrameHandling1, frameHandling1 }, { (uint)Register.RadioStatus0, radioStatus0 }, { (uint)Register.RadioStatus1, radioStatus1 }, { (uint)Register.RssiValidStatus, rssiValidStatus }, { (uint)Register.RandomData, randomData }, { (uint)Register.SourceAddressMatchingResult, matchedSourceIndex }, { (uint)Register.FrequencyControl, frequencyControl }, { (uint)Register.RxFifoBytesCount, rxFifoBytesCount } }; RegisterGroup(addresses, (uint)Register.InterruptFlag, interruptFlag); RegisterGroup(addresses, (uint)Register.SourceExtendedAdressEnable, sourceExtendedAddressEnable); RegisterGroup(addresses, (uint)Register.SourceShortAddressEnable, sourceShortAddressEnable); RegisterGroup(addresses, (uint)Register.InterruptMask, interruptMask); RegisterGroup(addresses, (uint)Register.SourceAddressMatchingResultMask, srcResMask); RegisterGroup(addresses, (uint)Register.SourceExtendedAddressPendingEnabled, srcExtendedAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.SourceShortAddressPendingEnabled, srcShortAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.ExtendedAddress, extAddress); RegisterGroup(addresses, (uint)Register.PanId, panId); RegisterGroup(addresses, (uint)Register.ShortAddressRegister, shortAddressRegister); registers = new DoubleWordRegisterCollection(this, addresses); Reset(); }
public CC2538RF() { rxLock = new object(); rxQueue = new Queue <Frame>(); txQueue = new Queue <byte>(); shortAddress = new Address(AddressingMode.ShortAddress); extendedAddress = new Address(AddressingMode.ExtendedAddress); random = new Random(); IRQ = new GPIO(); srcShortEnabled = new bool[24]; srcExtendedEnabled = new bool[12]; matchedSourceAddresses = new bool[24]; srcShortPendEnabled = new bool[24]; srcExtendedPendEnabled = new bool[12]; ffsmMemory = new uint[96]; irqHandler = new InterruptHandler <InterruptRegister, InterruptSource>(IRQ); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.StartOfFrameDelimiter, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FifoP, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchDone, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchFound, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FrameAccepted, 5); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxPktDone, 6); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxMaskZero, 7); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxAckDone, 0); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxDone, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.RfIdle, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorManualInterrupt, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorStop, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorWait, 5); var matchedSourceIndex = new DoubleWordRegister(this); matchedSourceIndexField = matchedSourceIndex.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write); var srcResMask = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcResMaskRegister, writeCallback: WriteSrcResMaskRegister); var srcExtendedAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcExtendedAddressPendingEnabledRegister, writeCallback: WriteSrcExtendedAddressPendingEnabledRegister); var srcShortAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, name: "SrcShortAddressPendingEnabled", valueProviderCallback: ReadSrcShortAddressPendingEnabledRegister, writeCallback: WriteSrcShortAddressPendingEnabledRegister); var extAddress = CreateRegistersGroup(8, this, 0, 8, valueProviderCallback: i => extendedAddress.Bytes[i], writeCallback: (i, @new) => extendedAddress.SetByte((byte)@new, i)); panId = CreateRegistersGroup(2, this, 0, 8); var shortAddressRegister = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => shortAddress.Bytes[i], writeCallback: (i, @new) => shortAddress.SetByte((byte)@new, i)); var sourceExtendedAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceExtendedAddressEnableRegister, writeCallback: WriteSourceExtendedAddressEnableRegister); var sourceShortAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceShortAddressEnableRegister, writeCallback: WriteSourceShortAddressEnableRegister); var frameHandling0 = new DoubleWordRegister(this, 0x40); autoAck = frameHandling0.DefineFlagField(5); autoCrc = frameHandling0.DefineFlagField(6); appendDataMode = frameHandling0.DefineFlagField(7); var frameHandling1 = new DoubleWordRegister(this, 0x1); pendingOr = frameHandling1.DefineFlagField(2); var sourceAddressMatching = new DoubleWordRegister(this, 0x7); sourceAddressMatchingEnabled = sourceAddressMatching.DefineFlagField(0); autoPendEnabled = sourceAddressMatching.DefineFlagField(1); pendDataRequestOnly = sourceAddressMatching.DefineFlagField(2); var radioStatus0 = new DoubleWordRegister(this, 0x81).WithValueField(0, 8, FieldMode.Read); var radioStatus1 = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: ReadRadioStatus1Register); var rssiValidStatus = new DoubleWordRegister(this, 0x1).WithFlag(0, FieldMode.Read); var interruptMask = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i), @new); }); var randomData = new DoubleWordRegister(this, 0).WithValueField(0, 2, FieldMode.Read, valueProviderCallback: _ => (uint)(random.Next() & 3)); var frameFiltering0 = new DoubleWordRegister(this, 0xD); frameFilterEnabled = frameFiltering0.DefineFlagField(0); isPanCoordinator = frameFiltering0.DefineFlagField(1); maxFrameVersion = frameFiltering0.DefineValueField(2, 2); var frameFiltering1 = new DoubleWordRegister(this, 0x78); acceptBeaconFrames = frameFiltering1.DefineFlagField(3); acceptDataFrames = frameFiltering1.DefineFlagField(4); acceptAckFrames = frameFiltering1.DefineFlagField(5); acceptMacCmdFrames = frameFiltering1.DefineFlagField(6); var rfData = new DoubleWordRegister(this, 0).WithValueField(0, 8, valueProviderCallback: _ => DequeueData(), writeCallback: (_, @new) => { EnqueueData((byte)@new); }); var interruptFlag = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterValue(InterruptRegisterHelper.GetValueRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterValue(InterruptRegisterHelper.GetValueRegister(i), @new); }); var commandStrobeProcessor = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Write, writeCallback: (_, @new) => { HandleSFRInstruction(@new); }); var addresses = new Dictionary <long, DoubleWordRegister> { { (uint)Register.RfData, rfData }, { (uint)Register.CommandStrobeProcessor, commandStrobeProcessor }, { (uint)Register.FrameFiltering0, frameFiltering0 }, { (uint)Register.FrameFiltering1, frameFiltering1 }, { (uint)Register.SourceAddressMatching, sourceAddressMatching }, { (uint)Register.FrameHandling0, frameHandling0 }, { (uint)Register.FrameHandling1, frameHandling1 }, { (uint)Register.RadioStatus0, radioStatus0 }, { (uint)Register.RadioStatus1, radioStatus1 }, { (uint)Register.RssiValidStatus, rssiValidStatus }, { (uint)Register.RandomData, randomData }, { (uint)Register.SourceAddressMatchingResult, matchedSourceIndex } }; RegisterGroup(addresses, (uint)Register.InterruptFlag, interruptFlag); RegisterGroup(addresses, (uint)Register.SourceExtendedAdressEnable, sourceExtendedAddressEnable); RegisterGroup(addresses, (uint)Register.SourceShortAddressEnable, sourceShortAddressEnable); RegisterGroup(addresses, (uint)Register.InterruptMask, interruptMask); RegisterGroup(addresses, (uint)Register.SourceAddressMatchingResultMask, srcResMask); RegisterGroup(addresses, (uint)Register.SourceExtendedAddressPendingEnabled, srcExtendedAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.SourceShortAddressPendingEnabled, srcShortAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.ExtendedAddress, extAddress); RegisterGroup(addresses, (uint)Register.PanId, panId); RegisterGroup(addresses, (uint)Register.ShortAddressRegister, shortAddressRegister); registers = new DoubleWordRegisterCollection(this, addresses); Reset(); }
public void Tick() { if (Mode != RunMode.Module) { if (mInterruptQueue.Count > 0 && mCurrentInstructionTicksLeft == 0 && Mode != RunMode.Control && (Status == RunStatus.Running || Status == RunStatus.Stepping || Status == RunStatus.Idle)) { if (mInterruptExecuted) { mInterruptExecuted = false; } else { InterruptHandler.HandleInterrupt(this, mInterruptQueue.Dequeue()); } } IncreaseTickCounter(); if (Status == RunStatus.Halted) { if (!mDevices.IsAnyBusy) { Status = RunStatus.Idle; } return; } } IMemoryFullWord instructionWord = Memory[ProgramCounter]; var instruction = InstructionSet.Instance.GetInstruction(instructionWord[MixInstruction.OpcodeByte], new FieldSpec(instructionWord[MixInstruction.FieldSpecByte])); if (instruction == null) { ReportInvalidInstruction("Opcode (and field) do not encode an instruction"); if (Mode == RunMode.Module) { ResetMode(); } return; } var instance = instruction.CreateInstance(instructionWord); var errors = instance.Validate(); if (errors != null) { ReportInvalidInstruction(errors); if (Mode == RunMode.Module) { ResetMode(); } return; } if (mCurrentInstructionAddress != ProgramCounter || mCurrentInstructionMnemonic != instruction.Mnemonic || (mCurrentInstructionTicksLeft <= 0 && Mode != RunMode.Module)) { mCurrentInstructionAddress = ProgramCounter; mCurrentInstructionTicksLeft = instruction.TickCount; mCurrentInstructionMnemonic = instruction.Mnemonic; if (Mode == RunMode.Module) { ResetMode(); } } if (Mode != RunMode.Module && mCurrentInstructionTicksLeft > 0) { mCurrentInstructionTicksLeft--; if (ExecutionSettings.ProfilingEnabled) { instructionWord.IncreaseProfilingTickCount(1); } } int programCounter; if (Mode == RunMode.Module || mCurrentInstructionTicksLeft == 0) { var increasePC = instance.Execute(this); programCounter = ProgramCounter; if (increasePC) { programCounter++; } if (ExecutionSettings.ProfilingEnabled && (Mode != RunMode.Module || increasePC)) { instructionWord.IncreaseProfilingExecutionCount(); } } else { programCounter = ProgramCounter; } if (programCounter > mMemory.MaxWordIndex) { ProgramCounter = mMemory.MaxWordIndex; ReportRuntimeError("Program counter overflow"); } else { ProgramCounter = programCounter; if (Status == RunStatus.Running && IsBreakpointSet(programCounter)) { ReportBreakpointReached(); } } }