示例#1
0
        private void SetupRegisters()
        {
            autoReload = DoubleWordRegister.CreateRWRegister(0xFFFF, "TIMx_ARR");
            var interruptEnableRegister = new DoubleWordRegister(this);

            updateInterruptEnable = interruptEnableRegister.DefineFlagField(0, name: "UIE");
            var prescalerRegister = new DoubleWordRegister(this);

            prescaler = prescalerRegister.DefineValueField(0, 15);

            var controlRegister = new DoubleWordRegister(this)
                                  .WithEnumField <DoubleWordRegister, Direction>(4, 1, valueProviderCallback: _ => Direction, changeCallback: (_, value) => Direction = value, name: "DIR")
                                  .WithFlag(0, changeCallback: (_, value) => Enabled = value, valueProviderCallback: _ => Enabled, name: "CEN");

            updateRequestSource = controlRegister.DefineFlagField(2, name: "URS");
            updateDisable       = controlRegister.DefineFlagField(1, name: "UDIS");
            registers           = new DoubleWordRegisterCollection(this, new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.Control1, controlRegister },
                { (long)Registers.DmaInterruptEnable, interruptEnableRegister },
                { (long)Registers.Status, new DoubleWordRegister(this)
                  // This write callback is here only to prevent from very frequent logging.
                  .WithValueField(1, 31, FieldMode.WriteZeroToClear, writeCallback: (_, __) => {})
                  .WithFlag(0, FieldMode.ReadToClear | FieldMode.WriteZeroToClear, changeCallback: (_, __) => IRQ.Unset(), valueProviderCallback: _ => IRQ.IsSet) },
                { (long)Registers.EventGeneration, new DoubleWordRegister(this).WithFlag(0, FieldMode.Write, writeCallback: UpdateGeneration) },
                { (long)Registers.Prescaler, prescalerRegister },
                { (long)Registers.AutoReload, autoReload },
                { (long)Registers.Counter, new DoubleWordRegister(this).WithValueField(0, 16, name: "Counter", valueProviderCallback: _ => (uint)Value, writeCallback: (_, value) => { Value = value; }) }
            });
        }
示例#2
0
        public void ShouldNotAcceptNegativeFields()
        {
            var foundException = false;
            var localRegister  = new DoubleWordRegister(null);

            try
            {
                localRegister.DefineEnumField <TwoBitEnum>(0, -1);
            }
            catch (ArgumentException)
            {
                foundException = true;
            }
            finally
            {
                Assert.IsTrue(foundException);
            }

            foundException = false;
            try
            {
                localRegister.DefineValueField(0, -1);
            }
            catch (ArgumentException)
            {
                foundException = true;
            }
            finally
            {
                Assert.IsTrue(foundException);
            }
        }
示例#3
0
        public SunxiHighSpeedTimer(Machine machine, long frequency)
        {
            irqEnableRegister = new DoubleWordRegister(this);
            irqStatusRegister = new DoubleWordRegister(this);
            
            timers = new SunxiHighSpeedTimerUnit[4];
            interruptFlags = new IFlagRegisterField[4];
            enableFlags = new IFlagRegisterField[4];

            for(var i = 0; i < 4; ++i)
            {
                var j = i;
                timers[i] = new SunxiHighSpeedTimerUnit(machine, frequency);
                timers[i].LimitReached += () => OnTimerLimitReached(j);
                interruptFlags[i] = irqStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear, name: "Tx_IRQ_PEND");
                enableFlags[i] = irqEnableRegister.DefineFlagField(i, name: "Tx_INT_EN");
            }

            var innerConnections = new Dictionary<int, IGPIO>();
            for(var i = 0; i < 4; ++i)
            {
                innerConnections[i] = new GPIO();
            }
            Connections = new ReadOnlyDictionary<int, IGPIO>(innerConnections);
        }
示例#4
0
        public void ShouldNotAllowIntersectingFields()
        {
            var localRegister = new DoubleWordRegister(null);

            localRegister.DefineValueField(1, 5);
            Assert.Catch <ArgumentException>(() => localRegister.DefineValueField(0, 2));
        }
示例#5
0
文件: STM32LTDC.cs 项目: rte-se/emul8
        public STM32LTDC(Machine machine) : base(machine)
        {
            Reconfigure(format: PixelFormat.RGBX8888);

            IRQ = new GPIO();

            this.machine = machine;
            internalLock = new object();

            var activeWidthConfigurationRegister = new DoubleWordRegister(this);
            accumulatedActiveHeightField = activeWidthConfigurationRegister.DefineValueField(0, 11, FieldMode.Read | FieldMode.Write, name: "AAH");
            accumulatedActiveWidthField = activeWidthConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "AAW", writeCallback: (_, __) => HandleActiveDisplayChange());

            var backPorchConfigurationRegister = new DoubleWordRegister(this);
            accumulatedVerticalBackPorchField = backPorchConfigurationRegister.DefineValueField(0, 11, FieldMode.Read | FieldMode.Write, name: "AVBP");
            accumulatedHorizontalBackPorchField = backPorchConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "AHBP", writeCallback: (_, __) => HandleActiveDisplayChange());

            var backgroundColorConfigurationRegister = new DoubleWordRegister(this);
            backgroundColorBlueChannelField = backgroundColorConfigurationRegister.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write, name: "BCBLUE");
            backgroundColorGreenChannelField = backgroundColorConfigurationRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "BCGREEN");
            backgroundColorRedChannelField = backgroundColorConfigurationRegister.DefineValueField(16, 8, FieldMode.Read | FieldMode.Write, name: "BCRED", writeCallback: (_, __) => HandleBackgroundColorChange());

            var interruptEnableRegister = new DoubleWordRegister(this);
            lineInterruptEnableFlag = interruptEnableRegister.DefineFlagField(0, FieldMode.Read | FieldMode.Write, name: "LIE");

            var interruptClearRegister = new DoubleWordRegister(this);
            interruptClearRegister.DefineFlagField(0, FieldMode.Write, name: "CLIF", writeCallback: (old, @new) => { if(@new) IRQ.Unset(); });
            interruptClearRegister.DefineFlagField(3, FieldMode.Write, name: "CRRIF", writeCallback: (old, @new) => { if(@new) IRQ.Unset(); });

            lineInterruptPositionConfigurationRegister = new DoubleWordRegister(this).WithValueField(0, 11, FieldMode.Read | FieldMode.Write, name: "LIPOS");

            var registerMappings = new Dictionary<long, DoubleWordRegister>
            {
                { (long)Register.BackPorchConfigurationRegister, backPorchConfigurationRegister },
                { (long)Register.ActiveWidthConfigurationRegister, activeWidthConfigurationRegister },
                { (long)Register.BackgroundColorConfigurationRegister, backgroundColorConfigurationRegister },
                { (long)Register.InterruptEnableRegister, interruptEnableRegister },
                { (long)Register.InterruptClearRegister, interruptClearRegister },
                { (long)Register.LineInterruptPositionConfigurationRegister, lineInterruptPositionConfigurationRegister }
            };

            localLayerBuffer = new byte[2][];
            layer = new Layer[2];
            for(var i = 0; i < layer.Length; i++)
            {
                layer[i] = new Layer(this, i);

                var offset = 0x80 * i;
                registerMappings.Add(0x84 + offset, layer[i].ControlRegister);
                registerMappings.Add(0x88 + offset, layer[i].WindowHorizontalPositionConfigurationRegister);
                registerMappings.Add(0x8C + offset, layer[i].WindowVerticalPositionConfigurationRegister);
                registerMappings.Add(0x94 + offset, layer[i].PixelFormatConfigurationRegister);
                registerMappings.Add(0x98 + offset, layer[i].ConstantAlphaConfigurationRegister);
                registerMappings.Add(0xAC + offset, layer[i].ColorFrameBufferAddressRegister);
            }

            registers = new DoubleWordRegisterCollection(this, registerMappings);
            registers.Reset();
            HandlePixelFormatChange();
        }
示例#6
0
        public void ShouldNotAcceptNegativeFields()
        {
            var localRegister = new DoubleWordRegister(null);

            Assert.Catch <ArgumentException>(() => localRegister.DefineEnumField <TwoBitEnum>(0, -1));
            Assert.Catch <ArgumentException>(() => localRegister.DefineValueField(0, -1));
        }
