#[derive(Copy, Clone)]
pub enum InterruptSourceOverridePolarity {
Conform,
ActiveHigh,
ActiveLow = 3,
}
#[derive(Copy, Clone)]
pub enum InterruptSourceOverrideTriggerMode {
Conform,
EdgeTriggered,
LevelTriggered = 3,
}
#[derive(Copy, Clone)]
pub struct MPSINTIFlags(u16);
impl MPSINTIFlags {
pub const fn polarity(&self) -> InterruptSourceOverridePolarity {
match self.0 & 0b0011 {
0b00 => InterruptSourceOverridePolarity::Conform,
0b01 => InterruptSourceOverridePolarity::ActiveHigh,
0b10 => panic!(
"InterruptSourceOverride's Polarity 2-bit flag set to 0b10, which is a reserved value."
),
0b11 => InterruptSourceOverridePolarity::ActiveLow,
_ => unreachable!(),
}
}
pub const fn trigger_mode(&self) -> InterruptSourceOverrideTriggerMode {
match self.0 & 0b1100 {
0b00 => InterruptSourceOverrideTriggerMode::Conform,
0b01 => InterruptSourceOverrideTriggerMode::EdgeTriggered,
0b10 => panic!(
"InterruptSourceOverride's Polarity 2-bit flag set to 0b10, which is a reserved value."
),
0b11 => InterruptSourceOverrideTriggerMode::LevelTriggered,
_ => unreachable!(),
}
}
}
#[derive(Copy, Clone)]
#[repr(C, packed)]
pub struct InterruptSourceOverride {
pub r#type: u8,
pub length: u8,
pub bus: u8,
pub source: u8,
pub global_system_interrupt: u32,
pub flags: MPSINTIFlags,
}