#[cfg(arm_architecture = "v6")]
use arbitrary_int::u4;
use crate::register::{SysReg, SysRegRead, SysRegWrite};
#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v5te")]
pub struct Dfsr {
#[bits([0..=3], rw)]
status: Option<DfsrStatus>,
}
#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v6")]
pub struct Dfsr {
#[bit(11, rw)]
wnr: bool,
#[bits(4..=7, rw)]
domain: u4,
#[bits([0..=3, 10], rw)]
status: Option<DfsrStatus>,
}
#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v7-r")]
pub struct Dfsr {
#[bits([0..=3, 10], rw)]
status: Option<DfsrStatus>,
}
#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v7-a")]
pub struct Dfsr {
#[bit(16, rw)]
fnv: bool,
#[bit(13, rw)]
cm: bool,
#[bit(12, rw)]
ext: bool,
#[bit(11, rw)]
wnr: bool,
#[bits([0..=5], rw)]
status: Option<DfsrStatus>,
}
#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
#[cfg(arm_architecture = "v8-r")]
pub struct Dfsr {
#[bit(16, rw)]
fnv: bool,
#[bit(13, rw)]
cm: bool,
#[bit(12, rw)]
ext: bool,
#[bit(11, rw)]
wnr: bool,
#[bits([0..=5], rw)]
status: Option<DfsrStatus>,
}
#[bitbybit::bitenum(u4, exhaustive = false)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v5te")]
#[derive(Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum DfsrStatus {
AlignmentFault = 1,
Debug = 2,
AlignmentAlt = 3,
TranslationFaultFirstLevel = 5,
TranslationFaultSecondLevel = 7,
SyncExtAbort = 8,
DomainFaultFirstLevel = 9,
SyncExtAbortAlt = 10,
DomainFaultSecondLevel = 11,
SyncExtAbortOnTranslationTableWalkFirstLevel = 12,
PermissionFaultFirstLevel = 13,
SyncExtAbortOnTranslationTableWalkSecondLevel = 14,
PermissionFaultSecondLevel = 15,
}
#[bitbybit::bitenum(u5, exhaustive = false)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v6")]
#[derive(Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum DfsrStatus {
AlignmentFault = 0b00001,
Debug = 0b00010,
AccessFlagFaultFirstLevel = 0b00011,
CacheMaintenance = 0b00100,
TranslationFaultFirstLevel = 0b00101,
AccessFlagFaultSecondLevel = 0b00110,
TranslationFaultSecondLevel = 0b00111,
PreciseExternalAbort = 0b01000,
DomainFaultFirstLevel = 0b01001,
DomainFaultSecondLevel = 0b01011,
SyncExtAbortOnTranslationTableWalkFirstLevel = 0b01100,
PermissionFaultFirstLevel = 0b01101,
SyncExtAbortOnTranslationTableWalkSecondLevel = 0b01110,
PermissionFaultSecondLevel = 0b01111,
ImpreciseExtAbort = 0b10110,
}
#[bitbybit::bitenum(u5, exhaustive = false)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v7-r")]
#[derive(Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum DfsrStatus {
AlignmentFault = 1,
Debug = 2,
Translation = 4,
Permission = 12,
SError = 16,
SErrorInterrupt = 17,
SyncParErrorOnMemAccess = 24,
SErrorParityEccError = 25,
}
#[bitbybit::bitenum(u6, exhaustive = false)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v7-a")]
#[derive(Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum DfsrStatus {
AlignmentFault = 0b00001,
Debug = 0b00010,
AccessFlagFaultFirstLevel = 0b00011,
CacheMaintenance = 0b00100,
TranslationFaultFirstLevel = 0b00101,
AccessFlagFaultSecondLevel = 0b00110,
TranslationFaultSecondLevel = 0b00111,
SyncExtAbort = 0b01000,
DomainFaultFirstLevel = 0b01001,
DomainFaultSecondLevel = 0b01011,
SyncExtAbortOnTranslationTableWalkFirstLevel = 0b01100,
PermissionFaultFirstLevel = 0b01101,
SyncExtAbortOnTranslationTableWalkSecondLevel = 0b01110,
PermissionFaultSecondLevel = 0b01111,
TldConflictAbort = 0b10000,
SError = 0b10110,
SErrorParityEccError = 0b11000,
SyncParErrorOnMemAccess = 0b11001,
SyncParErrorOnTranslationTableWalkFirstLevel = 0b11100,
SyncParErrorOnTranslationTableWalkSecondLevel = 0b11110,
}
#[bitbybit::bitenum(u6, exhaustive = false)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg(arm_architecture = "v8-r")]
#[derive(Debug, PartialEq, Eq)]
#[repr(u8)]
pub enum DfsrStatus {
Translation = 4,
Permission = 12,
SyncExtAbort = 16,
SErrorInterrupt = 17,
SyncParityEccError = 24,
SErrorParityEccError = 25,
AlignmentFault = 33,
Debug = 34,
}
impl SysReg for Dfsr {
const CP: u32 = 15;
const CRN: u32 = 5;
const OP1: u32 = 0;
const CRM: u32 = 0;
const OP2: u32 = 0;
}
impl crate::register::SysRegRead for Dfsr {}
impl Dfsr {
#[inline]
pub fn read() -> Dfsr {
Self::new_with_raw_value(<Self as SysRegRead>::read_raw())
}
}
impl crate::register::SysRegWrite for Dfsr {}
impl Dfsr {
#[inline]
pub unsafe fn write(value: Self) {
unsafe {
<Self as SysRegWrite>::write_raw(value.raw_value());
}
}
}