示例#7
0
        public SunxiHighSpeedTimer(Machine machine, long frequency)
        {
            irqEnableRegister = new DoubleWordRegister(this);
            irqStatusRegister = new DoubleWordRegister(this);

            timers         = new SunxiHighSpeedTimerUnit[4];
            interruptFlags = new IFlagRegisterField[4];
            enableFlags    = new IFlagRegisterField[4];

            for (var i = 0; i < 4; ++i)
            {
                var j = i;
                timers[i] = new SunxiHighSpeedTimerUnit(machine, frequency);
                timers[i].LimitReached += () => OnTimerLimitReached(j);
                interruptFlags[i]       = irqStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear, name: "Tx_IRQ_PEND");
                enableFlags[i]          = irqEnableRegister.DefineFlagField(i, name: "Tx_INT_EN");
            }

            var innerConnections = new Dictionary <int, IGPIO>();

            for (var i = 0; i < 4; ++i)
            {
                innerConnections[i] = new GPIO();
            }
            Connections = new ReadOnlyDictionary <int, IGPIO>(innerConnections);
        }
            public Layer(STM32LTDC video, int layerId)
            {
                ControlRegister = new DoubleWordRegister(video);
                LayerEnableFlag = ControlRegister.DefineFlagField(0, FieldMode.Read | FieldMode.Write, name: "LEN", writeCallback: (_, __) => WarnAboutWrongBufferConfiguration());

                WindowHorizontalPositionConfigurationRegister = new DoubleWordRegister(video);
                WindowHorizontalStartPositionField            = WindowHorizontalPositionConfigurationRegister.DefineValueField(0, 12, FieldMode.Read | FieldMode.Write, name: "WHSTPOS");
                WindowHorizontalStopPositionField             = WindowHorizontalPositionConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "WHSPPOS", writeCallback: (_, __) => HandleLayerWindowConfigurationChange());

                WindowVerticalPositionConfigurationRegister = new DoubleWordRegister(video);
                WindowVerticalStartPositionField            = WindowVerticalPositionConfigurationRegister.DefineValueField(0, 12, FieldMode.Read | FieldMode.Write, name: "WVSTPOS");
                WindowVerticalStopPositionField             = WindowVerticalPositionConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "WVSPPOS", writeCallback: (_, __) => HandleLayerWindowConfigurationChange());

                PixelFormatConfigurationRegister = new DoubleWordRegister(video);
                PixelFormatField = PixelFormatConfigurationRegister.DefineEnumField <Dma2DColorMode>(0, 3, FieldMode.Read | FieldMode.Write, name: "PF", writeCallback: (_, __) => { RestoreBuffers(); video.HandlePixelFormatChange(); });

                ConstantAlphaConfigurationRegister = new DoubleWordRegister(video, 0xFF).WithValueField(0, 8, FieldMode.Read | FieldMode.Write, name: "CONSTA");

                ColorFrameBufferAddressRegister = new DoubleWordRegister(video).WithValueField(0, 32, FieldMode.Read | FieldMode.Write, name: "CFBADD", writeCallback: (_, __) => WarnAboutWrongBufferConfiguration());

                DefaultColorConfigurationRegister = new DoubleWordRegister(video);
                DefaultColorBlueField             = DefaultColorConfigurationRegister.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write, name: "DCBLUE");
                DefaultColorGreenField            = DefaultColorConfigurationRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "DCGREEN");
                DefaultColorRedField   = DefaultColorConfigurationRegister.DefineValueField(16, 8, FieldMode.Read | FieldMode.Write, name: "DCRED");
                DefaultColorAlphaField = DefaultColorConfigurationRegister.DefineValueField(24, 8, FieldMode.Read | FieldMode.Write, name: "DCALPHA", writeCallback: (_, __) => HandleLayerBackgroundColorChange());

                this.layerId = layerId;
                this.video   = video;
            }
示例#9
0
        public STM32F7_USART()
        {
            sync         = new object();
            IRQ          = new GPIO();
            receiveQueue = new Queue <byte>();

            var controlRegister1 = new DoubleWordRegister(this);

            enabled                            = controlRegister1.DefineFlagField(0, name: "UE");
            receiveEnabled                     = controlRegister1.DefineFlagField(2, name: "RE");
            transmitEnabled                    = controlRegister1.DefineFlagField(3, name: "TE");
            receiveInterruptEnabled            = controlRegister1.DefineFlagField(5, name: "RXNEIE");
            transmitQueueEmptyInterruptEnabled = controlRegister1.DefineFlagField(7, name: "TXEIE", writeCallback: delegate { RefreshInterrupt(); });
            controlRegister1.DefineFlagField(8, name: "PEIE");
            paritySelection      = controlRegister1.DefineFlagField(9, name: "PS");
            parityControlEnabled = controlRegister1.DefineFlagField(10, name: "PCE");

            var controlRegister2 = new DoubleWordRegister(this);

            stopBits = controlRegister2.DefineValueField(12, 2);

            registers = new DoubleWordRegisterCollection(this, new Dictionary <long, DoubleWordRegister> {
                { (long)Register.ControlRegister1, controlRegister1 },
                { (long)Register.ControlRegister2, controlRegister2 },
                { (long)Register.ControlRegister3, new DoubleWordRegister(this).WithFlag(0, name: "EIE") },
                { (long)Register.InterruptAndStatus, new DoubleWordRegister(this, 0x200000C0)
                  .WithFlag(5, FieldMode.Read, name: "RXNE", valueProviderCallback: delegate { return(receiveQueue.Count > 0); })
                  .WithFlag(6, FieldMode.Read, name: "TC").WithFlag(7, FieldMode.Read, name: "TXE")
                  .WithFlag(21, FieldMode.Read, name: "TEACK", valueProviderCallback: delegate { return(transmitEnabled.Value); })
                  .WithFlag(22, FieldMode.Read, name: "REACK", valueProviderCallback: delegate { return(receiveEnabled.Value); })
                  .WithValueField(23, 8, FieldMode.Read, name: "Reserved") }
            });
        }
示例#10
0
        private void SetupRegisters()
        {
            commandRegister    = new DoubleWordRegister(this);
            dmacStatusRegister = new DoubleWordRegister(this);
            startCommandFlag   = commandRegister.DefineFlagField(31, changeCallback: OnStartCommand);
            sendInitSequence   = commandRegister.DefineFlagField(15);
            transferDirection  = commandRegister.DefineFlagField(10);
            dataTransfer       = commandRegister.DefineFlagField(9);
            receiveResponse    = commandRegister.DefineFlagField(6);
            commandIndex       = commandRegister.DefineValueField(0, 6);

            responseRegisters = new uint[4];

            receiveInterrupt  = dmacStatusRegister.DefineFlagField(1, FieldMode.WriteOneToClear | FieldMode.Read);
            transmitInterrupt = dmacStatusRegister.DefineFlagField(0, FieldMode.WriteOneToClear | FieldMode.Read);
            generalRegisters  = new DoubleWordRegisterCollection(this, new Dictionary <long, DoubleWordRegister>()
            {
                { (long)Registers.ControlRegister, new DoubleWordRegister(this).WithFlag(0, changeCallback: (oldValue, newValue) => { if (newValue)
                                                                                                                                      {
                                                                                                                                          Reset();
                                                                                                                                      }
                                                                                         }).WithFlag(2).WithFlag(4).WithFlag(5) },
                { (long)Registers.BlockSizeRegister, new DoubleWordRegister(this, 0x200).WithValueField(0, 16, changeCallback: (oldValue, newValue) => BlockSize = (int)newValue) },
                { (long)Registers.DmacInterruptEnable, DoubleWordRegister.CreateRWRegister() },
            });
        }
示例#11
0
 public void ShouldWriteFieldsWithMaxLength()
 {
     var localRegister = new DoubleWordRegister(null);
     localRegister.DefineValueField(0, 32);
     localRegister.Write(0, uint.MaxValue);
     Assert.AreEqual(uint.MaxValue, localRegister.Read());
 }
示例#12
0
        public STM32F7_USART(Machine machine)
        {
            sync = new object();
            this.machine = machine;
            IRQ = new GPIO();
            receiveQueue = new Queue<byte>();

            var controlRegister1 = new DoubleWordRegister(this);
            enabled = controlRegister1.DefineFlagField(0, name: "UE");
            receiveEnabled = controlRegister1.DefineFlagField(2, name: "RE");
            transmitEnabled = controlRegister1.DefineFlagField(3, name: "TE");
            receiveInterruptEnabled = controlRegister1.DefineFlagField(5, name: "RXNEIE");
            transmitQueueEmptyInterruptEnabled = controlRegister1.DefineFlagField(7, name: "TXEIE", writeCallback: delegate { RefreshInterrupt(); } );
            controlRegister1.DefineFlagField(8, name: "PEIE");
            paritySelection = controlRegister1.DefineFlagField(9, name: "PS");
            parityControlEnabled = controlRegister1.DefineFlagField(10, name: "PCE");

            var controlRegister2 = new DoubleWordRegister(this);
            stopBits = controlRegister2.DefineValueField(12, 2);

            registers = new DoubleWordRegisterCollection(this, new Dictionary<long, DoubleWordRegister> {
                { (long)Register.ControlRegister1, controlRegister1 },
                { (long)Register.ControlRegister2, controlRegister2 },
                { (long)Register.ControlRegister3, new DoubleWordRegister(this).WithFlag(0, name: "EIE") },
                { (long)Register.InterruptAndStatus, new DoubleWordRegister(this, 0x200000C0)
                        .WithFlag(5, FieldMode.Read, name: "RXNE", valueProviderCallback: delegate { return receiveQueue.Count > 0; })
                        .WithFlag(6, FieldMode.Read, name: "TC").WithFlag(7, FieldMode.Read, name: "TXE")
                        .WithFlag(21, FieldMode.Read, name: "TEACK", valueProviderCallback: delegate { return transmitEnabled.Value; })
                        .WithFlag(22, FieldMode.Read, name: "REACK", valueProviderCallback: delegate { return receiveEnabled.Value; })
                        .WithValueField(23, 8, FieldMode.Read, name: "Reserved") }
            });
        }
