Exemple #1
0
 public IMXRT_GPIO(Machine machine) : base(machine, NumberOfPins)
 {
     locker            = new object();
     IRQ               = new GPIO();
     registers         = new DoubleWordRegisterCollection(this, BuildRegisterMap());
     data              = new bool[NumberOfPins];
     directionOutNotIn = new bool[NumberOfPins];
     interruptEnabled  = new bool[NumberOfPins];
     interruptRequest  = new bool[NumberOfPins];
     edgeSelect        = new bool[NumberOfPins];
     interruptConfig   = new InterruptConfig[NumberOfPins];
 }
Exemple #2
0
        public EOSS3_IntrCtrl(Machine machine) : base(machine, NumberOfGPIOs)
        {
            gpioManager       = new GPIOInterruptManager(GPIOIrq, State);
            externalIrqConfig = new [] { SRAMIrq, UARTIrq, TimerIrq, WatchdogIrq,
                                         WatchdogResetIrq, BusTimeoutIrq, FPUIrq, PacketFIFOIrq, ReservedI2SIrq, ReservedAudioIrq,
                                         SPIMasterIrq, ConfigDMAIrq, PMUTimerIrq, ADCIrq, RTCIrq, ResetIrq, FFE0Irq, WatchdogFFEIrq,
                                         ApBootIrq, LDO30Irq, LDO50Irq, ReservedSRAMIrq, LPSDIrq, DMicIrq }.Select((x, i) => new InterruptConfig(x, this, i)).ToArray();

            DebugHelper.Assert(externalIrqConfig.Length == NumberOfOtherInterrupts);

            // SoftwareIrq2 is connected to nvic0, SoftwareIrq1 is connected to nvic1
            softwareInterrupt2Config = new InterruptConfig(SoftwareIrq2, this, 0);
            softwareInterrupt1Config = new InterruptConfig(SoftwareIrq1, this, 1);

            var gpioReg         = new DoubleWordRegister(this);
            var gpioRawReg      = new DoubleWordRegister(this);
            var gpioTypeReg     = new DoubleWordRegister(this);
            var gpioPolarityReg = new DoubleWordRegister(this);
            var gpioEnableM4Reg = new DoubleWordRegister(this);

            for (var j = 0; j < NumberOfGPIOs; j++)
            {
                var i = j;
                gpioManager.PinDirection[i] = GPIOInterruptManager.Direction.Input | GPIOInterruptManager.Direction.Output;
                gpioReg.DefineFlagField(i, writeCallback: (_, value) => { if (value)
                                                                          {
                                                                              gpioManager.ClearInterrupt(i);
                                                                          }
                                        },
                                        valueProviderCallback: _ => gpioManager.ActiveInterrupts.ElementAt(i),
                                        name: $"GPIO_{i}_INTR");
                gpioRawReg.DefineFlagField(i, FieldMode.Read, valueProviderCallback: _ => State[i], name: $"GPIO_{i}_INTR_RAW");
                gpioTypeReg.DefineFlagField(i, writeCallback: (_, value) => gpioManager.InterruptType[i] = UpdateGPIOSettings(gpioManager.InterruptType[i], value, null),
                                            valueProviderCallback: _ =>
                                            gpioManager.InterruptType[i] == GPIOInterruptManager.InterruptTrigger.RisingEdge ||
                                            gpioManager.InterruptType[i] == GPIOInterruptManager.InterruptTrigger.FallingEdge,
                                            name: $"GPIO_{i}_INTR_TYPE");
                gpioPolarityReg.DefineFlagField(i, writeCallback: (_, value) => gpioManager.InterruptType[i] = UpdateGPIOSettings(gpioManager.InterruptType[i], null, value),
                                                valueProviderCallback: _ =>
                                                gpioManager.InterruptType[i] == GPIOInterruptManager.InterruptTrigger.RisingEdge ||
                                                gpioManager.InterruptType[i] == GPIOInterruptManager.InterruptTrigger.ActiveHigh,
                                                name: $"GPIO_{i}_INTR_POL");
                gpioEnableM4Reg.DefineFlagField(i, writeCallback: (_, value) => gpioManager.InterruptEnable[i] = value, valueProviderCallback: _ => gpioManager.InterruptEnable[i], name: $"GPIO_{i}_INTR_EN_M4");
            }

            var otherInterruptsReg          = new DoubleWordRegister(this);
            var otherInterruptsEnabledM4Reg = new DoubleWordRegister(this);

            for (var j = 0; j < NumberOfOtherInterrupts; ++j)
            {
                var i = j;
                otherInterruptsReg.DefineFlagField(i, valueProviderCallback: _ => externalIrqConfig[i].Active,
                                                   writeCallback: (_, value) => { if (value)
                                                                                  {
                                                                                      externalIrqConfig[i].Active = false;
                                                                                  }
                                                   }, name: $"OTHER_INTR[{i}]");

                externalIrqConfig[i].EnabledField = otherInterruptsEnabledM4Reg.DefineFlagField(i, changeCallback: (_, __) => externalIrqConfig[i].Update(), name: $"OTHER_INTR_EN_M4[{i}]");
            }
            var regs = new Dictionary <long, DoubleWordRegister>
            {
                { (long)Registers.GPIOInterrupt, gpioReg },