Example #1
0
 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);
        }
        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);
        }
Example #4
0
 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;
 }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
            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);
            }
Example #8
0
        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);
        }
Example #9
0
        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);
        }
Example #10
0
            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);
            }
Example #11
0
 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);
 }
Example #12
0
        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);
            }
        }
Example #13
0
        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);
        }
Example #14
0
        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
        }
Example #15
0
 public ConsoleDevice(IMemoryBus memoryBus, InterruptHandler interruptHandler, int memoryRangeStart, int memoryRangeLength)
     : base(memoryBus, interruptHandler, "Console refresh trigger", memoryRangeStart, memoryRangeLength)
 {
 }
Example #16
0
 private void OnInterruptOccurred(TrackingSensorStatus status)
 {
     InterruptHandler?.Invoke(this, new TrackingSensorEventArgs(status));
 }
Example #17
0
 public ConsoleDevice(IMemoryBus memoryBus, InterruptHandler interruptHandler, int memoryRangeStart, int memoryRangeLength)
     : base(memoryBus, interruptHandler, "Console refresh trigger", memoryRangeStart, memoryRangeLength)
 {
 }
Example #18
0
 internal static void SetInterruptHandler(KnownInterrupt interrupt, InterruptHandler interruptHandler)
 {
     SetInterruptHandler((uint)interrupt, interruptHandler);
 }
Example #19
0
 internal static void SetInterruptPreHandler(uint interrupt, InterruptHandler interruptHandler)
 {
     Handlers[interrupt].PreHandler = interruptHandler;
 }
Example #20
0
 public abstract bool RegisterHandler(InterruptHandler handler);
Example #21
0
 public void StartChurn(InterruptHandler handler)
 {
     if (_churnInt == null || _churnInt.Active)
         return;
     _churnInt.AddInterruption (handler);
     _churnInt.Start ();
 }
Example #22
0
        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();
        }
Example #23
0
        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);
        }
Example #24
0
 protected override void DisposeManagedResources()
 {
     _interrupt.Dispose();
     _onInterrupt = null;
 }
Example #25
0
 public static void SetInterruptHandler(InterruptHandler interruptHandler)
 {
     IDT.interruptHandler = interruptHandler;
 }
Example #26
0
 internal static void RegisterInterrupt(InterruptHandler xHandler, uint Interrupt)
 {
     xINT[Interrupt] = xHandler;
     Debug.Write("Interrupt Handler Registered: %d\n", Interrupt);
 }
Example #27
0
 public static void SetInterruptHandler(InterruptHandler interruptHandler)
 {
     Interrupt = interruptHandler;
 }
Example #28
0
        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();
        }
Example #29
0
        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();
        }
Example #30
0
File: Mix.cs Project: arlm/MixEmul
        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();
                }
            }
        }