示例#13
0
        private void SetupRegisters()
        {
            var interruptPriorityRegisters = new Dictionary <long, DoubleWordRegister>();

            priorities = new IValueRegisterField[64];

            for (var i = 0; i < 8; i++)
            {
                var registerKey = (long)Registers.InterruptPriority0 + 4 * i;
                interruptPriorityRegisters.Add(registerKey, new DoubleWordRegister(this, 0x77777777));
                for (var j = 0; j < 8; j++)
                {
                    priorities[i * 8 + j] = interruptPriorityRegisters[registerKey].DefineValueField(4 * j, 3, writeCallback: (oldValue, newValue) => Update());
                }
            }

            interruptPriorityRegisterCollection = new DoubleWordRegisterCollection(this, interruptPriorityRegisters);

            interruptOperationControl = new DoubleWordRegister(this);
            reflectMaskedFiq          = interruptOperationControl.DefineFlagField(0, writeCallback: (oldValue, newValue) => Update());
            reflectMaskedIrq          = interruptOperationControl.DefineFlagField(1, writeCallback: (oldValue, newValue) => Update());
            interruptOperationControl.DefineFlagField(2, changeCallback: (oldValue, newValue) => {
                if (newValue)
                {
                    this.Log(LogLevel.Warning, "Unsupported delayed interrupt enable/disable mode was set.");
                }
            });
        }
示例#14
0
        public void SetUp()
        {
            register     = new DoubleWordRegister(null, 0x3780u);
            enumRWField  = register.DefineEnumField <TwoBitEnum>(0, 2);
            flagRWField  = register.DefineFlagField(2);
            valueRWField = register.DefineValueField(3, 4);
            register.DefineEnumField <TwoBitEnum>(7, 2, readCallback: EnumCallback, writeCallback: EnumCallback, changeCallback: EnumCallback);
            register.DefineFlagField(9, readCallback: BoolCallback, writeCallback: BoolCallback, changeCallback: BoolCallback);
            register.DefineValueField(10, 4, readCallback: NumberCallback, writeCallback: NumberCallback, changeCallback: NumberCallback);
            flagTRField   = register.DefineFlagField(15, FieldMode.Read | FieldMode.Toggle);
            flagSRField   = register.DefineFlagField(16, FieldMode.Read | FieldMode.Set);
            flagW1CField  = register.DefineFlagField(17, FieldMode.Read | FieldMode.WriteOneToClear);
            flagW0CField  = register.DefineFlagField(18, FieldMode.Read | FieldMode.WriteZeroToClear);
            flagWRTCField = register.DefineFlagField(19, FieldMode.ReadToClear | FieldMode.Write);
            flagWField    = register.DefineFlagField(20, FieldMode.Write);
            flagRField    = register.DefineFlagField(21, FieldMode.Read);
            register.DefineValueField(22, 3, valueProviderCallback: ModifyingValueCallback);
            register.DefineFlagField(25, valueProviderCallback: ModifyingFlagCallback);
            register.DefineEnumField <TwoBitEnum>(26, 2, valueProviderCallback: ModifyingEnumCallback);

            enableValueProviders = false;

            enumCallbacks   = 0;
            boolCallbacks   = 0;
            numberCallbacks = 0;
            oldBoolValue    = false;
            newBoolValue    = false;
            oldEnumValue    = TwoBitEnum.A;
            newEnumValue    = TwoBitEnum.A;
            oldUintValue    = 0;
            newUintValue    = 0;
        }
示例#15
0
        private void SetupRegisters()
        {
            var control2 = new DoubleWordRegister(this);

            txBufferEmptyInterruptEnable    = control2.DefineFlagField(7);
            rxBufferNotEmptyInterruptEnable = control2.DefineFlagField(6);
            txDmaEnable = control2.DefineFlagField(1);
            rxDmaEnable = control2.DefineFlagField(0, writeCallback: (_, __) => Update());

            var registerDictionary = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.Control1, new DoubleWordRegister(this).WithValueField(3, 3, name: "Baud").WithFlag(2, name: "Master")
                  .WithFlag(8, name: "SSI").WithFlag(9, name: "SSM").WithFlag(6, changeCallback: (oldValue, newValue) => {
                        if (!newValue)
                        {
                            IRQ.Unset();
                        }
                    }, name: "SpiEnable") },
                { (long)Registers.Status, new DoubleWordRegister(this, 2).WithFlag(1, FieldMode.Read, name: "TXE").WithFlag(0, FieldMode.Read, valueProviderCallback: _ => receiveBuffer.Count != 0, name: "RXNE") },
                { (long)Registers.CRCPolynomial, new DoubleWordRegister(this, 7).WithValueField(0, 16, name: "CRCPoly") },
                { (long)Registers.I2SConfiguration, new DoubleWordRegister(this, 0).WithFlag(10, FieldMode.Read | FieldMode.WriteOneToClear, writeCallback: (oldValue, newValue) => {
                        // write one to clear to keep this bit 0
                        if (newValue)
                        {
                            this.Log(LogLevel.Warning, "Trying to enable not supported I2S mode.");
                        }
                    }, name: "I2SE") },
                { (long)Registers.Control2, control2 }
            };

            registers = new DoubleWordRegisterCollection(this, registerDictionary);
        }
示例#16
0
        public void ShouldNotAcceptNegativeFields()
        {
            var foundException = false;
            var localRegister = new DoubleWordRegister(null);
            try
            {
                localRegister.DefineEnumField<TwoBitEnum>(0, -1); 
            }
            catch(ArgumentException)
            {
                foundException = true;
            }
            finally
            {
                Assert.IsTrue(foundException);
            }

            foundException = false;
            try
            {
                localRegister.DefineValueField(0, -1); 
            }
            catch(ArgumentException)
            {
                foundException = true;
            }
            finally
            {
                Assert.IsTrue(foundException);
            }
        }
示例#17
0
        public void ShouldWriteFieldsWithMaxLength()
        {
            var localRegister = new DoubleWordRegister(null);

            localRegister.DefineValueField(0, 32);
            localRegister.Write(0, uint.MaxValue);
            Assert.AreEqual(uint.MaxValue, localRegister.Read());
        }
示例#18
0
 public SunxiHighSpeedTimerUnit(Machine machine, long frequency) : base(machine.ClockSource, frequency, direction: Direction.Descending, enabled: false)
 {
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(7, changeCallback: OnModeChange, name: "MODE");
     controlRegister.DefineValueField(4, 3, writeCallback: OnPrescalerChange, name: "PRESC");
     controlRegister.DefineFlagField(1, writeCallback: OnReload, name: "RELOAD");
     controlRegister.DefineFlagField(0, writeCallback: OnEnableChange, name: "ENABLE");
     EventEnabled = true;
 }
示例#19
0
 public SunxiTimerUnit(Machine machine, SunxiTimer parent) : base(machine, 24000000, direction: Emul8.Time.Direction.Descending, enabled: false, eventEnabled: true)
 {
     timerGroup      = parent;
     controlRegister = new DoubleWordRegister(this, 0x04);
     controlRegister.DefineFlagField(7, changeCallback: (oldValue, newValue) => Mode        = newValue ? WorkMode.OneShot : WorkMode.Periodic);
     controlRegister.DefineValueField(4, 3, changeCallback: (oldValue, newValue) => Divider = 1 << (int)newValue);
     controlRegister.DefineFlagField(1, FieldMode.WriteOneToClear, writeCallback: (oldValue, newValue) => Value = Limit);
     controlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) => Enabled = newValue);
     controlRegister.DefineEnumField <ClockSource>(2, 2, changeCallback: OnClockSourceChange);
 }
示例#20
0
 public CortexAGenericTimerUnit(Machine machine, GPIO irq, long compareValue)
     : base(machine, Frequency, compareValue, long.MaxValue)
 {
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(0, writeCallback: OnEnabled);
     maskOutput       = controlRegister.DefineFlagField(1);
     outputFlag       = controlRegister.DefineFlagField(2, FieldMode.Read);
     this.irq         = irq;
     compareValueDiff = compareValue;
 }
 public CortexAGenericTimerUnit(Machine machine, GPIO irq, ulong compareValue, bool enabled = false)
     : base(machine.ClockSource, CortexAGenericTimer.Frequency, compare: compareValue, enabled: enabled)
 {
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(0, writeCallback: OnEnabled);
     maskOutput = controlRegister.DefineFlagField(1);
     outputFlag = controlRegister.DefineFlagField(2, FieldMode.Read);
     this.irq = irq;
     compareValueDiff = compareValue;
 }
 public CortexAGlobalTimer(Machine machine, long frequency) : base(machine.ClockSource, frequency)
 {
     sysbus          = machine.SystemBus;
     IRQ             = new GPIO();
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(0, name: "Timer enable", writeCallback: (oldValue, newValue) => Enabled = newValue,
                                     valueProviderCallback: (oldValue) => Enabled);
     comparatorEnabled    = controlRegister.DefineFlagField(1);
     interruptEnabled     = controlRegister.DefineFlagField(2);
     autoIncrementEnabled = controlRegister.DefineFlagField(3);
 }
示例#23
0
 public CortexAGlobalTimer(Machine machine, long frequency) : base(machine, frequency, long.MaxValue, long.MaxValue)
 {
     sysbus = machine.SystemBus;
     IRQ = new GPIO();
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(0, name: "Timer enable", writeCallback: (oldValue, newValue) => Enabled = newValue,
         valueProviderCallback: (oldValue) => Enabled);
     comparatorEnabled = controlRegister.DefineFlagField(1);
     interruptEnabled = controlRegister.DefineFlagField(2);
     autoIncrementEnabled = controlRegister.DefineFlagField(3);
 }
