1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Antmicro.Renode.Core;
8 using Antmicro.Renode.Core.Structure.Registers;
9 using Antmicro.Renode.Logging;
10 using Antmicro.Renode.Peripherals.Bus;
11 using System;
12 
13 namespace Antmicro.Renode.Peripherals.GPIOPort
14 {
15     [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.WordToDoubleWord)]
16     public class AmbiqApollo4_GPIO : BaseGPIOPort, IProvidesRegisterCollection<DoubleWordRegisterCollection>, IDoubleWordPeripheral, IKnownSize
17     {
AmbiqApollo4_GPIO(IMachine machine)18         public AmbiqApollo4_GPIO(IMachine machine) : base(machine, NumberOfPins)
19         {
20             RegistersCollection = new DoubleWordRegisterCollection(this);
21 
22             DefineRegisters();
23             Reset();
24         }
25 
Reset()26         public override void Reset()
27         {
28             base.Reset();
29             RegistersCollection.Reset();
30 
31             outputPinValues.Initialize();
32             tristatePinOutputEnabled.Initialize();
33         }
34 
OnGPIO(int number, bool value)35         public override void OnGPIO(int number, bool value)
36         {
37             if(!CheckPinNumber(number))
38             {
39                 return;
40             }
41 
42             var oldState = State[number];
43             base.OnGPIO(number, value);
44 
45             if(inputEnable[number].Value && oldState != value)
46             {
47                 HandlePinStateChangeInterrupt(number, risingEdge: value);
48             }
49         }
50 
ReadDoubleWord(long offset)51         public uint ReadDoubleWord(long offset)
52         {
53             return RegistersCollection.Read(offset);
54         }
55 
WriteDoubleWord(long offset, uint value)56         public void WriteDoubleWord(long offset, uint value)
57         {
58             if(offset >= (long)Registers.PinConfiguration0 && offset <= (long)Registers.PinConfiguration127)
59             {
60                 if(padKey.Value != PadKeyUnlockValue)
61                 {
62                     this.Log(LogLevel.Warning, "Tried to change pin configuration register which is locked. PADKEY value: {0:X}", padKey.Value);
63                     return;
64                 }
65             }
66             RegistersCollection.Write(offset, value);
67         }
68 
69         public long Size => 0x440;
70 
71         public GPIO McuN0IrqBank0 => irq[(int)IrqType.McuN0IrqBank0];
72         public GPIO McuN0IrqBank1 => irq[(int)IrqType.McuN0IrqBank1];
73         public GPIO McuN0IrqBank2 => irq[(int)IrqType.McuN0IrqBank2];
74         public GPIO McuN0IrqBank3 => irq[(int)IrqType.McuN0IrqBank3];
75         public GPIO McuN1IrqBank0 => irq[(int)IrqType.McuN1IrqBank0];
76         public GPIO McuN1IrqBank1 => irq[(int)IrqType.McuN1IrqBank1];
77         public GPIO McuN1IrqBank2 => irq[(int)IrqType.McuN1IrqBank2];
78         public GPIO McuN1IrqBank3 => irq[(int)IrqType.McuN1IrqBank3];
79 
80         public DoubleWordRegisterCollection RegistersCollection { get; }
81 
DefineRegisters()82         private void DefineRegisters()
83         {
84             Registers.PinConfiguration0.DefineMany(this, NumberOfPins, (register, regIdx) =>
85             {
86                 register
87                     .WithValueField(0, 4, name: $"FUNCSEL{regIdx} - Function select for GPIO pin {regIdx}")
88                     .WithFlag(4, out inputEnable[regIdx], name: $"INPEN{regIdx} - Input enable for GPIO {regIdx}",
89                         changeCallback: (_, newValue) => { if(State[regIdx]) HandlePinStateChangeInterrupt(regIdx, risingEdge: newValue); })
90                     .WithFlag(5, out readZero[regIdx], name: $"RDZERO{regIdx} - Return 0 for read data on GPIO {regIdx}")
91                     .WithEnumField(6, 2, out interruptMode[regIdx], name: $"IRPTEN{regIdx} - Interrupt enable for GPIO {regIdx}")
92                     .WithEnumField(8, 2, out ioMode[regIdx], name: $"OUTCFG{regIdx} - Pin IO mode selection for GPIO pin {regIdx}",
93                         changeCallback: (_, __) => UpdateOutputPinState(regIdx))
94                     .WithWriteCallback((_, __) =>
95                     {
96                         this.Log(LogLevel.Noisy, "Pin #{0} configured to IO mode {1}, input enable: {2}", regIdx, ioMode[regIdx].Value, inputEnable[regIdx].Value);
97                     });
98 
99                 if(regIdx < FirstVirtualPinIndex)
100                 {
101                     register
102                         .WithEnumField<DoubleWordRegister, DriveStrength>(10, 2, name: $"DS{regIdx} - Drive strength selection for GPIO {regIdx}")
103                         .WithFlag(12, name: $"SR{regIdx} - Configure the slew rate")
104                         .WithEnumField<DoubleWordRegister, PullUpDownConfiguration>(13, 3, name: $"PULLCFG30 - Pullup/Pulldown configuration for GPIO {regIdx}")
105                         .WithEnumField<DoubleWordRegister, ChipSelectConfiguration>(16, 6, name: $"NCESRC{regIdx} - IOMSTR/MSPI N Chip Select {regIdx}, DISP control signals DE, CSX, and CS")
106                         .WithEnumField<DoubleWordRegister, PolarityConfiguration>(22, 1, name: $"NCEPOL{regIdx} - Polarity select for NCE for GPIO {regIdx}")
107                         .WithReservedBits(23, 2)
108                         .WithFlag(25, name: $"VDDPWRSWEN{regIdx} - VDD power switch enable")
109                         .WithFlag(26, name: $"FIEN{regIdx} - Force input enable active regardless of function selected")
110                         .WithFlag(27, name: $"FOEN{regIdx} - Force output enable active regardless of function selected")
111                         .WithReservedBits(28, 4);
112                 }
113                 else
114                 {
115                     register.WithReservedBits(10, 22);
116                 }
117             }, resetValue: 0x3 /* FUNCSEL: GPIO */);
118 
119             Registers.OutputWrite0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
120             {
121                 register.WithFlags(0, PinsPerBank, name: $"WT{regIdx} - GPIO Output {regIdx}", writeCallback: (bitIdx, _, value) =>
122                 {
123                     var pinIdx = regIdx * PinsPerBank + bitIdx;
124 
125                     // Let's only call the method if the pins value is really changed.
126                     if(outputPinValues[pinIdx] != value)
127                     {
128                         SetOutputPinValue(pinIdx, value);
129                     }
130                 }, valueProviderCallback: (bitIdx, _) =>
131                 {
132                     var pinIdx = regIdx * PinsPerBank + bitIdx;
133                     return outputPinValues[pinIdx];
134                 });
135             });
136 
137             Registers.OutputSet0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
138             {
139                 register.WithFlags(0, PinsPerBank, name: $"WTS{regIdx} - GPIO Output Set {regIdx}", writeCallback: (bitIdx, _, value) =>
140                 {
141                     if(value)
142                     {
143                         SetOutputPinValue(regIdx * PinsPerBank + bitIdx, true);
144                     }
145                 });
146             });
147 
148             Registers.OutputClear0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
149             {
150                 register.WithFlags(0, PinsPerBank, name: $"WTC{regIdx} - GPIO Output Clear {regIdx}", writeCallback: (bitIdx, _, value) =>
151                 {
152                     if(value)
153                     {
154                         SetOutputPinValue(regIdx * PinsPerBank + bitIdx, false);
155                     }
156                 });
157             });
158 
159             Registers.GPIOOutputEnable0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
160             {
161                 register.WithFlags(0, PinsPerBank, name: $"EN{regIdx} - GPIO Enable {regIdx}",
162                     valueProviderCallback: (bitIdx, _) => tristatePinOutputEnabled[regIdx * PinsPerBank + bitIdx],
163                     writeCallback: (bitIdx, _, value) =>
164                     {
165                         EnableTristatePinOutputState(regIdx * PinsPerBank + bitIdx, value);
166                     });
167             });
168 
169             Registers.GPIOOutputEnableSet0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
170             {
171                 register.WithFlags(0, PinsPerBank, name: $"ENS{regIdx} - GPIO Enable Set {regIdx}",
172                     valueProviderCallback: (bitIdx, _) => tristatePinOutputEnabled[regIdx * PinsPerBank + bitIdx],
173                     writeCallback: (bitIdx, _, value) =>
174                     {
175                         if(!value)
176                         {
177                             return;
178                         }
179 
180                         EnableTristatePinOutputState(regIdx * PinsPerBank + bitIdx, true);
181                     });
182             });
183 
184             Registers.GPIOOutputEnableClear0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
185             {
186                 register.WithFlags(0, PinsPerBank, name: $"ENC{regIdx} - GPIO Enable Clear {regIdx}",
187                     valueProviderCallback: (bitIdx, _) => tristatePinOutputEnabled[regIdx * PinsPerBank + bitIdx],
188                     writeCallback: (bitIdx, _, value) =>
189                     {
190                         if(!value)
191                         {
192                             return;
193                         }
194 
195                         EnableTristatePinOutputState(regIdx * PinsPerBank + bitIdx, false);
196                     });
197             });
198 
199             Registers.InputRead0.DefineMany(this, NumberOfBanks, (register, regIdx) =>
200             {
201                 register.WithFlags(0, PinsPerBank, FieldMode.Read, name: $"RD{regIdx} - Pin {regIdx} state", valueProviderCallback: (bitIdx, _) =>
202                 {
203                     var pinIdx = regIdx * PinsPerBank + bitIdx;
204 
205                     return readZero[pinIdx].Value || !inputEnable[pinIdx].Value
206                         ? false
207                         : State[pinIdx];
208                 });
209             });
210 
211             foreach(var descriptor in new[]
212             {
213                 new { Register = Registers.MCUPriorityN0InterruptEnable0, Type = IrqType.McuN0IrqBank0 },
214                 new { Register = Registers.MCUPriorityN0InterruptEnable1, Type = IrqType.McuN0IrqBank1 },
215                 new { Register = Registers.MCUPriorityN0InterruptEnable2, Type = IrqType.McuN0IrqBank2 },
216                 new { Register = Registers.MCUPriorityN0InterruptEnable3, Type = IrqType.McuN0IrqBank3 },
217 
218                 new { Register = Registers.MCUPriorityN1InterruptEnable0, Type = IrqType.McuN1IrqBank0 },
219                 new { Register = Registers.MCUPriorityN1InterruptEnable1, Type = IrqType.McuN1IrqBank1 },
220                 new { Register = Registers.MCUPriorityN1InterruptEnable2, Type = IrqType.McuN1IrqBank2 },
221                 new { Register = Registers.MCUPriorityN1InterruptEnable3, Type = IrqType.McuN1IrqBank3 },
222             })
223             {
224                 descriptor.Register.Define(this)
225                     .WithFlags(0, PinsPerBank, out irqEnabled[(int)descriptor.Type])
226                     .WithWriteCallback((_, __) => UpdateInterrupt(descriptor.Type));
227             }
228 
229             foreach(var descriptor in new[]
230             {
231                 new { Register = Registers.MCUPriorityN0InterruptStatus0, Type = IrqType.McuN0IrqBank0 },
232                 new { Register = Registers.MCUPriorityN0InterruptStatus1, Type = IrqType.McuN0IrqBank1 },
233                 new { Register = Registers.MCUPriorityN0InterruptStatus2, Type = IrqType.McuN0IrqBank2 },
234                 new { Register = Registers.MCUPriorityN0InterruptStatus3, Type = IrqType.McuN0IrqBank3 },
235 
236                 new { Register = Registers.MCUPriorityN1InterruptStatus0, Type = IrqType.McuN1IrqBank0 },
237                 new { Register = Registers.MCUPriorityN1InterruptStatus1, Type = IrqType.McuN1IrqBank1 },
238                 new { Register = Registers.MCUPriorityN1InterruptStatus2, Type = IrqType.McuN1IrqBank2 },
239                 new { Register = Registers.MCUPriorityN1InterruptStatus3, Type = IrqType.McuN1IrqBank3 },
240             })
241             {
242                 descriptor.Register.Define(this)
243                     .WithFlags(0, PinsPerBank, out irqStatus[(int)descriptor.Type], FieldMode.Read);
244             }
245 
246             foreach(var descriptor in new[]
247             {
248                 new { Register = Registers.MCUPriorityN0InterruptClear0, Type = IrqType.McuN0IrqBank0 },
249                 new { Register = Registers.MCUPriorityN0InterruptClear1, Type = IrqType.McuN0IrqBank1 },
250                 new { Register = Registers.MCUPriorityN0InterruptClear2, Type = IrqType.McuN0IrqBank2 },
251                 new { Register = Registers.MCUPriorityN0InterruptClear3, Type = IrqType.McuN0IrqBank3 },
252 
253                 new { Register = Registers.MCUPriorityN1InterruptClear0, Type = IrqType.McuN1IrqBank0 },
254                 new { Register = Registers.MCUPriorityN1InterruptClear1, Type = IrqType.McuN1IrqBank1 },
255                 new { Register = Registers.MCUPriorityN1InterruptClear2, Type = IrqType.McuN1IrqBank2 },
256                 new { Register = Registers.MCUPriorityN1InterruptClear3, Type = IrqType.McuN1IrqBank3 },
257             })
258             {
259                 descriptor.Register.Define(this)
260                     .WithFlags(0, PinsPerBank, writeCallback: (bitIdx, _, value) =>
261                         {
262                             if(!value)
263                             {
264                                 return;
265                             }
266 
267                             irqStatus[(int)descriptor.Type][bitIdx].Value = false;
268                         })
269                     .WithWriteCallback((_, __) => UpdateInterrupt(descriptor.Type));
270             }
271 
272             foreach(var descriptor in new[]
273             {
274                 new { Register = Registers.MCUPriorityN0InterruptSet0, Type = IrqType.McuN0IrqBank0 },
275                 new { Register = Registers.MCUPriorityN0InterruptSet1, Type = IrqType.McuN0IrqBank1 },
276                 new { Register = Registers.MCUPriorityN0InterruptSet2, Type = IrqType.McuN0IrqBank2 },
277                 new { Register = Registers.MCUPriorityN0InterruptSet3, Type = IrqType.McuN0IrqBank3 },
278 
279                 new { Register = Registers.MCUPriorityN1InterruptSet0, Type = IrqType.McuN1IrqBank0 },
280                 new { Register = Registers.MCUPriorityN1InterruptSet1, Type = IrqType.McuN1IrqBank1 },
281                 new { Register = Registers.MCUPriorityN1InterruptSet2, Type = IrqType.McuN1IrqBank2 },
282                 new { Register = Registers.MCUPriorityN1InterruptSet3, Type = IrqType.McuN1IrqBank3 },
283             })
284             {
285                 descriptor.Register.Define(this)
286                     .WithFlags(0, PinsPerBank, writeCallback: (bitIdx, _, value) =>
287                         {
288                             if(!value)
289                             {
290                                 return;
291                             }
292 
293                             irqStatus[(int)descriptor.Type][bitIdx].Value = true;
294                         })
295                     .WithWriteCallback((_, __) => UpdateInterrupt(descriptor.Type));
296             }
297 
298             Registers.PadKey.Define(this)
299                 .WithValueField(0, 32, out padKey, name: "PADKEY")
300                 ;
301         }
302 
EnableTristatePinOutputState(int pinIdx, bool enabled)303         private void EnableTristatePinOutputState(int pinIdx, bool enabled)
304         {
305             tristatePinOutputEnabled[pinIdx] = enabled;
306             this.Log(LogLevel.Debug, "GPIO #{0} tri-state {1}", pinIdx, enabled ? "enabled" : "disabled");
307 
308             UpdateOutputPinState(pinIdx);
309         }
310 
HandlePinStateChangeInterrupt(int pinIdx, bool risingEdge)311         private void HandlePinStateChangeInterrupt(int pinIdx, bool risingEdge)
312         {
313             var mode = interruptMode[pinIdx].Value;
314             if(mode == InterruptEnable.EnabledOnAnyTransition
315                 || (risingEdge && mode == InterruptEnable.EnabledOnRisingEdgeTransition)
316                 || (!risingEdge && mode == InterruptEnable.EnabledOnFallingEdgeTransition))
317             {
318                 this.Log(LogLevel.Noisy, "Triggering IRQ #{0} on the {1} edge", pinIdx, risingEdge ? "rising" : "falling");
319                 TriggerInterrupt(pinIdx);
320             }
321         }
322 
IsPinOutputEnabled(int pinIdx)323         private bool IsPinOutputEnabled(int pinIdx)
324         {
325             switch(ioMode[pinIdx].Value)
326             {
327                 case IOMode.OutputDisabled:
328                     return false;
329 
330                 case IOMode.PushPullOutputMode:
331                     return true;
332 
333                 case IOMode.OpenDrainOutputMode:
334                     return false;
335 
336                 case IOMode.TristatePushPullOutputMode:
337                     return tristatePinOutputEnabled[pinIdx];
338 
339                 default:
340                     throw new ArgumentException($"Unexpected IOMode: {ioMode[pinIdx].Value}");
341             }
342         }
343 
SetOutputPinValue(int pinIdx, bool state)344         private void SetOutputPinValue(int pinIdx, bool state)
345         {
346             outputPinValues[pinIdx] = state;
347             UpdateOutputPinState(pinIdx);
348         }
349 
TriggerInterrupt(int pinIdx)350         private void TriggerInterrupt(int pinIdx)
351         {
352             var irqBank = pinIdx / PinsPerBank;
353             var banksPinOffset = pinIdx % PinsPerBank;
354 
355             TriggerInterruptInner(irqBank, banksPinOffset);
356             TriggerInterruptInner(irqBank, banksPinOffset, n1Priority: true);
357         }
358 
TriggerInterruptInner(int irqBank, int banksPinOffset, bool n1Priority = false)359         private void TriggerInterruptInner(int irqBank, int banksPinOffset, bool n1Priority = false)
360         {
361             var irqType = n1Priority ? irqBank + NumberOfBanks : irqBank;
362             if(irqEnabled[irqType][banksPinOffset].Value)
363             {
364                 irqStatus[irqType][banksPinOffset].Value = true;
365                 UpdateInterrupt((IrqType)irqType);
366             }
367         }
368 
UpdateInterrupt(IrqType irqType)369         private void UpdateInterrupt(IrqType irqType)
370         {
371             var flag = false;
372             for(var banksPinOffset = 0; banksPinOffset < PinsPerBank; banksPinOffset++)
373             {
374                 if(irqEnabled[(int)irqType][banksPinOffset].Value && irqStatus[(int)irqType][banksPinOffset].Value)
375                 {
376                     flag = true;
377                     break;
378                 }
379             }
380 
381             this.Log(LogLevel.Debug, "{0} {1} interrupt", flag ? "Setting" : "Clearing", irqType);
382             irq[(int)irqType].Set(flag);
383         }
384 
UpdateOutputPinState(int pinIdx)385         private void UpdateOutputPinState(int pinIdx)
386         {
387             var newPinState = IsPinOutputEnabled(pinIdx) && outputPinValues[pinIdx];
388             if(Connections[pinIdx].IsSet != newPinState)
389             {
390                 Connections[pinIdx].Set(newPinState);
391                 this.Log(LogLevel.Debug, "{0} output pin #{1}", newPinState ? "Setting" : "Clearing", pinIdx);
392             }
393         }
394 
395         private IValueRegisterField padKey;
396 
397         private readonly IFlagRegisterField[] inputEnable = new IFlagRegisterField[NumberOfPins];
398         private readonly IEnumRegisterField<InterruptEnable>[] interruptMode = new IEnumRegisterField<InterruptEnable>[NumberOfPins];
399         private readonly IEnumRegisterField<IOMode>[] ioMode = new IEnumRegisterField<IOMode>[NumberOfPins];
400         private readonly IFlagRegisterField[][] irqEnabled = new IFlagRegisterField[NumberOfExternalInterrupts][];
401         private readonly IFlagRegisterField[][] irqStatus = new IFlagRegisterField[NumberOfExternalInterrupts][];
402         private readonly IFlagRegisterField[] readZero = new IFlagRegisterField[NumberOfPins];
403 
404         private readonly GPIO[] irq = new [] { new GPIO(), new GPIO(), new GPIO(), new GPIO(), new GPIO(), new GPIO(), new GPIO(), new GPIO() };
405         private readonly bool[] outputPinValues = new bool[NumberOfPins];
406         private readonly bool[] tristatePinOutputEnabled = new bool[NumberOfPins];
407 
408         private const int FirstVirtualPinIndex = 105;
409         private const int NumberOfBanks = NumberOfPins / PinsPerBank;
410         private const int NumberOfExternalInterrupts = 8;
411         private const int NumberOfPins = 128;
412         private const uint PadKeyUnlockValue = 0x73;
413         private const int PinsPerBank = 32;
414 
415         private enum ChipSelectConfiguration
416         {
417             IOM0CE0 = 0x0, // IOM 0 NCE 0 module
418             IOM0CE1 = 0x1, // IOM 0 NCE 1 module
419             IOM0CE2 = 0x2, // IOM 0 NCE 2 module
420             IOM0CE3 = 0x3, // IOM 0 NCE 3 module
421             IOM1CE0 = 0x4, // IOM 1 NCE 0 module
422             IOM1CE1 = 0x5, // IOM 1 NCE 1 module
423             IOM1CE2 = 0x6, // IOM 1 NCE 2 module
424             IOM1CE3 = 0x7, // IOM 1 NCE 3 module
425             IOM2CE0 = 0x8, // IOM 2 NCE 0 module
426             IOM2CE1 = 0x9, // IOM 2 NCE 1 module
427             IOM2CE2 = 0xA, // IOM 2 NCE 2 module
428             IOM2CE3 = 0xB, // IOM 2 NCE 3 module
429             IOM3CE0 = 0xC, // IOM 3 NCE 0 module
430             IOM3CE1 = 0xD, // IOM 3 NCE 1 module
431             IOM3CE2 = 0xE, // IOM 3 NCE 2 module
432             IOM3CE3 = 0xF, // IOM 3 NCE 3 module
433             IOM4CE0 = 0x10, // IOM 4 NCE 0 module
434             IOM4CE1 = 0x11, // IOM 4 NCE 1 module
435             IOM4CE2 = 0x12, // IOM 4 NCE 2 module
436             IOM4CE3 = 0x13, // IOM 4 NCE 3 module
437             IOM5CE0 = 0x14, // IOM 5 NCE 0 module
438             IOM5CE1 = 0x15, // IOM 5 NCE 1 module
439             IOM5CE2 = 0x16, // IOM 5 NCE 2 module
440             IOM5CE3 = 0x17, // IOM 5 NCE 3 module
441             IOM6CE0 = 0x18, // IOM 6 NCE 0 module
442             IOM6CE1 = 0x19, // IOM 6 NCE 1 module
443             IOM6CE2 = 0x1A, // IOM 6 NCE 2 module
444             IOM6CE3 = 0x1B, // IOM 6 NCE 3 module
445             IOM7CE0 = 0x1C, // IOM 7 NCE 0 module
446             IOM7CE1 = 0x1D, // IOM 7 NCE 1 module
447             IOM7CE2 = 0x1E, // IOM 7 NCE 2 module
448             IOM7CE3 = 0x1F, // IOM 7 NCE 3 module
449             MSPI0CEN0 = 0x20, // MSPI 0 NCE 0 module
450             MSPI0CEN1 = 0x21, // MSPI 0 NCE 1 module
451             MSPI1CEN0 = 0x22, // MSPI 1 NCE 0 module
452             MSPI1CEN1 = 0x23, // MSPI 1 NCE 1 module
453             MSPI2CEN0 = 0x24, // MSPI 2 NCE 0 module
454             MSPI2CEN1 = 0x25, // MSPI 2 NCE 1 module
455             DC_DPI_DE = 0x26, // DC DPI DE module
456             DISP_CONT_CSX = 0x27, // DISP CONT CSX module
457             DC_SPI_CS_N = 0x28, // DC SPI CS_N module
458             DC_QSPI_CS_N = 0x29, // DC QSPI CS_N module
459             DC_RESX = 0x2A, // DC module RESX
460         }
461 
462         private enum DriveStrength
463         {
464             OutputDriver0_1x = 0x0, // 0.1x output driver selected
465             OutputDriver0_5x = 0x1, // 0.5x output driver selected
466         }
467 
468         private enum InterruptEnable
469         {
470             Disabled = 0x0, // Interrupts are disabled for this GPIO
471             EnabledOnFallingEdgeTransition = 0x1, // Interrupts are enabled for falling edge transition on this GPIO
472             EnabledOnRisingEdgeTransition = 0x2, // Interrupts are enabled for rising edge transitions on this GPIO
473             EnabledOnAnyTransition = 0x3, // Interrupts are enabled for any edge transition on this GPIO
474         }
475 
476         private enum IOMode
477         {
478             OutputDisabled = 0x0, // Output Disabled
479             PushPullOutputMode = 0x1, // Output configured in push pull mode. Will drive 0 and 1 values on pin.
480             OpenDrainOutputMode = 0x2, // Output configured in open drain mode. Will only drive pin low, tristate otherwise.
481             TristatePushPullOutputMode = 0x3, // Output configured in Tristate-able push pull mode. Will drive 0, 1 of HiZ on pin.
482         }
483 
484         private enum IrqType
485         {
486             McuN0IrqBank0,
487             McuN0IrqBank1,
488             McuN0IrqBank2,
489             McuN0IrqBank3,
490             McuN1IrqBank0,
491             McuN1IrqBank1,
492             McuN1IrqBank2,
493             McuN1IrqBank3
494         }
495 
496         private enum PolarityConfiguration
497         {
498             ActiveLow = 0x0, // Polarity is active low
499             ActiveHigh = 0x1, // Polarity is active high
500         }
501 
502         private enum PullUpDownConfiguration
503         {
504             None = 0x0, // No pullup or pulldown selected
505             Pulldown50K = 0x1, // 50K Pulldown selected
506             Pullup1_5K = 0x2, // 1.5K Pullup selected
507             Pullup6K = 0x3, // 6K Pullup selected
508             Pullup12K = 0x4, // 12K Pullup selected
509             Pullup24K = 0x5, // 24K Pullup selected
510             Pullup50K = 0x6, // 50K Pullup selected
511             Pullup100K = 0x7, // 100K Pullup selected
512         }
513 
514         private enum Registers : long
515         {
516             PinConfiguration0 = 0x000, // Configuration control for GPIO pin 0
517             PinConfiguration1 = 0x004, // Configuration control for GPIO pin 1
518             PinConfiguration2 = 0x008, // Configuration control for GPIO pin 2
519             PinConfiguration3 = 0x00C, // Configuration control for GPIO pin 3
520             PinConfiguration4 = 0x010, // Configuration control for GPIO pin 4
521             PinConfiguration5 = 0x014, // Configuration control for GPIO pin 5
522             PinConfiguration6 = 0x018, // Configuration control for GPIO pin 6
523             PinConfiguration7 = 0x01C, // Configuration control for GPIO pin 7
524             PinConfiguration8 = 0x020, // Configuration control for GPIO pin 8
525             PinConfiguration9 = 0x024, // Configuration control for GPIO pin 9
526             PinConfiguration10 = 0x028, // Configuration control for GPIO pin 10
527             PinConfiguration11 = 0x02C, // Configuration control for GPIO pin 11
528             PinConfiguration12 = 0x030, // Configuration control for GPIO pin 12
529             PinConfiguration13 = 0x034, // Configuration control for GPIO pin 13
530             PinConfiguration14 = 0x038, // Configuration control for GPIO pin 14
531             PinConfiguration15 = 0x03C, // Configuration control for GPIO pin 15
532             PinConfiguration16 = 0x040, // Configuration control for GPIO pin 16
533             PinConfiguration17 = 0x044, // Configuration control for GPIO pin 17
534             PinConfiguration18 = 0x048, // Configuration control for GPIO pin 18
535             PinConfiguration19 = 0x04C, // Configuration control for GPIO pin 19
536             PinConfiguration20 = 0x050, // Configuration control for GPIO pin 20
537             PinConfiguration21 = 0x054, // Configuration control for GPIO pin 21
538             PinConfiguration22 = 0x058, // Configuration control for GPIO pin 22
539             PinConfiguration23 = 0x05C, // Configuration control for GPIO pin 23
540             PinConfiguration24 = 0x060, // Configuration control for GPIO pin 24
541             PinConfiguration25 = 0x064, // Configuration control for GPIO pin 25
542             PinConfiguration26 = 0x068, // Configuration control for GPIO pin 26
543             PinConfiguration27 = 0x06C, // Configuration control for GPIO pin 27
544             PinConfiguration28 = 0x070, // Configuration control for GPIO pin 28
545             PinConfiguration29 = 0x074, // Configuration control for GPIO pin 29
546             PinConfiguration30 = 0x078, // Configuration control for GPIO pin 30
547             PinConfiguration31 = 0x07C, // Configuration control for GPIO pin 31
548             PinConfiguration32 = 0x080, // Configuration control for GPIO pin 32
549             PinConfiguration33 = 0x084, // Configuration control for GPIO pin 33
550             PinConfiguration34 = 0x088, // Configuration control for GPIO pin 34
551             PinConfiguration35 = 0x08C, // Configuration control for GPIO pin 35
552             PinConfiguration36 = 0x090, // Configuration control for GPIO pin 36
553             PinConfiguration37 = 0x094, // Configuration control for GPIO pin 37
554             PinConfiguration38 = 0x098, // Configuration control for GPIO pin 38
555             PinConfiguration39 = 0x09C, // Configuration control for GPIO pin 39
556             PinConfiguration40 = 0x0A0, // Configuration control for GPIO pin 40
557             PinConfiguration41 = 0x0A4, // Configuration control for GPIO pin 41
558             PinConfiguration42 = 0x0A8, // Configuration control for GPIO pin 42
559             PinConfiguration43 = 0x0AC, // Configuration control for GPIO pin 43
560             PinConfiguration44 = 0x0B0, // Configuration control for GPIO pin 44
561             PinConfiguration45 = 0x0B4, // Configuration control for GPIO pin 45
562             PinConfiguration46 = 0x0B8, // Configuration control for GPIO pin 46
563             PinConfiguration47 = 0x0BC, // Configuration control for GPIO pin 47
564             PinConfiguration48 = 0x0C0, // Configuration control for GPIO pin 48
565             PinConfiguration49 = 0x0C4, // Configuration control for GPIO pin 49
566             PinConfiguration50 = 0x0C8, // Configuration control for GPIO pin 50
567             PinConfiguration51 = 0x0CC, // Configuration control for GPIO pin 51
568             PinConfiguration52 = 0x0D0, // Configuration control for GPIO pin 52
569             PinConfiguration53 = 0x0D4, // Configuration control for GPIO pin 53
570             PinConfiguration54 = 0x0D8, // Configuration control for GPIO pin 54
571             PinConfiguration55 = 0x0DC, // Configuration control for GPIO pin 55
572             PinConfiguration56 = 0x0E0, // Configuration control for GPIO pin 56
573             PinConfiguration57 = 0x0E4, // Configuration control for GPIO pin 57
574             PinConfiguration58 = 0x0E8, // Configuration control for GPIO pin 58
575             PinConfiguration59 = 0x0EC, // Configuration control for GPIO pin 59
576             PinConfiguration60 = 0x0F0, // Configuration control for GPIO pin 60
577             PinConfiguration61 = 0x0F4, // Configuration control for GPIO pin 61
578             PinConfiguration62 = 0x0F8, // Configuration control for GPIO pin 62
579             PinConfiguration63 = 0x0FC, // Configuration control for GPIO pin 63
580             PinConfiguration64 = 0x100, // Configuration control for GPIO pin 64
581             PinConfiguration65 = 0x104, // Configuration control for GPIO pin 65
582             PinConfiguration66 = 0x108, // Configuration control for GPIO pin 66
583             PinConfiguration67 = 0x10C, // Configuration control for GPIO pin 67
584             PinConfiguration68 = 0x110, // Configuration control for GPIO pin 68
585             PinConfiguration69 = 0x114, // Configuration control for GPIO pin 69
586             PinConfiguration70 = 0x118, // Configuration control for GPIO pin 70
587             PinConfiguration71 = 0x11C, // Configuration control for GPIO pin 71
588             PinConfiguration72 = 0x120, // Configuration control for GPIO pin 72
589             PinConfiguration73 = 0x124, // Configuration control for GPIO pin 73
590             PinConfiguration74 = 0x128, // Configuration control for GPIO pin 74
591             PinConfiguration75 = 0x12C, // Configuration control for GPIO pin 75
592             PinConfiguration76 = 0x130, // Configuration control for GPIO pin 76
593             PinConfiguration77 = 0x134, // Configuration control for GPIO pin 77
594             PinConfiguration78 = 0x138, // Configuration control for GPIO pin 78
595             PinConfiguration79 = 0x13C, // Configuration control for GPIO pin 79
596             PinConfiguration80 = 0x140, // Configuration control for GPIO pin 80
597             PinConfiguration81 = 0x144, // Configuration control for GPIO pin 81
598             PinConfiguration82 = 0x148, // Configuration control for GPIO pin 82
599             PinConfiguration83 = 0x14C, // Configuration control for GPIO pin 83
600             PinConfiguration84 = 0x150, // Configuration control for GPIO pin 84
601             PinConfiguration85 = 0x154, // Configuration control for GPIO pin 85
602             PinConfiguration86 = 0x158, // Configuration control for GPIO pin 86
603             PinConfiguration87 = 0x15C, // Configuration control for GPIO pin 87
604             PinConfiguration88 = 0x160, // Configuration control for GPIO pin 88
605             PinConfiguration89 = 0x164, // Configuration control for GPIO pin 89
606             PinConfiguration90 = 0x168, // Configuration control for GPIO pin 90
607             PinConfiguration91 = 0x16C, // Configuration control for GPIO pin 91
608             PinConfiguration92 = 0x170, // Configuration control for GPIO pin 92
609             PinConfiguration93 = 0x174, // Configuration control for GPIO pin 93
610             PinConfiguration94 = 0x178, // Configuration control for GPIO pin 94
611             PinConfiguration95 = 0x17C, // Configuration control for GPIO pin 95
612             PinConfiguration96 = 0x180, // Configuration control for GPIO pin 96
613             PinConfiguration97 = 0x184, // Configuration control for GPIO pin 97
614             PinConfiguration98 = 0x188, // Configuration control for GPIO pin 98
615             PinConfiguration99 = 0x18C, // Configuration control for GPIO pin 99
616             PinConfiguration100 = 0x190, // Configuration control for GPIO pin 100
617             PinConfiguration101 = 0x194, // Configuration control for GPIO pin 101
618             PinConfiguration102 = 0x198, // Configuration control for GPIO pin 102
619             PinConfiguration103 = 0x19C, // Configuration control for GPIO pin 103
620             PinConfiguration104 = 0x1A0, // Configuration control for GPIO pin 104
621             PinConfiguration105 = 0x1A4, // Configuration control for Virtual GPIO pin 105
622             PinConfiguration106 = 0x1A8, // Configuration control for Virtual GPIO pin 106
623             PinConfiguration107 = 0x1AC, // Configuration control for Virtual GPIO pin 107
624             PinConfiguration108 = 0x1B0, // Configuration control for Virtual GPIO pin 108
625             PinConfiguration109 = 0x1B4, // Configuration control for Virtual GPIO pin 109
626             PinConfiguration110 = 0x1B8, // Configuration control for Virtual GPIO pin 110
627             PinConfiguration111 = 0x1BC, // Configuration control for Virtual GPIO pin 111
628             PinConfiguration112 = 0x1C0, // Configuration control for Virtual GPIO pin 112
629             PinConfiguration113 = 0x1C4, // Configuration control for Virtual GPIO pin 113
630             PinConfiguration114 = 0x1C8, // Configuration control for Virtual GPIO pin 114
631             PinConfiguration115 = 0x1CC, // Configuration control for Virtual GPIO pin 115
632             PinConfiguration116 = 0x1D0, // Configuration control for Virtual GPIO pin 116
633             PinConfiguration117 = 0x1D4, // Configuration control for Virtual GPIO pin 117
634             PinConfiguration118 = 0x1D8, // Configuration control for Virtual GPIO pin 118
635             PinConfiguration119 = 0x1DC, // Configuration control for Virtual GPIO pin 119
636             PinConfiguration120 = 0x1E0, // Configuration control for Virtual GPIO pin 120
637             PinConfiguration121 = 0x1E4, // Configuration control for Virtual GPIO pin 121
638             PinConfiguration122 = 0x1E8, // Configuration control for Virtual GPIO pin 122
639             PinConfiguration123 = 0x1EC, // Configuration control for Virtual GPIO pin 123
640             PinConfiguration124 = 0x1F0, // Configuration control for Virtual GPIO pin 124
641             PinConfiguration125 = 0x1F4, // Configuration control for Virtual GPIO pin 125
642             PinConfiguration126 = 0x1F8, // Configuration control for Virtual GPIO pin 126
643             PinConfiguration127 = 0x1FC, // Configuration control for Virtual GPIO pin 127
644             PadKey = 0x200, // Key Register for all pad configuration registers
645             InputRead0 = 0x204, // GPIO Input 0 (31-0)
646             InputRead1 = 0x208, // GPIO Input 1 (63-32)
647             InputRead2 = 0x20C, // GPIO Input 2 (95-64)
648             InputRead3 = 0x210, // GPIO Input 3 (127-96)
649             OutputWrite0 = 0x214, // GPIO Output 0 (31-0)
650             OutputWrite1 = 0x218, // GPIO Output 1 (63-32)
651             OutputWrite2 = 0x21C, // GPIO Output 2 (95-64)
652             OutputWrite3 = 0x220, // GPIO Output 3 (127-96)
653             OutputSet0 = 0x224, // GPIO Output Set 0 (31-0)
654             OutputSet1 = 0x228, // GPIO Output Set 1 (63-32)
655             OutputSet2 = 0x22C, // GPIO Output Set 2 (95-64)
656             OutputSet3 = 0x230, // GPIO Output Set 3 (127-96)
657             OutputClear0 = 0x234, // GPIO Output Clear 0 (31-0)
658             OutputClear1 = 0x238, // GPIO Output Clear 1 (63-32)
659             OutputClear2 = 0x23C, // GPIO Output Clear 2 (95-64)
660             OutputClear3 = 0x240, // GPIO Output Clear 3 (127-96)
661             GPIOOutputEnable0 = 0x244, // GPIO Enable 0 (31-0)
662             GPIOOutputEnable1 = 0x248, // GPIO Enable 1 (63-32)
663             GPIOOutputEnable2 = 0x24C, // GPIO Enable 2 (95-64)
664             GPIOOutputEnable3 = 0x250, // GPIO Enable 3 (127-96)
665             GPIOOutputEnableSet0 = 0x254, // GPIO Enable Set 0 (31-0)
666             GPIOOutputEnableSet1 = 0x258, // GPIO Enable Set 1 (63-32)
667             GPIOOutputEnableSet2 = 0x25C, // GPIO Enable Set 2 (95-64)
668             GPIOOutputEnableSet3 = 0x260, // GPIO Enable Set 3 (127-96)
669             GPIOOutputEnableClear0 = 0x264, // GPIO Enable Clear 0 (31-0)
670             GPIOOutputEnableClear1 = 0x268, // GPIO Enable Clear 1 (63-32)
671             GPIOOutputEnableClear2 = 0x26C, // GPIO Enable Clear 2 (95-64)
672             GPIOOutputEnableClear3 = 0x270, // GPIO Enable Clear 3 (127-96)
673             IOM0FlowControlIRQSelect = 0x274, // IOM0 Flow Control IRQ Select
674             IOM1FlowControlIRQSelect = 0x278, // IOM1 Flow Control IRQ Select
675             IOM2FlowControlIRQSelect = 0x27C, // IOM2 Flow Control IRQ Select
676             IOM3FlowControlIRQSelect = 0x280, // IOM3 Flow Control IRQ Select
677             IOM4FlowControlIRQSelect = 0x284, // IOM4 Flow Control IRQ Select
678             IOM5FlowControlIRQSelect = 0x288, // IOM5 Flow Control IRQ Select
679             IOM6FlowControlIRQSelect = 0x28C, // IOM6 Flow Control IRQ Select
680             IOM7FlowControlIRQSelect = 0x290, // IOM7 Flow Control IRQ Select
681             SDIFCDWPPadSelect = 0x294, // SDIF CD and WP Select
682             ObservationModeSample = 0x298, // GPIO Observation Mode Sample
683             InputEnableSignals0 = 0x29C, // Read only. Reflects the value of the input enable signals for pads 31-0 sent to the pad.
684             InputEnableSignals1 = 0x2A0, // Read only. Reflects the value of the input enable signals for pads 63-32 sent to the pad.
685             InputEnableSignals2 = 0x2A4, // Read only. Reflects the value of the input enable signals for pads 95-64 sent to the pad.
686             InputEnableSignals3 = 0x2A8, // Read only. Reflects the value of the input enable signals for pads 127-96 sent to the pad.
687             OutputEnableSignals0 = 0x2AC, // Read only. Reflects the value of the output enable signals for pads 31-0 sent to the pad.
688             OutputEnableSignals1 = 0x2B0, // Read only. Reflects the value of the output enable signals for pads 63-32 sent to the pad.
689             OutputEnableSignals2 = 0x2B4, // Read only. Reflects the value of the output enable signals for pads 95-64 sent to the pad.
690             OutputEnableSignals3 = 0x2B8, // Read only. Reflects the value of the output enable signals for pads 127-96 sent to the pad.
691             MCUPriorityN0InterruptEnable0 = 0x2C0, // GPIO MCU Interrupts N0 31-0: Enable
692             MCUPriorityN0InterruptStatus0 = 0x2C4, // GPIO MCU Interrupts N0 31-0: Status
693             MCUPriorityN0InterruptClear0 = 0x2C8, // GPIO MCU Interrupts N0 31-0: Clear
694             MCUPriorityN0InterruptSet0 = 0x2CC, // GPIO MCU Interrupts N0 31-0: Set
695             MCUPriorityN0InterruptEnable1 = 0x2D0, // GPIO MCU Interrupts N0 63-32: Enable
696             MCUPriorityN0InterruptStatus1 = 0x2D4, // GPIO MCU Interrupts N0 63-32: Status
697             MCUPriorityN0InterruptClear1 = 0x2D8, // GPIO MCU Interrupts N0 63-32: Clear
698             MCUPriorityN0InterruptSet1 = 0x2DC, // GPIO MCU Interrupts N0 63-32: Set
699             MCUPriorityN0InterruptEnable2 = 0x2E0, // GPIO MCU Interrupts N0 95-64: Enable
700             MCUPriorityN0InterruptStatus2 = 0x2E4, // GPIO MCU Interrupts N0 95-64: Status
701             MCUPriorityN0InterruptClear2 = 0x2E8, // GPIO MCU Interrupts N0 95-64: Clear
702             MCUPriorityN0InterruptSet2 = 0x2EC, // GPIO MCU Interrupts N0 95-64: Set
703             MCUPriorityN0InterruptEnable3 = 0x2F0, // GPIO MCU Interrupts N0 127-96: Enable
704             MCUPriorityN0InterruptStatus3 = 0x2F4, // GPIO MCU Interrupts N0 127-96: Status
705             MCUPriorityN0InterruptClear3 = 0x2F8, // GPIO MCU Interrupts N0 127-96: Clear
706             MCUPriorityN0InterruptSet3 = 0x2FC, // GPIO MCU Interrupts N0 127-96: Set
707             MCUPriorityN1InterruptEnable0 = 0x300, // GPIO MCU Interrupts N1 31-0: Enable
708             MCUPriorityN1InterruptStatus0 = 0x304, // GPIO MCU Interrupts N1 31-0: Status
709             MCUPriorityN1InterruptClear0 = 0x308, // GPIO MCU Interrupts N1 31-0: Clear
710             MCUPriorityN1InterruptSet0 = 0x30C, // GPIO MCU Interrupts N1 31-0: Set
711             MCUPriorityN1InterruptEnable1 = 0x310, // GPIO MCU Interrupts N1 63-32: Enable
712             MCUPriorityN1InterruptStatus1 = 0x314, // GPIO MCU Interrupts N1 63-32: Status
713             MCUPriorityN1InterruptClear1 = 0x318, // GPIO MCU Interrupts N1 63-32: Clear
714             MCUPriorityN1InterruptSet1 = 0x31C, // GPIO MCU Interrupts N1 63-32: Set
715             MCUPriorityN1InterruptEnable2 = 0x320, // GPIO MCU Interrupts N1 95-64: Enable
716             MCUPriorityN1InterruptStatus2 = 0x324, // GPIO MCU Interrupts N1 95-64: Status
717             MCUPriorityN1InterruptClear2 = 0x328, // GPIO MCU Interrupts N1 95-64: Clear
718             MCUPriorityN1InterruptSet2 = 0x32C, // GPIO MCU Interrupts N1 95-64: Set
719             MCUPriorityN1InterruptEnable3 = 0x330, // GPIO MCU Interrupts N1 127-96: Enable
720             MCUPriorityN1InterruptStatus3 = 0x334, // GPIO MCU Interrupts N1 127-96: Status
721             MCUPriorityN1InterruptClear3 = 0x338, // GPIO MCU Interrupts N1 127-96: Clear
722             MCUPriorityN1InterruptSet3 = 0x33C, // GPIO MCU Interrupts N1 127-96: Set
723             DSP0PriorityN0InterruptEnable0 = 0x340, // GPIO DSP0 Interrupts N0 31-0: Enable
724             DSP0PriorityN0InterruptStatus0 = 0x344, // GPIO DSP0 Interrupts N0 31-0: Status
725             DSP0PriorityN0InterruptClear0 = 0x348, // GPIO DSP0 Interrupts N0 31-0: Clear
726             DSP0PriorityN0InterruptSet0 = 0x34C, // GPIO DSP0 Interrupts N0 31-0: Set
727             DSP0PriorityN0InterruptEnable1 = 0x350, // GPIO DSP0 Interrupts N0 63-32: Enable
728             DSP0PriorityN0InterruptStatus1 = 0x354, // GPIO DSP0 Interrupts N0 63-32: Status
729             DSP0PriorityN0InterruptClear1 = 0x358, // GPIO DSP0 Interrupts N0 63-32: Clear
730             DSP0PriorityN0InterruptSet1 = 0x35C, // GPIO DSP0 Interrupts N0 63-32: Set
731             DSP0PriorityN0InterruptEnable2 = 0x360, // GPIO DSP0 Interrupts N0 95-64: Enable
732             DSP0PriorityN0InterruptStatus2 = 0x364, // GPIO DSP0 Interrupts N0 95-64: Status
733             DSP0PriorityN0InterruptClear2 = 0x368, // GPIO DSP0 Interrupts N0 95-64: Clear
734             DSP0PriorityN0InterruptSet2 = 0x36C, // GPIO DSP0 Interrupts N0 95-64: Set
735             DSP0PriorityN0InterruptEnable3 = 0x370, // GPIO DSP0 Interrupts N0 127-96: Enable
736             DSP0PriorityN0InterruptStatus3 = 0x374, // GPIO DSP0 Interrupts N0 127-96: Status
737             DSP0PriorityN0InterruptClear3 = 0x378, // GPIO DSP0 Interrupts N0 127-96: Clear
738             DSP0PriorityN0InterruptSet3 = 0x37C, // GPIO DSP0 Interrupts N0 127-96: Set
739             DSP0PriorityN1InterruptEnable0 = 0x380, // GPIO DSP0 Interrupts N1 31-0: Enable
740             DSP0PriorityN1InterruptStatus0 = 0x384, // GPIO DSP0 Interrupts N1 31-0: Status
741             DSP0PriorityN1InterruptClear0 = 0x388, // GPIO DSP0 Interrupts N1 31-0: Clear
742             DSP0PriorityN1InterruptSet0 = 0x38C, // GPIO DSP0 Interrupts N1 31-0: Set
743             DSP0PriorityN1InterruptEnable1 = 0x390, // GPIO DSP0 Interrupts N1 63-32: Enable
744             DSP0PriorityN1InterruptStatus1 = 0x394, // GPIO DSP0 Interrupts N1 63-32: Status
745             DSP0PriorityN1InterruptClear1 = 0x398, // GPIO DSP0 Interrupts N1 63-32: Clear
746             DSP0PriorityN1InterruptSet1 = 0x39C, // GPIO DSP0 Interrupts N1 63-32: Set
747             DSP0PriorityN1InterruptEnable2 = 0x3A0, // GPIO DSP0 Interrupts N1 95-64: Enable
748             DSP0PriorityN1InterruptStatus2 = 0x3A4, // GPIO DSP0 Interrupts N1 95-64: Status
749             DSP0PriorityN1InterruptClear2 = 0x3A8, // GPIO DSP0 Interrupts N1 95-64: Clear
750             DSP0PriorityN1InterruptSet2 = 0x3AC, // GPIO DSP0 Interrupts N1 95-64: Set
751             DSP0PriorityN1InterruptEnable3 = 0x3B0, // GPIO DSP0 Interrupts N1 127-96: Enable
752             DSP0PriorityN1InterruptStatus3 = 0x3B4, // GPIO DSP0 Interrupts N1 127-96: Status
753             DSP0PriorityN1InterruptClear3 = 0x3B8, // GPIO DSP0 Interrupts N1 127-96: Clear
754             DSP0PriorityN1InterruptSet3 = 0x3BC, // GPIO DSP0 Interrupts N1 127-96: Set
755             DSP1PriorityN0InterruptEnable0 = 0x3C0, // GPIO DSP1 Interrupts N0 31-0: Enable
756             DSP1PriorityN0InterruptStatus0 = 0x3C4, // GPIO DSP1 Interrupts N0 31-0: Status
757             DSP1PriorityN0InterruptClear0 = 0x3C8, // GPIO DSP1 Interrupts N0 31-0: Clear
758             DSP1PriorityN0InterruptSet0 = 0x3CC, // GPIO DSP1 Interrupts N0 31-0: Set
759             DSP1PriorityN0InterruptEnable1 = 0x3D0, // GPIO DSP1 Interrupts N0 63-32: Enable
760             DSP1PriorityN0InterruptStatus1 = 0x3D4, // GPIO DSP1 Interrupts N0 63-32: Status
761             DSP1PriorityN0InterruptClear1 = 0x3D8, // GPIO DSP1 Interrupts N0 63-32: Clear
762             DSP1PriorityN0InterruptSet1 = 0x3DC, // GPIO DSP1 Interrupts N0 63-32: Set
763             DSP1PriorityN0InterruptEnable2 = 0x3E0, // GPIO DSP1 Interrupts N0 95-64: Enable
764             DSP1PriorityN0InterruptStatus2 = 0x3E4, // GPIO DSP1 Interrupts N0 95-64: Status
765             DSP1PriorityN0InterruptClear2 = 0x3E8, // GPIO DSP1 Interrupts N0 95-64: Clear
766             DSP1PriorityN0InterruptSet2 = 0x3EC, // GPIO DSP1 Interrupts N0 95-64: Set
767             DSP1PriorityN0InterruptEnable3 = 0x3F0, // GPIO DSP1 Interrupts N0 127-96: Enable
768             DSP1PriorityN0InterruptStatus3 = 0x3F4, // GPIO DSP1 Interrupts N0 127-96: Status
769             DSP1PriorityN0InterruptClear3 = 0x3F8, // GPIO DSP1 Interrupts N0 127-96: Clear
770             DSP1PriorityN0InterruptSet3 = 0x3FC, // GPIO DSP1 Interrupts N0 127-96: Set
771             DSP1PriorityN1InterruptEnable0 = 0x400, // GPIO DSP1 Interrupts N1 31-0: Enable
772             DSP1PriorityN1InterruptStatus0 = 0x404, // GPIO DSP1 Interrupts N1 31-0: Status
773             DSP1PriorityN1InterruptClear0 = 0x408, // GPIO DSP1 Interrupts N1 31-0: Clear
774             DSP1PriorityN1InterruptSet0 = 0x40C, // GPIO DSP1 Interrupts N1 31-0: Set
775             DSP1PriorityN1InterruptEnable1 = 0x410, // GPIO DSP1 Interrupts N1 63-32: Enable
776             DSP1PriorityN1InterruptStatus1 = 0x414, // GPIO DSP1 Interrupts N1 63-32: Status
777             DSP1PriorityN1InterruptClear1 = 0x418, // GPIO DSP1 Interrupts N1 63-32: Clear
778             DSP1PriorityN1InterruptSet1 = 0x41C, // GPIO DSP1 Interrupts N1 63-32: Set
779             DSP1PriorityN1InterruptEnable2 = 0x420, // GPIO DSP1 Interrupts N1 95-64: Enable
780             DSP1PriorityN1InterruptStatus2 = 0x424, // GPIO DSP1 Interrupts N1 95-64: Status
781             DSP1PriorityN1InterruptClear2 = 0x428, // GPIO DSP1 Interrupts N1 95-64: Clear
782             DSP1PriorityN1InterruptSet2 = 0x42C, // GPIO DSP1 Interrupts N1 95-64: Set
783             DSP1PriorityN1InterruptEnable3 = 0x430, // GPIO DSP1 Interrupts N1 127-96: Enable
784             DSP1PriorityN1InterruptStatus3 = 0x434, // GPIO DSP1 Interrupts N1 127-96: Status
785             DSP1PriorityN1InterruptClear3 = 0x438, // GPIO DSP1 Interrupts N1 127-96: Clear
786             DSP1PriorityN1InterruptSet3 = 0x43C, // GPIO DSP1 Interrupts N1 127-96: Set
787         }
788     }
789 }
790