Exemplo n.º 1
0
        public EFR32_I2CController(Machine machine) : base(machine)
        {
            IRQ               = new GPIO();
            txBuffer          = new Queue <byte>();
            rxBuffer          = new Queue <byte>();
            interruptsManager = new InterruptManager <Interrupt>(this);

            var map = new Dictionary <long, DoubleWordRegister> {
                { (long)Registers.ReceiveBufferData, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Read, name: "RXDATA", valueProviderCallback: _ =>
                    {
                        var result = rxBuffer.Dequeue();
                        interruptsManager.SetInterrupt(Interrupt.ReceiveDataValid, rxBuffer.Any());
                        return(result);
                    }) },
                { (long)Registers.ReceiveBufferDataPeek, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Read, name: "RXDATAP", valueProviderCallback: _ => rxBuffer.Peek()) },
                { (long)Registers.Command, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Write, name: "COMMAND", writeCallback: (_, v) => HandleCommand((Command)v)) },
                { (long)Registers.TransmitBufferData, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Write, name: "TXDATA", writeCallback: (_, v) => LoadTxData((byte)v)) }
            };

            map.Add((long)Registers.InterruptFlag, interruptsManager.GetInterruptFlagRegister <DoubleWordRegister>());
            map.Add((long)Registers.InterruptEnable, interruptsManager.GetInterruptEnableRegister <DoubleWordRegister>());
            map.Add((long)Registers.InterruptFlagSet, interruptsManager.GetInterruptFlagRegister <DoubleWordRegister>());
            map.Add((long)Registers.InterruptFlagClear, interruptsManager.GetInterruptClearRegister <DoubleWordRegister>());

            registers = new DoubleWordRegisterCollection(this, map);
        }
        public EFR32_USART(Machine machine, uint clockFrequency = 19000000) : base(machine)
        {
            TransmitIRQ = new GPIO();
            ReceiveIRQ  = new GPIO();

            interruptsManager = new InterruptManager <Interrupt>(this);

            var registersMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.Control, new DoubleWordRegister(this)
                  .WithEnumField(0, 1, out operationModeField, name: "SYNC")
                  .WithEnumField(5, 2, out oversamplingField, name: "OVS") },
                { (long)Registers.FrameFormat, new DoubleWordRegister(this, 0x1005)
                  .WithEnumField(8, 2, out parityBitModeField, name: "PARITY")
                  .WithEnumField(12, 2, out stopBitsModeField, name: "STOPBITS") },
                { (long)Registers.Command, new DoubleWordRegister(this)
                  .WithFlag(11, FieldMode.Set, writeCallback: (_, newValue) => { if (newValue)
                                                                                 {
                                                                                     ClearBuffer();
                                                                                 }
                            }, name: "CLEARRX") },
                { (long)Registers.Status, new DoubleWordRegister(this, 0x2040)
                  .WithFlag(5, out transferCompleteFlag, FieldMode.Read, name: "TXC")
                  .WithFlag(7, out receiveDataValidFlag, FieldMode.Read, name: "RXDATAV") },
                { (long)Registers.ClockControl, new DoubleWordRegister(this)
                  .WithValueField(3, 20, out fractionalClockDividerField, name: "DIV") },
                { (long)Registers.RxBufferData, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Read, name: "RXDATA", valueProviderCallback: (_) => ReadBuffer()) },
                { (long)Registers.TxBufferData, new DoubleWordRegister(this)
                  .WithValueField(0, 8, FieldMode.Write, writeCallback: (_, v) => HandleTxBufferData((byte)v)) },
            };

            registersMap.Add((long)Registers.InterruptFlag, interruptsManager.GetInterruptFlagRegister <DoubleWordRegister>());
            registersMap.Add((long)Registers.InterruptEnable, interruptsManager.GetInterruptEnableRegister <DoubleWordRegister>());
            registersMap.Add((long)Registers.InterruptFlagSet, interruptsManager.GetInterruptSetRegister <DoubleWordRegister>());
            registersMap.Add((long)Registers.InterruptFlagClear, interruptsManager.GetInterruptClearRegister <DoubleWordRegister>());

            registers = new DoubleWordRegisterCollection(this, registersMap);

            uartClockFrequency = clockFrequency;
        }
