Esempio 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;
        }