If a user does not want to use the Vector Address registers, the VIM may be used as a
more traditional interrupt controller. Note that in this mode, priority masking will
not work if route 1b is used (below) as the hardware prioritization may not match
the software prioritization scheme. In this case, software would be responsible for
doing all priority operations
- Determine which interrupt to service
- Read the Prioritized IRQ (Base Address + 0x08) to determine which
interrupt is the highest priority IRQ currently asserted OR
- Optionally read the IRQ Group Status (Base Address + 0x10) to
determine which groups have IRQs pending, then read the Group
M Interrupt IRQ Enabled Status/Clear Register (Base
Address + 0x400 + M*0x20 + 0x10) and use a software
prioritization scheme to determine which IRQ to service
- Service the interrupt
- Read the IRQ Vector Address (Base Address + 0x18)
- Note, this step can be done any time before step 4
- Value is ignored
- Depending on whether the original source of the interrupt was a pulse or a
level (Determined by reading the Group M Type Map Register (Base
Address + 0x200 + M*0x20 + 0x1C) to determine type)
- Pulse
- Clear the status by writing a 1 to the appropriate bit in
the Group M Interrupt Enabled Status/Clear Register
(Base Address + 0x400 + M*0x20 + 0x04) or Group
M Interrupt IRQ Enabled Status/Clear Register
(Base Address + 0x400 + M*0x20 + 0x10)
- Clear the interrupt at the source
- This way, the source can generate another pulse if
it needs to and the VIM will process this as a new
interrupt
- Level
- Clear the interrupt at the source
- Clear the status by writing a 1 to the appropriate bit in
the Group M Interrupt Enabled Status/Clear Register
(Base Address + 0x400 + M*0x20 + 0x04) or Group
M Interrupt IRQ Enabled Status/Clear Register
(Base Address + 0x400 + M*0x20 + 0x10)
- This way, the level should be gone at the input to
the VIM, it will avoid falsely re-calling the
interrupt
- If the source maintains the level, then it means
there is another interrupt
- Write any value to the IRQ Vector Address (Base Address + 0x18)