示例#24
0
        private void CreateRegisters()
        {
            var control1 = new DoubleWordRegister(this).WithFlag(15, writeCallback: SoftwareResetWrite, name: "SWRST").WithFlag(9, FieldMode.Read, name: "StopGen", writeCallback: StopWrite)
                           .WithFlag(8, FieldMode.Read, writeCallback: StartWrite, name: "StartGen").WithFlag(0, writeCallback: PeripheralEnableWrite, name: "PeriEn");
            var control2 = new DoubleWordRegister(this).WithValueField(0, 6, name: "Freq");
            var status1  = new DoubleWordRegister(this);
            var status2  = new DoubleWordRegister(this);

            data = new DoubleWordRegister(this);

            acknowledgeEnable = control1.DefineFlagField(10);

            bufferInterruptEnable = control2.DefineFlagField(10, changeCallback: InterruptEnableChange);
            eventInterruptEnable  = control2.DefineFlagField(9, changeCallback: InterruptEnableChange);
            errorInterruptEnable  = control2.DefineFlagField(8);

            dataRegister = data.DefineValueField(0, 8, readCallback: DataRead, writeCallback: DataWrite);

            acknowledgeFailed    = status1.DefineFlagField(10, FieldMode.ReadToClear | FieldMode.WriteZeroToClear, changeCallback: (_, __) => Update());
            dataRegisterEmpty    = status1.DefineFlagField(7, FieldMode.Read);
            dataRegisterNotEmpty = status1.DefineFlagField(6, FieldMode.Read);
            byteTransferFinished = status1.DefineFlagField(2, FieldMode.Read);
            addressSentOrMatched = status1.DefineFlagField(1, FieldMode.Read, readCallback: (_, __) => {
                if (state == State.StartInitiated)
                {
                    state = State.AwaitingAddress;
                }
            });
            startBit = status1.DefineFlagField(0, FieldMode.Read);

            transmitterReceiver = status2.DefineFlagField(2, FieldMode.Read);
            masterSlave         = status2.DefineFlagField(0, FieldMode.Read, readCallback: (_, __) => {
                addressSentOrMatched.Value  = false;
                dataRegisterNotEmpty.Value |= state == State.HasDataToRead;
                Update();
            });

            var registerDictionary = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.RiseTime, DoubleWordRegister.CreateRWRegister(0x2) },
                { (long)Registers.ClockControl, DoubleWordRegister.CreateRWRegister() },
                { (long)Registers.OwnAddress1, DoubleWordRegister.CreateRWRegister() },
                { (long)Registers.OwnAddress2, DoubleWordRegister.CreateRWRegister() },
                { (long)Registers.NoiseFilter, DoubleWordRegister.CreateRWRegister() },
                { (long)Registers.Control1, control1 },
                { (long)Registers.Control2, control2 },
                { (long)Registers.Status1, status1 },
                { (long)Registers.Status2, status2 },
                { (long)Registers.Data, data },
            };

            registers = new DoubleWordRegisterCollection(this, registerDictionary);
        }
示例#25
0
 private void SetupRegisters()
 {
     timerIrqEnableRegister = new DoubleWordRegister(this);
     timerStatusRegister    = new DoubleWordRegister(this);
     for (int i = 0; i < NumberOfTimerUnits; ++i)
     {
         timerInterruptEnabled[i] = timerIrqEnableRegister.DefineFlagField(i);
         timerInterruptStatus[i]  = timerStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear | FieldMode.Read);
     }
     lowOscillatorControlRegister = new DoubleWordRegister(this, 0x4000);
     lowOscillatorControlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) => lowOscillatorFrequency = newValue ? 32768 : 32000);
 }
示例#26
0
        private static DoubleWordRegister[] CreateRegistersGroup(int size, IPeripheral parent, int position, int width,
                                                                 FieldMode mode = FieldMode.Read | FieldMode.Write, Action <int, uint> writeCallback = null, Func <int, uint> valueProviderCallback = null, string name = null)
        {
            var result = new DoubleWordRegister[size];

            for (var i = 0; i < size; i++)
            {
                var j = i;
                result[i] = new DoubleWordRegister(parent)
                            .WithValueField(position, width, mode, name: name + j,
                                            valueProviderCallback: valueProviderCallback == null ? (Func <uint, uint>)null : _ => valueProviderCallback(j),
                                            writeCallback: writeCallback == null ? (Action <uint, uint>)null : (_, @new) => { writeCallback(j, @new); });
            }
            return(result);
        }
示例#27
0
 private DoubleWordRegisterCollection CreateRegisters()
 {
     var map = new Dictionary<long, DoubleWordRegister>();
     for(var regNumber = 0; regNumber < 4; ++regNumber)
     {
         var reg = new DoubleWordRegister(this, 0);
         for(var fieldNumber = 0; fieldNumber < 4; ++fieldNumber)
         {
             var rn = regNumber;
             var fn = fieldNumber;
             extiMappings[regNumber * 4 + fieldNumber] = reg.DefineValueField(4 * fieldNumber, 4, name: "EXTI" + regNumber * 4 + fieldNumber, changeCallback: (_, __) => Connections[rn * 4 + fn].Unset());
         }
         map.Add((long)Registers.ExternalInterruptConfiguration1 + 4 * regNumber, reg);
     }
     return new DoubleWordRegisterCollection(this, map);
 }
        public STM32F1GPIOPort(Machine machine) : base(machine, NumberOfPorts)
        {
            pins = new PinMode[NumberOfPorts];

            var configurationLowRegister  = new DoubleWordRegister(this, 0x44444444);
            var configurationHighRegister = new DoubleWordRegister(this, 0x44444444);

            for (var offset = 0; offset < 32; offset += 4)
            {
                var lowId  = offset / 4;
                var highId = lowId + 8;

                configurationLowRegister.DefineEnumField <PinMode>(offset, 2, name: $"MODE{lowId}", writeCallback: (_, value) => pins[lowId] = value, valueProviderCallback: _ => pins[lowId]);
                configurationLowRegister.Tag($"CNF{lowId}", offset + 2, 2);

                configurationHighRegister.DefineEnumField <PinMode>(offset, 2, name: $"MODE{highId}", writeCallback: (_, value) => pins[highId] = value, valueProviderCallback: _ => pins[highId]);
                configurationHighRegister.Tag($"CNF{highId}", offset + 2, 2);
            }

            var registersMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.ConfigurationLow, configurationLowRegister },

                { (long)Registers.ConfigurationHigh, configurationHighRegister },

                { (long)Registers.InputData, new DoubleWordRegister(this)
                  // upper 16 bits are reserved
                  .WithValueField(0, 16, FieldMode.Read, name: "IDR", valueProviderCallback: _ => BitHelper.GetValueFromBitsArray(State)) },

                { (long)Registers.OutputData, new DoubleWordRegister(this)
                  // upper 16 bits are reserved
                  .WithValueField(0, 16, name: "ODR", writeCallback: (_, value) => SetConnectionsStateUsingBits(value)) },

                { (long)Registers.BitSetReset, new DoubleWordRegister(this)
                  .WithValueField(16, 16, FieldMode.Write, name: "BR", writeCallback: (_, value) => SetBitsFromMask(value, false))
                  .WithValueField(0, 16, FieldMode.Write, name: "BS", writeCallback: (_, value) => SetBitsFromMask(value, true)) },

                { (long)Registers.BitReset, new DoubleWordRegister(this)
                  // upper 16 bits are reserved
                  .WithValueField(0, 16, FieldMode.Write, name: "BR", writeCallback: (_, value) => SetBitsFromMask(value, false)) }
            };

            registers = new DoubleWordRegisterCollection(this, registersMap);

            Reset();
        }
        private DoubleWordRegisterCollection CreateRegisters()
        {
            var map = new Dictionary <long, DoubleWordRegister>();

            for (var regNumber = 0; regNumber < 4; ++regNumber)
            {
                var reg = new DoubleWordRegister(this, 0);
                for (var fieldNumber = 0; fieldNumber < 4; ++fieldNumber)
                {
                    var rn = regNumber;
                    var fn = fieldNumber;
                    extiMappings[regNumber * 4 + fieldNumber] = reg.DefineValueField(4 * fieldNumber, 4, name: "EXTI" + regNumber * 4 + fieldNumber, changeCallback: (_, __) => Connections[rn * 4 + fn].Unset());
                }
                map.Add((long)Registers.ExternalInterruptConfiguration1 + 4 * regNumber, reg);
            }
            return(new DoubleWordRegisterCollection(this, map));
        }
示例#30
0
        public TexasInstrumentsTimer(Machine machine)
        {
            IRQ12 = new GPIO();
            IRQ34 = new GPIO();

            timer12 = new LimitTimer(machine, 24000000, direction: Direction.Ascending); // clocked from AUXCLK (default 24 MHz)
            timer34 = new LimitTimer(machine, 24000000, direction: Direction.Ascending);
            timer12.LimitReached += () => OnTimerLimitReached(timer12);
            timer34.LimitReached += () => OnTimerLimitReached(timer34);
            timer12.EventEnabled  = true;
            timer34.EventEnabled  = true;

            timerControlRegister                   = new DoubleWordRegister(this);
            timerGlobalControlRegister             = new DoubleWordRegister(this, 3);
            timerInterruptControlAndStatusRegister = new DoubleWordRegister(this, 0x10001); // the driver expects interrupts to be enabled; inconsistent with timer user's guixde

            timerControlRegister.DefineEnumField <OperationMode>(6, 2, changeCallback: (oldValue, newValue) => OnEnableModeChanged(oldValue, newValue, timer12));
            timerControlRegister.DefineEnumField <OperationMode>(22, 2, changeCallback: (oldValue, newValue) => OnEnableModeChanged(oldValue, newValue, timer34));
            resetOnRead12 = timerControlRegister.DefineFlagField(10);
            resetOnRead34 = timerControlRegister.DefineFlagField(26);

            timerGlobalControlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) =>
            {
                if (!newValue)
                {
                    timer12.Reset();
                }
            });
            timerGlobalControlRegister.DefineFlagField(1, changeCallback: (oldValue, newValue) =>
            {
                if (!newValue)
                {
                    timer34.Reset();
                }
            });

            timerGlobalControlRegister.DefineEnumField <TimerMode>(2, 2, changeCallback: OnTimerModeChanged);

            timerGlobalControlRegister.DefineValueField(8, 4, changeCallback: (oldValue, newValue) => timer34.Divider = (int)newValue);
            interruptEnable12   = timerInterruptControlAndStatusRegister.DefineFlagField(0);
            interruptEnable34   = timerInterruptControlAndStatusRegister.DefineFlagField(16);
            interruptOccurred12 = timerInterruptControlAndStatusRegister.DefineFlagField(3);
            interruptOccurred34 = timerInterruptControlAndStatusRegister.DefineFlagField(19);

            Reset();
        }
