예제 #1
0
        public GigaDevice_GD25LQ(MappedMemory underlyingMemory)
        {
            var registerMap = new Dictionary <long, ByteRegister>
            {
                { (long)Register.StatusLow, new ByteRegister(this)
                  .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => writeInProgress, name: "Write in progress")
                  .WithFlag(1, FieldMode.Read, valueProviderCallback: _ => writeEnableLatch, name: "Write enable latch")
                  .WithTag("Block protect 0", 2, 1)
                  .WithTag("Block protect 1", 3, 1)
                  .WithTag("Block protect 2", 4, 1)
                  .WithTag("Block protect 3", 5, 1)
                  .WithTag("Block protect 4", 6, 1)
                  .WithTag("Status register protect 0", 7, 1) },
                { (long)Register.StatusHigh, new ByteRegister(this)
                  .WithTag("Status register protect 1", 0, 1)
                  .WithFlag(1, out quadEnable, name: "Quad enable")
                  .WithTag("SUS2", 2, 1)
                  .WithTag("LB1", 3, 1)
                  .WithTag("LB2", 4, 1)
                  .WithTag("LB3", 5, 1)
                  .WithTag("CMP", 6, 1)
                  .WithTag("SUS1", 7, 1) }
            };

            registers             = new ByteRegisterCollection(this, registerMap);
            this.underlyingMemory = underlyingMemory;
        }
        public static ByteRegister Define(this IConvertible o, ByteRegisterCollection c, byte resetValue = 0, string name = "")
        {
            if (!o.GetType().IsEnum)
            {
                throw new ArgumentException("This method should be called on enumerated type");
            }

            return(c.DefineRegister(Convert.ToInt64(o), resetValue));
        }
        public I2CPeripheralBase(int addressLength)
        {
            this.addressLength = addressLength;

            cache = new SimpleCache();
            RegistersCollection = new ByteRegisterCollection(this);
            DefineRegisters();

            Reset();
        }
예제 #4
0
        public MPFS_I2C(Machine machine) : base(machine)
        {
            transferBuffer = new Queue <byte>();
            receiveBuffer  = new Queue <byte>();
            IRQ            = new GPIO();

            RegistersCollection = new ByteRegisterCollection(this);
            DefineRegisters();

            Reset();
        }
예제 #5
0
        public MAX3421E(Machine machine) : base(machine)
        {
            IRQ          = new GPIO();
            setupQueue   = new Queue <byte>();
            receiveQueue = new Queue <byte>();
            sendQueue    = new Queue <byte>();
            bumper       = machine.ObtainManagedThread(GenerateFrameInterrupt, BumpsPerSecond);

            RegistersCollection = new ByteRegisterCollection(this);

            DefineRegisters();
        }