Exemplo n.º 3
0
        public EFR32xg13FlashController(Machine machine, MappedMemory flash)
        {
            this.flash = flash;
            if (flash.Size < PageNumber * PageSize)
            {
                throw new ConstructionException($"Provided flash size is too small, expected 0x{PageNumber * PageSize:X} bytes, got 0x{flash.Size:X} bytes");
            }
            interruptsManager = new InterruptManager <Interrupt>(this);

            var registersMap = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.Control, new DoubleWordRegister(this, 0x1)
                  .WithTaggedFlag("ADDRFAULTEN", 0)
                  .WithTaggedFlag("CLKDISFAULTEN", 1)
                  .WithTaggedFlag("PWRUPONDEMAND", 2)
                  .WithTaggedFlag("IFCREADCLEAR", 3)
                  .WithTaggedFlag("TIMEOUTFAULTEN", 4)
                  .WithReservedBits(5, 3)
                  .WithIgnoredBits(8, 1)   // this is written by emlib as an errata
                  .WithReservedBits(9, 23) },
                { (long)Registers.ReadControl, new DoubleWordRegister(this, 0x1000100)
                  .WithReservedBits(0, 3)
                  .WithTaggedFlag("IFCDIS", 3)
                  .WithTaggedFlag("AIDIS", 4)
                  .WithTaggedFlag("ICCDIS", 5)
                  .WithReservedBits(6, 2)
                  .WithTaggedFlag("PREFETCH", 8)
                  .WithTaggedFlag("USEHPROT", 9)
                  .WithReservedBits(10, 14)
                  .WithTag("MODE", 24, 2)
                  .WithReservedBits(26, 2)
                  .WithTaggedFlag("SCBTP", 28)
                  .WithReservedBits(29, 3) },
                { (long)Registers.WriteControl, new DoubleWordRegister(this)
                  .WithFlag(0, out isWriteEnabled, name: "WREN")
                  .WithTaggedFlag("IRQERASEABORT", 1)
                  .WithReservedBits(2, 30) },
                { (long)Registers.WriteCommand, new DoubleWordRegister(this)
                  .WithFlag(0, FieldMode.Toggle, changeCallback: (_, __) => UpdateWriteAddress(), name: "LADDRIM")
                  .WithFlag(1, FieldMode.Toggle, changeCallback: (_, __) => ErasePage(), name: "ERASEPAGE")
                  .WithTaggedFlag("WRITEEND", 2)
                  .WithFlag(3, FieldMode.Toggle, changeCallback: (_, __) => WriteWordToFlash(), name: "WRITEONCE")
                  .WithTaggedFlag("WRITETRIG", 4)
                  .WithTaggedFlag("ERASEABORT", 5)
                  .WithReservedBits(6, 2)
                  .WithTaggedFlag("ERASEMAIN0", 8)
                  .WithReservedBits(9, 3)
                  .WithTaggedFlag("CLEARWDATA", 12)
                  .WithReservedBits(13, 19) },
                { (long)Registers.AddressBuffer, new DoubleWordRegister(this)
                  .WithValueField(0, 32, out writeAddress, name: "ADDRB") },
                { (long)Registers.WriteData, new DoubleWordRegister(this)
                  .WithValueField(0, 32, out writeData, writeCallback: (_, __) => writeDataReady.Value = false, name: "WDATA") },
                { (long)Registers.Status, new DoubleWordRegister(this, 0x8)
                  .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => false, name: "BUSY")
                  .WithTaggedFlag("LOCKED", 1)
                  .WithFlag(2, out invalidAddress, FieldMode.Read, name: "INVADDR")
                  // we assume a single-word buffer
                  .WithFlag(3, out writeDataReady, FieldMode.Read, name: "WDATAREADY")
                  .WithTaggedFlag("WORDTIMEOUT", 4)
                  .WithTaggedFlag("ERASEABORT", 5)
                  .WithTaggedFlag("PCRUNNING", 6)
                  .WithReservedBits(7, 17)
                  .WithTag("WDATAVALID", 24, 4)
                  .WithTag("CLEARWDATA", 28, 4) },
                { (long)Registers.InterruptFlag, interruptsManager.GetMaskedInterruptFlagRegister <DoubleWordRegister>() },
                { (long)Registers.InterruptFlagSet, interruptsManager.GetInterruptSetRegister <DoubleWordRegister>() },
                { (long)Registers.InterruptFlagClear, interruptsManager.GetInterruptClearRegister <DoubleWordRegister>() },
                { (long)Registers.InterruptEnable, interruptsManager.GetInterruptEnableRegister <DoubleWordRegister>() },
                { (long)Registers.ConfigurationLock, new DoubleWordRegister(this)
                  .WithValueField(0, 16,
                                  writeCallback: (_, value) => { isLocked = value != UnlockPattern; },
                                  valueProviderCallback: _ => isLocked ? 1u : 0u,
                                  name: "LOCKKEY")
                  .WithReservedBits(16, 16) },
                { (long)Registers.Command, new DoubleWordRegister(this)
                  .WithTaggedFlag("PWRUP", 0)
                  .WithReservedBits(1, 31) },
            };

            registers = new DoubleWordRegisterCollection(this, registersMap);

            //calling Reset to fill the memory with 0xFFs
            Reset();
        }