示例#31
0
        public TexasInstrumentsTimer(Machine machine)
        {
            IRQ12 = new GPIO();
            IRQ34 = new GPIO();

            timer12 = new LimitTimer(machine, 24000000, direction: Direction.Ascending); // clocked from AUXCLK (default 24 MHz)
            timer34 = new LimitTimer(machine, 24000000, direction: Direction.Ascending);
            timer12.LimitReached += () => OnTimerLimitReached(timer12);
            timer34.LimitReached += () => OnTimerLimitReached(timer34);
            timer12.EventEnabled = true;
            timer34.EventEnabled = true;

            timerControlRegister = new DoubleWordRegister(this);
            timerGlobalControlRegister = new DoubleWordRegister(this, 3);
            timerInterruptControlAndStatusRegister = new DoubleWordRegister(this, 0x10001); // the driver expects interrupts to be enabled; inconsistent with timer user's guixde

            timerControlRegister.DefineEnumField<OperationMode>(6, 2, changeCallback: (oldValue, newValue) => OnEnableModeChanged(oldValue, newValue, timer12));
            timerControlRegister.DefineEnumField<OperationMode>(22, 2, changeCallback: (oldValue, newValue) => OnEnableModeChanged(oldValue, newValue, timer34));
            resetOnRead12 = timerControlRegister.DefineFlagField(10);
            resetOnRead34 = timerControlRegister.DefineFlagField(26);

            timerGlobalControlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) =>
            {
                if(!newValue)
                {
                    timer12.Reset();
                }
            });
            timerGlobalControlRegister.DefineFlagField(1, changeCallback: (oldValue, newValue) =>
            {
                if(!newValue)
                {
                    timer34.Reset();
                }
            });

            timerGlobalControlRegister.DefineEnumField<TimerMode>(2, 2, changeCallback: OnTimerModeChanged);

            timerGlobalControlRegister.DefineValueField(8, 4, changeCallback: (oldValue, newValue) => timer34.Divider = (int)newValue);
            interruptEnable12 = timerInterruptControlAndStatusRegister.DefineFlagField(0);
            interruptEnable34 = timerInterruptControlAndStatusRegister.DefineFlagField(16);
            interruptOccurred12 = timerInterruptControlAndStatusRegister.DefineFlagField(3);
            interruptOccurred34 = timerInterruptControlAndStatusRegister.DefineFlagField(19);

            Reset();
        }
示例#32
0
        public void ShouldNotAllowIntersectingFields()
        {
            var foundException = false;
            var localRegister  = new DoubleWordRegister(null);

            localRegister.DefineValueField(1, 5);
            try
            {
                localRegister.DefineValueField(0, 2);
            }
            catch (ArgumentException)
            {
                foundException = true;
            }
            finally
            {
                Assert.IsTrue(foundException);
            }
        }
示例#33
0
        public STM32G0DMA(Machine machine, int numberOfChannels)
        {
            this.machine          = machine;
            engine                = new DmaEngine(machine);
            this.numberOfChannels = numberOfChannels;
            channels              = new Channel[numberOfChannels];
            var innerConnections = new Dictionary <int, IGPIO>();

            for (var i = 0; i < numberOfChannels; ++i)
            {
                channels[i]         = new Channel(this, i);
                innerConnections[i] = new GPIO();
            }

            Connections = new ReadOnlyDictionary <int, IGPIO>(innerConnections);

            var interruptStatus    = new DoubleWordRegister(this);
            var interruptFlagClear = new DoubleWordRegister(this)
                                     .WithWriteCallback((_, __) => Update());

            for (var i = 0; i < numberOfChannels; ++i)
            {
                var j = i;
                interruptStatus.DefineFlagField(j * 4 + 0, FieldMode.Read, valueProviderCallback: _ => channels[j].GlobalInterrupt, name: $"Global interrupt flag for channel {j} (GIF{j})");
                interruptStatus.DefineFlagField(j * 4 + 1, FieldMode.Read, valueProviderCallback: _ => channels[j].TransferComplete, name: $"Transfer complete flag for channel {j} (TCIF{j})");
                interruptStatus.DefineFlagField(j * 4 + 2, FieldMode.Read, valueProviderCallback: _ => channels[j].HalfTransfer, name: $"Half transfer flag for channel {j} (HTIF{j})");
                interruptStatus.Tag($"Transfer error flag for channel {j} (TEIF{j})", j * 4 + 3, 1);

                interruptFlagClear.DefineFlagField(j * 4 + 0, FieldMode.Write, writeCallback: (_, val) => channels[j].GlobalInterrupt  = !val, name: $"Global interrupt flag clear for channel {j} (CGIF{j})");
                interruptFlagClear.DefineFlagField(j * 4 + 1, FieldMode.Write, writeCallback: (_, val) => channels[j].TransferComplete = !val, name: $"Transfer complete flag clear for channel {j} (CTEIF{j})");
                interruptFlagClear.DefineFlagField(j * 4 + 2, FieldMode.Write, writeCallback: (_, val) => channels[j].HalfTransfer     = !val, name: $"Half transfer flag clear for channel {j} (CHTIF{j})");
                interruptFlagClear.Tag($"Transfer error flag clear for channel {j} (CTEIF{j})", j * 4 + 3, 1);
            }

            var registerMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.InterruptStatus, interruptStatus },
                { (long)Registers.InterruptFlagClear, interruptFlagClear },
            };

            registers = new DoubleWordRegisterCollection(this, registerMap);
        }
        private void SetupRegisters()
        {
            var control = new DoubleWordRegister(this)
                          .WithEnumField <DoubleWordRegister, ClockMode>(0, 3, name: "WUCKSEL", writeCallback: (_, value) =>
            {
                this.DebugLog("Setting wucksel to {0}", value);
                // for now we ignore changing clock frequency
            })
                          .WithFlag(10, name: "WUTE", writeCallback: (_, value) =>
            {
                this.DebugLog(value ? "Enabling timer" : "Disabling timer");
                Enabled = value;
            });

            wakeupTimerInterruptEnable = control.DefineFlagField(14, name: "WUTIE");

            var initializationStatus = new DoubleWordRegister(this, 0x7);

            wakeupTimerFlag = initializationStatus.DefineFlagField(10, FieldMode.Read | FieldMode.WriteZeroToClear, name: "WUTF", writeCallback: (_, value) =>
            {
                if (!value)
                {
                    this.DebugLog("Clearing IRQ");
                    IRQ.Unset();
                }
            });

            var wakeupTimer = new DoubleWordRegister(this).WithValueField(0, 16, name: "WUT", writeCallback: (_, value) =>
            {
                this.DebugLog("Setting limit to {0}", value);
                Limit = value;
            });

            var registerDictionary = new Dictionary <long, DoubleWordRegister> {
                { (long)Registers.Control, control },
                { (long)Registers.InitializationStatus, initializationStatus },
                { (long)Registers.WakeupTimer, wakeupTimer }
            };

            registers = new DoubleWordRegisterCollection(this, registerDictionary);
        }
示例#35
0
        public Emios(Machine machine) : base(machine, 2 * NumberOfChannels)
        {
            controlRegisters = new DoubleWordRegister[NumberOfChannels];
            statusRegisters  = new DoubleWordRegister[NumberOfChannels];
            channelModes     = new IEnumRegisterField <ChannelMode> [NumberOfChannels];
            channelFlags     = new IFlagRegisterField[NumberOfChannels];
            inputState       = new IFlagRegisterField[NumberOfChannels];
            interruptEnabled = new IFlagRegisterField[NumberOfChannels];

            for (var i = 0; i < controlRegisters.Length; i++)
            {
                var j = i;
                controlRegisters[i] = new DoubleWordRegister(this);
                controlRegisters[i].DefineFlagField(7, writeCallback:
                                                    (oldValue, newValue) =>
                {
                    if (channelModes[j].Value == ChannelMode.Output)
                    {
                        Connections[j].Set(newValue);
                    }
                }, name: "Edge polarity");
                channelModes[i]     = controlRegisters[i].DefineEnumField <ChannelMode>(0, 7);
                interruptEnabled[i] = controlRegisters[i].DefineFlagField(17);

                statusRegisters[i] = new DoubleWordRegister(this);
                channelFlags[i]    = statusRegisters[i].DefineFlagField(0, FieldMode.WriteOneToClear,
                                                                        writeCallback: (oldValue, newValue) =>
                {
                    if (newValue)
                    {
                        Connections[NumberOfChannels + j].Unset();
                    }
                });
                inputState[i] = statusRegisters[i].DefineFlagField(2, FieldMode.Read);
            }
        }