예제 #6
0
        private void CreateRegisters()
        {
            var registerMap = new Dictionary <long, ByteRegister>
            {
                { (long)Registers.ErrorWPC, new ByteRegister(this)
                  .WithTaggedFlag("Bad block detected", 7)
                  .WithTaggedFlag("Uncorrectable ECC error", 6)
                  .WithReservedBits(5, 1)
                  .WithTaggedFlag("ID found", 4)
                  .WithReservedBits(3, 1)
                  .WithTaggedFlag("Command completed", 2)
                  .WithTaggedFlag("Track 000 not found", 1)
                  .WithTaggedFlag("DAM not found", 0) },
                //Four following registers are used only for device enumeration purposes.
                //They must preserve values, otherwise the firmware will assume that selected device is not present.
                { (long)Registers.SectorCount, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Sector count") },
                { (long)Registers.SectorNumber, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Sector number") },
                { (long)Registers.CylinderLow, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Cyliner Low") },
                { (long)Registers.CylinderHigh, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Cylinder High") },
                { (long)Registers.DriveHead, new ByteRegister(this, 0xA0)
                  .WithValueField(0, 3, name: "Head select bits")
                  .WithFlag(4, writeCallback: (_, flag) => SelectDevice(flag ? Device.Slave : Device.Master), name: "Drive select")
                  .WithFlag(5, FieldMode.Read, name: "Fixed bit 1")
                  .WithFlag(6, FieldMode.Read, name: "Fixed bit 2")
                  .WithFlag(7, FieldMode.Read, name: "Fixed bit 3") },
                { (long)Registers.StatusCommand, new ByteRegister(this, 0x50)
                  .WithValueField(0, 8, writeCallback: (_, value) => ExecuteCommand((Command)value),
                                  valueProviderCallback: _ =>
                    {
                        return((packetTransmission || (selectedDevice?.DataReady ?? false)) ?
                               (uint)StatusCodes.DataRequest : 0);
                    }, name: "Command") },
            };

            var dataRegistersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.DataRegister, new WordRegister(this)
                  .WithValueField(0, 16, writeCallback: (_, value) => WriteData((ushort)value),
                                  valueProviderCallback: _ => ReadData(), name: "Data") },
            };

            registers     = new ByteRegisterCollection(this, registerMap);
            dataRegisters = new WordRegisterCollection(this, dataRegistersMap);
        }
예제 #7
0
        public PSE_USB(Machine machine, ControllerMode mode = ControllerMode.Host) : base(machine)
        {
            this.mode = mode;

            addressToDeviceCache = new TwoWayDictionary <byte, IUSBDevice>();

            fifoFromDeviceToHost         = new Queue <byte> [NumberOfEndpoints];
            fifoFromHostToDevice         = new Queue <byte> [NumberOfEndpoints];
            receiveDeviceAddress         = new IValueRegisterField[NumberOfEndpoints];
            transmitDeviceAddress        = new IValueRegisterField[NumberOfEndpoints];
            requestInTransaction         = new IFlagRegisterField[NumberOfEndpoints];
            transmitTargetEndpointNumber = new IValueRegisterField[NumberOfEndpoints];
            receiveTargetEndpointNumber  = new IValueRegisterField[NumberOfEndpoints];

            for (var i = 0; i < NumberOfEndpoints; i++)
            {
                fifoFromDeviceToHost[i] = new Queue <byte>();
                fifoFromHostToDevice[i] = new Queue <byte>();
            }

            MainIRQ = new GPIO();
            DmaIRQ  = new GPIO();

            byteRegisters       = new ByteRegisterCollection(this);
            wordRegisters       = new WordRegisterCollection(this);
            doubleWordRegisters = new DoubleWordRegisterCollection(this);

            var gate = new GPIOGate(MainIRQ);

            usbInterruptsManager = new InterruptManager <UsbInterrupt>(this, gate.GetGPIO(), "main");
            txInterruptsManager  = new InterruptManager <TxInterrupt>(this, gate.GetGPIO(), "main");
            rxInterruptsManager  = new InterruptManager <RxInterrupt>(this, gate.GetGPIO(), "main");

            DefineCommonRegisters();
            DefineIndexedRegisters();
            DefineFifoRegisters();
            DefineControlAndStatusRegisters();
            DefineNonIndexedEndpointControlAndStatusRegisters();
            DefineMultipointControlAndStatusRegisters();

            ResetInterrupts();
        }
예제 #8
0
        public PAC1934()
        {
            channels = new Channel[ChannelCount];
            for (var i = 0; i < ChannelCount; ++i)
            {
                channels[i] = new Channel(this, i);
            }

            var registersMap = new Dictionary <long, ByteRegister>();

            registersMap.Add(
                (long)Registers.ChannelDisable,
                new ByteRegister(this)
                .WithReservedBits(0, 1)
                .WithFlag(1, out skipInactiveChannels, name: "NO_SKIP")
                .WithTag("BYTE_COUNT", 2, 1)
                .WithTag("TIMEOUT", 3, 1)
                .WithFlag(4, out channels[3].IsChannelDisabled, name: "CH4")
                .WithFlag(5, out channels[2].IsChannelDisabled, name: "CH3")
                .WithFlag(6, out channels[1].IsChannelDisabled, name: "CH2")
                .WithFlag(7, out channels[0].IsChannelDisabled, name: "CH1")
                );
            registersMap.Add(
                (long)Registers.ProductId,
                new ByteRegister(this)
                .WithValueField(0, 8, FieldMode.Read, valueProviderCallback: (_) => ProductId)
                );
            registersMap.Add(
                (long)Registers.ManufacturerId,
                new ByteRegister(this)
                .WithValueField(0, 8, FieldMode.Read, valueProviderCallback: (_) => ManufacturerId)
                );
            registersMap.Add(
                (long)Registers.RevisionId,
                new ByteRegister(this)
                .WithValueField(0, 8, FieldMode.Read, valueProviderCallback: (_) => RevisionId)
                );

            registers = new ByteRegisterCollection(this, registersMap);
        }
예제 #9
0
 public ST_I2CSensorBase()
 {
     RegistersCollection = new ByteRegisterCollection(this);
     DefineRegisters();
 }
        public OpenCoresI2C(Machine machine) : base(machine)
        {
            dataToSlave   = new Queue <byte>();
            dataFromSlave = new Queue <byte>();

            var commonRegistersMap = new Dictionary <long, ByteRegister>()
            {
                { (long)Registers.Control, new ByteRegister(this)
                  .WithFlag(7, out enabled)
                  .WithTag("Interrupt enable", 6, 1)
                  .WithReservedBits(0, 6) }
            };

            var readRegistersMap = new Dictionary <long, ByteRegister>(commonRegistersMap)
            {
                { (long)Registers.Receive, new ByteRegister(this)
                  .WithValueField(0, 8, out receiveBuffer, FieldMode.Read) },

                { (long)Registers.Status, new ByteRegister(this)
                  .WithFlag(7, out receivedAckFromSlaveNegated, FieldMode.Read)
                  .WithFlag(6, FieldMode.Read, valueProviderCallback: _ => false, name: "Busy")
                  .WithFlag(5, FieldMode.Read, valueProviderCallback: _ => false, name: "Arbitration lost")
                  .WithReservedBits(2, 3)
                  .WithFlag(1, FieldMode.Read, valueProviderCallback: _ => false, name: "Transfer in progress")
                  .WithFlag(0, out interruptFlag, FieldMode.Read) }
            };

            var writeRegistersMap = new Dictionary <long, ByteRegister>(commonRegistersMap)
            {
                { (long)Registers.Transmit, new ByteRegister(this)
                  .WithValueField(0, 8, out transmitBuffer, FieldMode.Write) },

                { (long)Registers.Command, new ByteRegister(this)
                  .WithFlag(7, out generateStartCondition, FieldMode.Write)
                  .WithFlag(6, out generateStopCondition, FieldMode.Write)
                  .WithFlag(5, out readFromSlave, FieldMode.Write)
                  .WithFlag(4, out writeToSlave, FieldMode.Write)
                  .WithTag("ACK", 3, 1)
                  .WithReservedBits(1, 2)
                  .WithFlag(0, FieldMode.Write, writeCallback: (_, __) => interruptFlag.Value = false)
                  .WithWriteCallback((_, __) =>
                    {
                        if (!enabled.Value)
                        {
                            this.Log(LogLevel.Warning, "Writing to a disabled controller.");
                            return;
                        }

                        if (writeToSlave.Value)
                        {
                            writeToSlave.Value = false;
                            HandleWriteToSlaveCommand();
                        }

                        if (readFromSlave.Value)
                        {
                            readFromSlave.Value = false;
                            HandleReadFromSlaveCommand();
                        }

                        if (generateStopCondition.Value)
                        {
                            generateStopCondition.Value = false;
                            if (!transactionInProgress)
                            {
                                this.Log(LogLevel.Warning, "Asked to generate STOP signal, but no START signal has been recently generated");
                                return;
                            }

                            SendDataToSlave();
                            transactionInProgress = false;
                        }
                    }) }
            };

            readRegisters  = new ByteRegisterCollection(this, readRegistersMap);
            writeRegisters = new ByteRegisterCollection(this, writeRegistersMap);
        }
예제 #11
0
        public K6xF_MCG()
        {
            var registersMap = new Dictionary <long, ByteRegister>
            {
                { (long)Registers.Control1, new ByteRegister(this)
                  .WithTaggedFlag("IREFSTEN", 0)
                  .WithTaggedFlag("IRCLKEN", 1)
                  .WithTaggedFlag("IREFS", 2)
                  .WithTag("FRDIV", 3, 3)
                  .WithEnumField(6, 2, out clockSource, name: "CLKS") },
                { (long)Registers.Control2, new ByteRegister(this)
                  .WithTaggedFlag("IRCS", 0)
                  .WithTaggedFlag("LP", 1)
                  .WithTaggedFlag("EREFS", 2)
                  .WithTaggedFlag("HGO", 3)
                  .WithTag("RANGE", 4, 2)
                  .WithTaggedFlag("FCFTRIM", 6)
                  .WithTaggedFlag("LOCRE0", 7) },
                { (long)Registers.Control5, new ByteRegister(this)
                  .WithTag("PRDIV0", 0, 5)
                  .WithTaggedFlag("PLLSTEN0", 5)
                  .WithEnumField(6, 1, out mcgPllStatus, name: "PLLCLKEN0")
                  .WithReservedBits(7, 1) },
                { (long)Registers.Control6, new ByteRegister(this)
                  .WithTag("VDIV0", 0, 5)
                  .WithTaggedFlag("CME0", 5)
                  .WithEnumField(6, 1, out pllSelected, name: "PLLS")
                  .WithTaggedFlag("LOLIE0", 7) },
                { (long)Registers.Status, new ByteRegister(this)
                  .WithTaggedFlag("IRCST", 0)
                  .WithTaggedFlag("OSCINIT0", 1)
                  .WithValueField(2, 2, FieldMode.Read, valueProviderCallback: _ =>
                    {
                        switch (clockSource.Value)
                        {
                        case ClockSourceValues.External:
                            return((uint)ClockModeStatusValues.ExternalClock);

                        case ClockSourceValues.Internal:
                            return((uint)ClockModeStatusValues.InternalClock);

                        case ClockSourceValues.Either:
                            if (pllSelected.Value == PLLSelectValues.FLLSelected)
                            {
                                return((uint)ClockModeStatusValues.FLL);
                            }
                            return((uint)ClockModeStatusValues.PLL);

                        default:
                            throw new ArgumentException("Unhandled clock source");
                        }
                    }, name: "LOLS0")
                  .WithTaggedFlag("IREFST", 4)
                  .WithFlag(5, FieldMode.Read, valueProviderCallback: _ =>
                    {
                        return(PLLSelectValues.PLLSelected == pllSelected.Value);
                    }, name: "PLLST")
                  .WithFlag(6, FieldMode.Read, valueProviderCallback: _ =>
                    {
                        return(MCGPLLClockStatusValues.Active == mcgPllStatus.Value);
                    }, name: "LOCK0")
                  .WithTaggedFlag("LOLS0", 7) }
            };

            registers = new ByteRegisterCollection(this, registersMap);
        }