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]; }
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 },