示例#36
0
        private void CreateRegisters()
        {
            var registersMap = new Dictionary <long, DoubleWordRegister> {
                { (long)Registers.Control0, new DoubleWordRegister(this, 0x8)
                  .WithEnumField(1, 2, out mode, FieldMode.Read | FieldMode.Write, name: "Mode of the peripheral")
                  .WithTag("Disable peripheral", 3, 1)
                  .WithTag("Enable interupt", 4, 1) },
                { (long)Registers.Control1, new DoubleWordRegister(this, 0xff)
                  .WithValueField(0, 8, out bufferSize, name: "Size of buffer",
                                  writeCallback: (oldValue, newValue) => this.Log(LogLevel.Info, "Write to buffer {0}", newValue))
                  .WithTag("Add CRC after buffer", 9, 1) },
            };
            var valueRegister = new DoubleWordRegister(this, 0x55).WithValueField(0, 8, out valueContent, name: "Value registers",
                                                                                  writeCallback: (oldValue, newValue) => this.Log(LogLevel.Info, "Value was written {0}", newValue),
                                                                                  readCallback:  (oldValue, newValue) => this.Log(LogLevel.Info, "Value was read {0}", newValue));

            // store all the registers to the same IValueRegisterField => will lose the content from previous offsets
            for (var i = 0; i < this.Size - registersMap.Count; i++)
            {
                registersMap.Add((long)Registers.Value + i, valueRegister);
            }

            registers = new DoubleWordRegisterCollection(this, registersMap);
        }
示例#37
0
        public Emios(Machine machine) : base(machine, 2 * NumberOfChannels)
        {
            controlRegisters = new DoubleWordRegister[NumberOfChannels];
            statusRegisters = new DoubleWordRegister[NumberOfChannels];
            channelModes = new IEnumRegisterField<ChannelMode>[NumberOfChannels];
            channelFlags = new IFlagRegisterField[NumberOfChannels];
            inputState = new IFlagRegisterField[NumberOfChannels];
            interruptEnabled = new IFlagRegisterField[NumberOfChannels];

            for(var i = 0; i < controlRegisters.Length; i++)
            {
                var j = i;
                controlRegisters[i] = new DoubleWordRegister(this);
                controlRegisters[i].DefineFlagField(7, writeCallback: 
					(oldValue, newValue) =>
                {
                    if(channelModes[j].Value == ChannelMode.Output)
                    {
                        Connections[j].Set(newValue);
                    }
                }, name: "Edge polarity");
                channelModes[i] = controlRegisters[i].DefineEnumField<ChannelMode>(0, 7);
                interruptEnabled[i] = controlRegisters[i].DefineFlagField(17);

                statusRegisters[i] = new DoubleWordRegister(this);
                channelFlags[i] = statusRegisters[i].DefineFlagField(0, FieldMode.WriteOneToClear, 
                    writeCallback: (oldValue, newValue) =>
                    {
                        if(newValue)
                        {
                            Connections[NumberOfChannels + j].Unset();
                        }
                    });
                inputState[i] = statusRegisters[i].DefineFlagField(2, FieldMode.Read);
            }
        }
        private STM32DMA2D()
        {
            var controlRegister = new DoubleWordRegister(this);

            startFlag = controlRegister.DefineFlagField(0, FieldMode.Read | FieldMode.Write, name: "Start", changeCallback: (old, @new) => { if (@new)
                                                                                                                                             {
                                                                                                                                                 DoTransfer();
                                                                                                                                             }
                                                        });
            dma2dMode = controlRegister.DefineEnumField <Mode>(16, 2, FieldMode.Read | FieldMode.Write, name: "Mode");

            var foregroundClutMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            var backgroundClutMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var interruptFlagClearRegister = new DoubleWordRegister(this).WithFlag(1, FieldMode.Read | FieldMode.WriteOneToClear, name: "CTCIF", changeCallback: (old, @new) => { if (!@new)
                                                                                                                                                                                  {
                                                                                                                                                                                      IRQ.Unset();
                                                                                                                                                                                  }
                                                                                   });

            var numberOfLineRegister = new DoubleWordRegister(this);

            numberOfLineField  = numberOfLineRegister.DefineValueField(0, 16, FieldMode.Read | FieldMode.Write, name: "NL");
            pixelsPerLineField = numberOfLineRegister.DefineValueField(16, 14, FieldMode.Read | FieldMode.Write, name: "PL",
                                                                       writeCallback: (_, __) =>
            {
                HandleOutputBufferSizeChange();
                HandleBackgroundBufferSizeChange();
                HandleForegroundBufferSizeChange();
            });

            outputMemoryAddressRegister     = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            backgroundMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            foregroundMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var outputPfcControlRegister = new DoubleWordRegister(this);

            outputColorModeField = outputPfcControlRegister.DefineEnumField <Dma2DColorMode>(0, 3, FieldMode.Read | FieldMode.Write, name: "CM",
                                                                                             writeCallback: (_, __) =>
            {
                HandlePixelFormatChange();
                HandleOutputBufferSizeChange();
            });

            var foregroundPfcControlRegister = new DoubleWordRegister(this);

            foregroundColorModeField = foregroundPfcControlRegister.DefineEnumField <Dma2DColorMode>(0, 4, FieldMode.Read | FieldMode.Write, name: "CM",
                                                                                                     writeCallback: (_, __) =>
            {
                HandlePixelFormatChange();
                HandleForegroundBufferSizeChange();
            });
            var foregroundClutSizeField = foregroundPfcControlRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "CS");

            foregroundClutColorModeField = foregroundPfcControlRegister.DefineEnumField <Dma2DColorMode>(4, 1, FieldMode.Read | FieldMode.Write, name: "CCM",
                                                                                                         changeCallback: (_, __) =>
            {
                HandlePixelFormatChange();
            });
            foregroundPfcControlRegister.DefineFlagField(5, FieldMode.Read, name: "START",
                                                         writeCallback: (_, value) =>
            {
                if (!value)
                {
                    return;
                }

                foregroundClut = new byte[(foregroundClutSizeField.Value + 1) * foregroundClutColorModeField.Value.ToPixelFormat().GetColorDepth()];
                machine.SystemBus.ReadBytes(foregroundClutMemoryAddressRegister.Value, foregroundClut.Length, foregroundClut, 0, true);
            });

            var backgroundPfcControlRegister = new DoubleWordRegister(this);

            backgroundColorModeField = backgroundPfcControlRegister.DefineEnumField <Dma2DColorMode>(0, 4, FieldMode.Read | FieldMode.Write, name: "CM",
                                                                                                     writeCallback: (_, __) =>
            {
                HandlePixelFormatChange();
                HandleBackgroundBufferSizeChange();
            });
            var backgroundClutSizeField = backgroundPfcControlRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "CS");

            backgroundClutColorModeField = backgroundPfcControlRegister.DefineEnumField <Dma2DColorMode>(4, 1, FieldMode.Read | FieldMode.Write, name: "CCM",
                                                                                                         changeCallback: (_, __) =>
            {
                HandlePixelFormatChange();
            });
            backgroundPfcControlRegister.DefineFlagField(5, FieldMode.Read, name: "START",
                                                         writeCallback: (_, value) =>
            {
                if (!value)
                {
                    return;
                }

                backgroundClut = new byte[(backgroundClutSizeField.Value + 1) * backgroundClutColorModeField.Value.ToPixelFormat().GetColorDepth()];
                machine.SystemBus.ReadBytes(backgroundClutMemoryAddressRegister.Value, backgroundClut.Length, backgroundClut, 0, true);
            });

            outputColorRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var outputOffsetRegister = new DoubleWordRegister(this);

            outputLineOffsetField = outputOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var foregroundOffsetRegister = new DoubleWordRegister(this);

            foregroundLineOffsetField = foregroundOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var backgroundOffsetRegister = new DoubleWordRegister(this);

            backgroundLineOffsetField = backgroundOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var regs = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Register.ControlRegister, controlRegister },
                { (long)Register.InterruptFlagClearRegister, interruptFlagClearRegister },
                { (long)Register.ForegroundMemoryAddressRegister, foregroundMemoryAddressRegister },
                { (long)Register.ForegroundOffsetRegister, foregroundOffsetRegister },
                { (long)Register.BackgroundMemoryAddressRegister, backgroundMemoryAddressRegister },
                { (long)Register.BackgroundOffsetRegister, backgroundOffsetRegister },
                { (long)Register.ForegroundPfcControlRegister, foregroundPfcControlRegister },
                { (long)Register.BackgroundPfcControlRegister, backgroundPfcControlRegister },
                { (long)Register.OutputPfcControlRegister, outputPfcControlRegister },
                { (long)Register.OutputColorRegister, outputColorRegister },
                { (long)Register.OutputMemoryAddressRegister, outputMemoryAddressRegister },
                { (long)Register.OutputOffsetRegister, outputOffsetRegister },
                { (long)Register.NumberOfLineRegister, numberOfLineRegister },
                { (long)Register.ForegroundClutMemoryAddressRegister, foregroundClutMemoryAddressRegister },
                { (long)Register.BackgroundClutMemoryAddressRegister, backgroundClutMemoryAddressRegister }
            };

            registers = new DoubleWordRegisterCollection(this, regs);
        }
