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; }) } }); }
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); } }
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 void ShouldNotAllowIntersectingFields() { var localRegister = new DoubleWordRegister(null); localRegister.DefineValueField(1, 5); Assert.Catch <ArgumentException>(() => localRegister.DefineValueField(0, 2)); }
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(); }
public void ShouldNotAcceptNegativeFields() { var localRegister = new DoubleWordRegister(null); Assert.Catch <ArgumentException>(() => localRegister.DefineEnumField <TwoBitEnum>(0, -1)); Assert.Catch <ArgumentException>(() => localRegister.DefineValueField(0, -1)); }
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; }
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") } }); }
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() }, }); }
public void ShouldWriteFieldsWithMaxLength() { var localRegister = new DoubleWordRegister(null); localRegister.DefineValueField(0, 32); localRegister.Write(0, uint.MaxValue); Assert.AreEqual(uint.MaxValue, localRegister.Read()); }
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") } }); }
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."); } }); }
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; }
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); }
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); } }
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; }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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(); }
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(); }
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); } }
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); }
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 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); }
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); }
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()}, }); }
public CC2538RF() { rxLock = new object(); rxQueue = new Queue <Frame>(); txQueue = new Queue <byte>(); shortAddress = new Address(AddressingMode.ShortAddress); extendedAddress = new Address(AddressingMode.ExtendedAddress); random = new Random(); IRQ = new GPIO(); srcShortEnabled = new bool[24]; srcExtendedEnabled = new bool[12]; matchedSourceAddresses = new bool[24]; srcShortPendEnabled = new bool[24]; srcExtendedPendEnabled = new bool[12]; ffsmMemory = new uint[96]; irqHandler = new InterruptHandler <InterruptRegister, InterruptSource>(IRQ); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.StartOfFrameDelimiter, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FifoP, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchDone, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.SrcMatchFound, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.FrameAccepted, 5); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxPktDone, 6); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag0, InterruptSource.RxMaskZero, 7); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxAckDone, 0); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.TxDone, 1); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.RfIdle, 2); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorManualInterrupt, 3); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorStop, 4); irqHandler.RegisterInterrupt(InterruptRegister.IrqFlag1, InterruptSource.CommandStrobeProcessorWait, 5); var matchedSourceIndex = new DoubleWordRegister(this); matchedSourceIndexField = matchedSourceIndex.DefineValueField(0, 8, FieldMode.Read | FieldMode.Write); var srcResMask = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcResMaskRegister, writeCallback: WriteSrcResMaskRegister); var srcExtendedAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSrcExtendedAddressPendingEnabledRegister, writeCallback: WriteSrcExtendedAddressPendingEnabledRegister); var srcShortAddressPendingEnabled = CreateRegistersGroup(3, this, 0, 8, name: "SrcShortAddressPendingEnabled", valueProviderCallback: ReadSrcShortAddressPendingEnabledRegister, writeCallback: WriteSrcShortAddressPendingEnabledRegister); var extAddress = CreateRegistersGroup(8, this, 0, 8, valueProviderCallback: i => extendedAddress.Bytes[i], writeCallback: (i, @new) => extendedAddress.SetByte((byte)@new, i)); panId = CreateRegistersGroup(2, this, 0, 8); var shortAddressRegister = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => shortAddress.Bytes[i], writeCallback: (i, @new) => shortAddress.SetByte((byte)@new, i)); var sourceExtendedAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceExtendedAddressEnableRegister, writeCallback: WriteSourceExtendedAddressEnableRegister); var sourceShortAddressEnable = CreateRegistersGroup(3, this, 0, 8, valueProviderCallback: ReadSourceShortAddressEnableRegister, writeCallback: WriteSourceShortAddressEnableRegister); var frameHandling0 = new DoubleWordRegister(this, 0x40); autoAck = frameHandling0.DefineFlagField(5); autoCrc = frameHandling0.DefineFlagField(6); appendDataMode = frameHandling0.DefineFlagField(7); var frameHandling1 = new DoubleWordRegister(this, 0x1); pendingOr = frameHandling1.DefineFlagField(2); var sourceAddressMatching = new DoubleWordRegister(this, 0x7); sourceAddressMatchingEnabled = sourceAddressMatching.DefineFlagField(0); autoPendEnabled = sourceAddressMatching.DefineFlagField(1); pendDataRequestOnly = sourceAddressMatching.DefineFlagField(2); var radioStatus0 = new DoubleWordRegister(this, 0x81).WithValueField(0, 8, FieldMode.Read); var radioStatus1 = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: ReadRadioStatus1Register); var rssiValidStatus = new DoubleWordRegister(this, 0x1).WithFlag(0, FieldMode.Read); var interruptMask = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterMask(InterruptRegisterHelper.GetMaskRegister(i), @new); }); var randomData = new DoubleWordRegister(this, 0).WithValueField(0, 2, FieldMode.Read, valueProviderCallback: _ => (uint)(random.Next() & 3)); var frameFiltering0 = new DoubleWordRegister(this, 0xD); frameFilterEnabled = frameFiltering0.DefineFlagField(0); isPanCoordinator = frameFiltering0.DefineFlagField(1); maxFrameVersion = frameFiltering0.DefineValueField(2, 2); var frameFiltering1 = new DoubleWordRegister(this, 0x78); acceptBeaconFrames = frameFiltering1.DefineFlagField(3); acceptDataFrames = frameFiltering1.DefineFlagField(4); acceptAckFrames = frameFiltering1.DefineFlagField(5); acceptMacCmdFrames = frameFiltering1.DefineFlagField(6); var rfData = new DoubleWordRegister(this, 0).WithValueField(0, 8, valueProviderCallback: _ => DequeueData(), writeCallback: (_, @new) => { EnqueueData((byte)@new); }); var interruptFlag = CreateRegistersGroup(2, this, 0, 8, valueProviderCallback: i => irqHandler.GetRegisterValue(InterruptRegisterHelper.GetValueRegister(i)), writeCallback: (i, @new) => { irqHandler.SetRegisterValue(InterruptRegisterHelper.GetValueRegister(i), @new); }); var commandStrobeProcessor = new DoubleWordRegister(this, 0).WithValueField(0, 8, FieldMode.Write, writeCallback: (_, @new) => { HandleSFRInstruction(@new); }); var addresses = new Dictionary <long, DoubleWordRegister> { { (uint)Register.RfData, rfData }, { (uint)Register.CommandStrobeProcessor, commandStrobeProcessor }, { (uint)Register.FrameFiltering0, frameFiltering0 }, { (uint)Register.FrameFiltering1, frameFiltering1 }, { (uint)Register.SourceAddressMatching, sourceAddressMatching }, { (uint)Register.FrameHandling0, frameHandling0 }, { (uint)Register.FrameHandling1, frameHandling1 }, { (uint)Register.RadioStatus0, radioStatus0 }, { (uint)Register.RadioStatus1, radioStatus1 }, { (uint)Register.RssiValidStatus, rssiValidStatus }, { (uint)Register.RandomData, randomData }, { (uint)Register.SourceAddressMatchingResult, matchedSourceIndex } }; RegisterGroup(addresses, (uint)Register.InterruptFlag, interruptFlag); RegisterGroup(addresses, (uint)Register.SourceExtendedAdressEnable, sourceExtendedAddressEnable); RegisterGroup(addresses, (uint)Register.SourceShortAddressEnable, sourceShortAddressEnable); RegisterGroup(addresses, (uint)Register.InterruptMask, interruptMask); RegisterGroup(addresses, (uint)Register.SourceAddressMatchingResultMask, srcResMask); RegisterGroup(addresses, (uint)Register.SourceExtendedAddressPendingEnabled, srcExtendedAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.SourceShortAddressPendingEnabled, srcShortAddressPendingEnabled); RegisterGroup(addresses, (uint)Register.ExtendedAddress, extAddress); RegisterGroup(addresses, (uint)Register.PanId, panId); RegisterGroup(addresses, (uint)Register.ShortAddressRegister, shortAddressRegister); registers = new DoubleWordRegisterCollection(this, addresses); Reset(); }
public 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); }
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; }
public void ShouldNotAllowIntersectingFields() { var localRegister = new DoubleWordRegister(null); localRegister.DefineValueField(1, 5); Assert.Catch<ArgumentException>(() => localRegister.DefineValueField(0, 2)); }
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; }
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; }
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; }
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); } }
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); }
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); }
public void ShouldNotAcceptNegativeFields() { var localRegister = new DoubleWordRegister(null); Assert.Catch<ArgumentException>(() => localRegister.DefineEnumField<TwoBitEnum>(0, -1)); Assert.Catch<ArgumentException>(() => localRegister.DefineValueField(0, -1)); }
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(); }
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]); } }
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."); } }); }