示例#39
0
        private void SetupRegisters()
        {
            commandRegister = new DoubleWordRegister(this);
            dmacStatusRegister = new DoubleWordRegister(this);
            startCommandFlag = commandRegister.DefineFlagField(31, changeCallback: OnStartCommand);
            sendInitSequence = commandRegister.DefineFlagField(15);
            transferDirection = commandRegister.DefineFlagField(10);
            dataTransfer = commandRegister.DefineFlagField(9);
            receiveResponse = commandRegister.DefineFlagField(6);
            commandIndex = commandRegister.DefineValueField(0, 6);

            responseRegisters = new uint[4];

            receiveInterrupt = dmacStatusRegister.DefineFlagField(1, FieldMode.WriteOneToClear | FieldMode.Read);
            transmitInterrupt = dmacStatusRegister.DefineFlagField(0, FieldMode.WriteOneToClear | FieldMode.Read);
            generalRegisters = new DoubleWordRegisterCollection(this, new Dictionary<long, DoubleWordRegister>() {
                {(long)Registers.ControlRegister, new DoubleWordRegister(this).WithFlag(0, changeCallback: (oldValue, newValue) => {if(newValue) Reset();}).WithFlag(2).WithFlag(4).WithFlag(5)},
                {(long)Registers.BlockSizeRegister, new DoubleWordRegister(this, 0x200).WithValueField(0, 16, changeCallback: (oldValue, newValue) => BlockSize = (int)newValue)},
                {(long)Registers.DmacInterruptEnable, DoubleWordRegister.CreateRWRegister()},
            });
        }
示例#40
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();
        }
示例#41
0
 public SunxiTimerUnit(Machine machine, SunxiTimer parent) : base(machine, 24000000, direction: Emul8.Time.Direction.Descending, enabled: false)
 {
     timerGroup = parent;
     controlRegister = new DoubleWordRegister(this, 0x04);
     controlRegister.DefineFlagField(7, changeCallback: (oldValue, newValue) => Mode = newValue ? WorkMode.OneShot : WorkMode.Periodic);
     controlRegister.DefineValueField(4, 3, changeCallback: (oldValue, newValue) => Divider = 1 << (int)newValue);
     controlRegister.DefineFlagField(1, FieldMode.WriteOneToClear, writeCallback: (oldValue, newValue) => Value = Limit);
     controlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) => Enabled = newValue);
     controlRegister.DefineEnumField<ClockSource>(2, 2, changeCallback: OnClockSourceChange);
 }
示例#42
0
文件: CC2538RF.cs 项目: emul8/emul8
 private static DoubleWordRegister[] CreateRegistersGroup(int size, IPeripheral parent, int position, int width,
     FieldMode mode = FieldMode.Read | FieldMode.Write, Action<int, uint> writeCallback = null, Func<int, uint> valueProviderCallback = null, string name = null)
 {
     var result = new DoubleWordRegister[size];
     for(var i = 0; i < size; i++)
     {
         var j = i;
         result[i] = new DoubleWordRegister(parent)
             .WithValueField(position, width, mode, name: name + j,
                 valueProviderCallback: valueProviderCallback == null ? (Func<uint, uint>)null : _ => valueProviderCallback(j),
                 writeCallback: writeCallback == null ? (Action<uint, uint>)null : (_, @new) => { writeCallback(j, @new); });
     }
     return result;
 }
示例#43
0
 public void ShouldNotAllowIntersectingFields()
 {
     var localRegister = new DoubleWordRegister(null);
     localRegister.DefineValueField(1, 5);
     Assert.Catch<ArgumentException>(() => localRegister.DefineValueField(0, 2));
 }
示例#44
0
 public SunxiHighSpeedTimerUnit(Machine machine, long frequency) : base(machine, frequency, direction: Direction.Descending, enabled: false)
 {
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(7, changeCallback: OnModeChange, name: "MODE");
     controlRegister.DefineValueField(4, 3, writeCallback: OnPrescalerChange, name: "PRESC");
     controlRegister.DefineFlagField(1, writeCallback: OnReload, name: "RELOAD");
     controlRegister.DefineFlagField(0, writeCallback: OnEnableChange, name: "ENABLE");
     EventEnabled = true;
 }
示例#45
0
文件: STM32LTDC.cs 项目: rte-se/emul8
            public Layer(STM32LTDC video, int layerId)
            {
                ControlRegister = new DoubleWordRegister(video);
                LayerEnableFlag = ControlRegister.DefineFlagField(0, FieldMode.Read | FieldMode.Write, name: "LEN", writeCallback: (_, __) => WarnAboutWrongBufferConfiguration());

                WindowHorizontalPositionConfigurationRegister = new DoubleWordRegister(video);
                WindowHorizontalStartPositionField = WindowHorizontalPositionConfigurationRegister.DefineValueField(0, 12, FieldMode.Read | FieldMode.Write, name: "WHSTPOS");
                WindowHorizontalStopPositionField = WindowHorizontalPositionConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "WHSPPOS", writeCallback: (_, __) => HandleLayerWindowConfigurationChange());

                WindowVerticalPositionConfigurationRegister = new DoubleWordRegister(video);
                WindowVerticalStartPositionField = WindowVerticalPositionConfigurationRegister.DefineValueField(0, 12, FieldMode.Read | FieldMode.Write, name: "WVSTPOS");
                WindowVerticalStopPositionField = WindowVerticalPositionConfigurationRegister.DefineValueField(16, 12, FieldMode.Read | FieldMode.Write, name: "WVSPPOS", writeCallback: (_, __) => HandleLayerWindowConfigurationChange());

                PixelFormatConfigurationRegister = new DoubleWordRegister(video);
                PixelFormatField = PixelFormatConfigurationRegister.DefineEnumField<Dma2DColorMode>(0, 3, FieldMode.Read | FieldMode.Write, name: "PF", writeCallback: (_, __) => { RestoreBuffers(); video.HandlePixelFormatChange(); });

                ConstantAlphaConfigurationRegister = new DoubleWordRegister(video, 0xFF).WithValueField(0, 8, FieldMode.Read | FieldMode.Write, name: "CONSTA");

                ColorFrameBufferAddressRegister = new DoubleWordRegister(video).WithValueField(0, 32, FieldMode.Read | FieldMode.Write, name: "CFBADD", writeCallback: (_, __) => WarnAboutWrongBufferConfiguration());

                DefaultColorConfigurationRegister = new DoubleWordRegister(video);
                DefaultColorBlueField = DefaultColorConfigurationRegister.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write, name: "DCBLUE");
                DefaultColorGreenField = DefaultColorConfigurationRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "DCGREEN");
                DefaultColorRedField = DefaultColorConfigurationRegister.DefineValueField(16, 8, FieldMode.Read | FieldMode.Write, name: "DCRED");
                DefaultColorAlphaField = DefaultColorConfigurationRegister.DefineValueField(24, 8, FieldMode.Read | FieldMode.Write, name: "DCALPHA", writeCallback: (_, __) => HandleLayerBackgroundColorChange());

                this.layerId = layerId;
                this.video = video;
            }
示例#46
0
        public void SetUp()
        {
            register = new DoubleWordRegister(null, 0x3780u);
            enumRWField = register.DefineEnumField<TwoBitEnum>(0, 2);
            flagRWField = register.DefineFlagField(2);
            valueRWField = register.DefineValueField(3, 4);
            register.DefineEnumField<TwoBitEnum>(7, 2, readCallback: EnumCallback, writeCallback: EnumCallback, changeCallback: EnumCallback);
            register.DefineFlagField(9, readCallback: BoolCallback, writeCallback: BoolCallback, changeCallback: BoolCallback);
            register.DefineValueField(10, 4, readCallback: NumberCallback, writeCallback: NumberCallback, changeCallback: NumberCallback);
            flagTRField = register.DefineFlagField(15, FieldMode.Read | FieldMode.Toggle);
            flagSRField = register.DefineFlagField(16, FieldMode.Read | FieldMode.Set);
            flagW1CField = register.DefineFlagField(17, FieldMode.Read | FieldMode.WriteOneToClear);
            flagW0CField = register.DefineFlagField(18, FieldMode.Read | FieldMode.WriteZeroToClear);
            flagWRTCField = register.DefineFlagField(19, FieldMode.ReadToClear | FieldMode.Write);
            flagWField = register.DefineFlagField(20, FieldMode.Write);
            flagRField = register.DefineFlagField(21, FieldMode.Read);
            register.DefineValueField(22, 3, valueProviderCallback: ModifyingValueCallback);
            register.DefineFlagField(25, valueProviderCallback: ModifyingFlagCallback);
            register.DefineEnumField<TwoBitEnum>(26, 2, valueProviderCallback: ModifyingEnumCallback);

            enableValueProviders = false;

            enumCallbacks = 0;
            boolCallbacks = 0;
            numberCallbacks = 0;
            oldBoolValue = false;
            newBoolValue = false;
            oldEnumValue = TwoBitEnum.A;
            newEnumValue = TwoBitEnum.A;
            oldUintValue = 0;
            newUintValue = 0;
        }
示例#47
0
 public void ShouldNotAllowIntersectingFields()
 {
     var foundException = false;
     var localRegister = new DoubleWordRegister(null);
     localRegister.DefineValueField(1, 5);
     try
     {
         localRegister.DefineValueField(0, 2);
     }
     catch(ArgumentException)
     {
         foundException = true;
     }
     finally
     {
         Assert.IsTrue(foundException);
     }
 }
示例#48
0
文件: STM32DMA2D.cs 项目: emul8/emul8
        private STM32DMA2D()
        {
            var controlRegister = new DoubleWordRegister(this);
            startFlag = controlRegister.DefineFlagField(0, FieldMode.Read | FieldMode.Write, name: "Start", changeCallback: (old, @new) => { if(@new) DoTransfer(); });
            dma2dMode = controlRegister.DefineEnumField<Mode>(16, 2, FieldMode.Read | FieldMode.Write, name: "Mode");

            var foregroundClutMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            var backgroundClutMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var interruptFlagClearRegister = new DoubleWordRegister(this).WithFlag(1, FieldMode.Read | FieldMode.WriteOneToClear, name: "CTCIF", changeCallback: (old, @new) => { if(!@new) IRQ.Unset(); });

            var numberOfLineRegister = new DoubleWordRegister(this);
            numberOfLineField = numberOfLineRegister.DefineValueField(0, 16, FieldMode.Read | FieldMode.Write, name: "NL");
            pixelsPerLineField = numberOfLineRegister.DefineValueField(16, 14, FieldMode.Read | FieldMode.Write, name: "PL", 
                writeCallback: (_, __) => 
                { 
                    HandleOutputBufferSizeChange(); 
                    HandleBackgroundBufferSizeChange();
                    HandleForegroundBufferSizeChange();
                });

            outputMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            backgroundMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);
            foregroundMemoryAddressRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var outputPfcControlRegister = new DoubleWordRegister(this);
            outputColorModeField = outputPfcControlRegister.DefineEnumField<Dma2DColorMode>(0, 3, FieldMode.Read | FieldMode.Write, name: "CM", 
                writeCallback: (_, __) => 
                { 
                    HandlePixelFormatChange(); 
                    HandleOutputBufferSizeChange(); 
                });

            var foregroundPfcControlRegister = new DoubleWordRegister(this);
            foregroundColorModeField = foregroundPfcControlRegister.DefineEnumField<Dma2DColorMode>(0, 4, FieldMode.Read | FieldMode.Write, name: "CM", 
                writeCallback: (_, __) => 
                {
                    HandlePixelFormatChange(); 
                    HandleForegroundBufferSizeChange(); 
                });
            var foregroundClutSizeField = foregroundPfcControlRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "CS");
            foregroundClutColorModeField = foregroundPfcControlRegister.DefineEnumField<Dma2DColorMode>(4, 1, FieldMode.Read | FieldMode.Write, name: "CCM",
                changeCallback: (_, __) =>
                {
                    HandlePixelFormatChange();
                });
            foregroundPfcControlRegister.DefineFlagField(5, FieldMode.Read, name: "START",
                writeCallback: (_, value) =>
            {
                if(!value)
                {
                    return;
                }

                foregroundClut = new byte[(foregroundClutSizeField.Value + 1) * foregroundClutColorModeField.Value.ToPixelFormat().GetColorDepth()];
                machine.SystemBus.ReadBytes(foregroundClutMemoryAddressRegister.Value, foregroundClut.Length, foregroundClut, 0, true);
            });

            var backgroundPfcControlRegister = new DoubleWordRegister(this);
            backgroundColorModeField = backgroundPfcControlRegister.DefineEnumField<Dma2DColorMode>(0, 4, FieldMode.Read | FieldMode.Write, name: "CM", 
                writeCallback: (_, __) => 
                { 
                    HandlePixelFormatChange(); 
                    HandleBackgroundBufferSizeChange(); 
                });
            var backgroundClutSizeField = backgroundPfcControlRegister.DefineValueField(8, 8, FieldMode.Read | FieldMode.Write, name: "CS");
            backgroundClutColorModeField = backgroundPfcControlRegister.DefineEnumField<Dma2DColorMode>(4, 1, FieldMode.Read | FieldMode.Write, name: "CCM",
                changeCallback: (_, __) =>
                {
                    HandlePixelFormatChange();
                });
            backgroundPfcControlRegister.DefineFlagField(5, FieldMode.Read, name: "START",
                writeCallback: (_, value) =>
            {
                if(!value)
                {
                    return;
                }

                backgroundClut = new byte[(backgroundClutSizeField.Value + 1) * backgroundClutColorModeField.Value.ToPixelFormat().GetColorDepth()];
                machine.SystemBus.ReadBytes(backgroundClutMemoryAddressRegister.Value, backgroundClut.Length, backgroundClut, 0, true);
            });

            outputColorRegister = new DoubleWordRegister(this).WithValueField(0, 32, FieldMode.Read | FieldMode.Write);

            var outputOffsetRegister = new DoubleWordRegister(this);
            outputLineOffsetField = outputOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var foregroundOffsetRegister = new DoubleWordRegister(this);
            foregroundLineOffsetField = foregroundOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var backgroundOffsetRegister = new DoubleWordRegister(this);
            backgroundLineOffsetField = backgroundOffsetRegister.DefineValueField(0, 14, FieldMode.Read | FieldMode.Write, name: "LO");

            var regs = new Dictionary<long, DoubleWordRegister>
            {
                { (long)Register.ControlRegister, controlRegister },
                { (long)Register.InterruptFlagClearRegister, interruptFlagClearRegister },
                { (long)Register.ForegroundMemoryAddressRegister, foregroundMemoryAddressRegister },
                { (long)Register.ForegroundOffsetRegister, foregroundOffsetRegister },
                { (long)Register.BackgroundMemoryAddressRegister, backgroundMemoryAddressRegister },
                { (long)Register.BackgroundOffsetRegister, backgroundOffsetRegister },
                { (long)Register.ForegroundPfcControlRegister, foregroundPfcControlRegister },
                { (long)Register.BackgroundPfcControlRegister, backgroundPfcControlRegister },
                { (long)Register.OutputPfcControlRegister, outputPfcControlRegister },
                { (long)Register.OutputColorRegister, outputColorRegister },
                { (long)Register.OutputMemoryAddressRegister, outputMemoryAddressRegister },
                { (long)Register.OutputOffsetRegister, outputOffsetRegister },
                { (long)Register.NumberOfLineRegister, numberOfLineRegister },
                { (long)Register.ForegroundClutMemoryAddressRegister, foregroundClutMemoryAddressRegister },
                { (long)Register.BackgroundClutMemoryAddressRegister, backgroundClutMemoryAddressRegister }
            };

            registers = new DoubleWordRegisterCollection(this, regs);
        }
示例#49
0
 private void SetupRegisters()
 {
     timerIrqEnableRegister = new DoubleWordRegister(this);
     timerStatusRegister = new DoubleWordRegister(this);
     for(int i = 0; i < NumberOfTimerUnits; ++i)
     {
         timerInterruptEnabled[i] = timerIrqEnableRegister.DefineFlagField(i);
         timerInterruptStatus[i] = timerStatusRegister.DefineFlagField(i, FieldMode.WriteOneToClear | FieldMode.Read);
     }
     lowOscillatorControlRegister = new DoubleWordRegister(this, 0x4000);
     lowOscillatorControlRegister.DefineFlagField(0, changeCallback: (oldValue, newValue) => lowOscillatorFrequency = newValue ? 32768 : 32000);
 }
示例#50
0
 public void ShouldNotAcceptNegativeFields()
 {
     var localRegister = new DoubleWordRegister(null);
     Assert.Catch<ArgumentException>(() => localRegister.DefineEnumField<TwoBitEnum>(0, -1));
     Assert.Catch<ArgumentException>(() => localRegister.DefineValueField(0, -1));
 }
示例#51
0
文件: CC2538RF.cs 项目: emul8/emul8
        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();
        }
示例#52
0
 public CortexAGenericTimerUnit(Machine machine, GPIO irq, long compareValue)
     : base(machine, Frequency, compareValue, long.MaxValue)
 {
     controlRegister = new DoubleWordRegister(this);
     controlRegister.DefineFlagField(0, writeCallback: OnEnabled);
     maskOutput = controlRegister.DefineFlagField(1);
     outputFlag = controlRegister.DefineFlagField(2, FieldMode.Read);
     this.irq = irq;
     compareValueDiff = compareValue;
 }
示例#53
0
文件: CC2538RF.cs 项目: emul8/emul8
 private static void RegisterGroup(Dictionary<long, DoubleWordRegister> collection, long initialAddress, DoubleWordRegister[] group)
 {
     for(var i = 0; i < group.Length; i++)
     {
         collection.Add(initialAddress + 0x4 * i, group[i]);
     }
 }
示例#54
0
        private void SetupRegisters()
        {
            var interruptPriorityRegisters = new Dictionary<long, DoubleWordRegister>();
            priorities = new IValueRegisterField[64];

            for(var i = 0; i < 8; i++)
            {
                var registerKey = (long)Registers.InterruptPriority0 + 4 * i;
                interruptPriorityRegisters.Add(registerKey, new DoubleWordRegister(this, 0x77777777));
                for(var j = 0; j < 8; j++)
                {
                    priorities[i * 8 + j] = interruptPriorityRegisters[registerKey].DefineValueField(4 * j, 3, writeCallback: (oldValue, newValue) => Update());
                }
            }

            interruptPriorityRegisterCollection = new DoubleWordRegisterCollection(this, interruptPriorityRegisters);

            interruptOperationControl = new DoubleWordRegister(this);
            reflectMaskedFiq = interruptOperationControl.DefineFlagField(0, writeCallback: (oldValue, newValue) => Update());
            reflectMaskedIrq = interruptOperationControl.DefineFlagField(1, writeCallback: (oldValue, newValue) => Update());
            interruptOperationControl.DefineFlagField(2, changeCallback: (oldValue, newValue) => {
                if(newValue)
                {
                    this.Log(LogLevel.Warning, "Unsupported delayed interrupt enable/disable mode was set.");
                }
            });
        }