1#[cfg(arm_architecture = "v6")]
4use arbitrary_int::u4;
5
6use crate::register::{SysReg, SysRegRead, SysRegWrite};
7
8#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[cfg(arm_architecture = "v5te")]
12pub struct Dfsr {
13 #[bits([0..=3], rw)]
15 status: Option<DfsrStatus>,
16}
17
18#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
20#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21#[cfg(arm_architecture = "v6")]
22pub struct Dfsr {
23 #[bit(11, rw)]
25 wnr: bool,
26 #[bits(4..=7, rw)]
28 domain: u4,
29 #[bits([0..=3, 10], rw)]
31 status: Option<DfsrStatus>,
32}
33
34#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
36#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
37#[cfg(arm_architecture = "v7-r")]
38pub struct Dfsr {
39 #[bits([0..=3, 10], rw)]
41 status: Option<DfsrStatus>,
42}
43
44#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47#[cfg(arm_architecture = "v7-a")]
48pub struct Dfsr {
49 #[bit(16, rw)]
51 fnv: bool,
52 #[bit(13, rw)]
54 cm: bool,
55 #[bit(12, rw)]
57 ext: bool,
58 #[bit(11, rw)]
60 wnr: bool,
61 #[bits([0..=5], rw)]
63 status: Option<DfsrStatus>,
64}
65
66#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
68#[cfg(arm_architecture = "v8-r")]
69pub struct Dfsr {
70 #[bit(16, rw)]
72 fnv: bool,
73 #[bit(13, rw)]
75 cm: bool,
76 #[bit(12, rw)]
78 ext: bool,
79 #[bit(11, rw)]
81 wnr: bool,
82 #[bits([0..=5], rw)]
84 status: Option<DfsrStatus>,
85}
86
87#[bitbybit::bitenum(u4, exhaustive = false)]
89#[cfg_attr(feature = "defmt", derive(defmt::Format))]
90#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
91#[cfg(arm_architecture = "v5te")]
92#[derive(Debug, PartialEq, Eq)]
93#[repr(u8)]
94pub enum DfsrStatus {
95 AlignmentFault = 1,
97 Debug = 2,
99 AlignmentAlt = 3,
101 TranslationFaultFirstLevel = 5,
103 TranslationFaultSecondLevel = 7,
105 SyncExtAbort = 8,
107 DomainFaultFirstLevel = 9,
109 SyncExtAbortAlt = 10,
111 DomainFaultSecondLevel = 11,
113 SyncExtAbortOnTranslationTableWalkFirstLevel = 12,
115 PermissionFaultFirstLevel = 13,
117 SyncExtAbortOnTranslationTableWalkSecondLevel = 14,
119 PermissionFaultSecondLevel = 15,
121}
122
123#[bitbybit::bitenum(u5, exhaustive = false)]
125#[cfg_attr(feature = "defmt", derive(defmt::Format))]
126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
127#[cfg(arm_architecture = "v6")]
128#[derive(Debug, PartialEq, Eq)]
129#[repr(u8)]
130pub enum DfsrStatus {
131 AlignmentFault = 0b00001,
133 Debug = 0b00010,
135 AccessFlagFaultFirstLevel = 0b00011,
137 CacheMaintenance = 0b00100,
139 TranslationFaultFirstLevel = 0b00101,
141 AccessFlagFaultSecondLevel = 0b00110,
143 TranslationFaultSecondLevel = 0b00111,
145 PreciseExternalAbort = 0b01000,
147 DomainFaultFirstLevel = 0b01001,
149 DomainFaultSecondLevel = 0b01011,
151 SyncExtAbortOnTranslationTableWalkFirstLevel = 0b01100,
153 PermissionFaultFirstLevel = 0b01101,
155 SyncExtAbortOnTranslationTableWalkSecondLevel = 0b01110,
157 PermissionFaultSecondLevel = 0b01111,
159 ImpreciseExtAbort = 0b10110,
161}
162
163#[bitbybit::bitenum(u5, exhaustive = false)]
165#[cfg_attr(feature = "defmt", derive(defmt::Format))]
166#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
167#[cfg(arm_architecture = "v7-r")]
168#[derive(Debug, PartialEq, Eq)]
169#[repr(u8)]
170pub enum DfsrStatus {
171 AlignmentFault = 1,
173 Debug = 2,
175 Translation = 4,
177 Permission = 12,
179 SError = 16,
181 SErrorInterrupt = 17,
183 SyncParErrorOnMemAccess = 24,
185 SErrorParityEccError = 25,
187}
188
189#[bitbybit::bitenum(u6, exhaustive = false)]
191#[cfg_attr(feature = "defmt", derive(defmt::Format))]
192#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
193#[cfg(arm_architecture = "v7-a")]
194#[derive(Debug, PartialEq, Eq)]
195#[repr(u8)]
196pub enum DfsrStatus {
197 AlignmentFault = 0b00001,
199 Debug = 0b00010,
201 AccessFlagFaultFirstLevel = 0b00011,
203 CacheMaintenance = 0b00100,
205 TranslationFaultFirstLevel = 0b00101,
207 AccessFlagFaultSecondLevel = 0b00110,
209 TranslationFaultSecondLevel = 0b00111,
211 SyncExtAbort = 0b01000,
213 DomainFaultFirstLevel = 0b01001,
215 DomainFaultSecondLevel = 0b01011,
217 SyncExtAbortOnTranslationTableWalkFirstLevel = 0b01100,
219 PermissionFaultFirstLevel = 0b01101,
221 SyncExtAbortOnTranslationTableWalkSecondLevel = 0b01110,
223 PermissionFaultSecondLevel = 0b01111,
225 TldConflictAbort = 0b10000,
227 SError = 0b10110,
229 SErrorParityEccError = 0b11000,
231 SyncParErrorOnMemAccess = 0b11001,
233 SyncParErrorOnTranslationTableWalkFirstLevel = 0b11100,
235 SyncParErrorOnTranslationTableWalkSecondLevel = 0b11110,
237}
238
239#[bitbybit::bitenum(u6, exhaustive = false)]
241#[cfg_attr(feature = "defmt", derive(defmt::Format))]
242#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
243#[cfg(arm_architecture = "v8-r")]
244#[derive(Debug, PartialEq, Eq)]
245#[repr(u8)]
246pub enum DfsrStatus {
247 Translation = 4,
249 Permission = 12,
251 SyncExtAbort = 16,
253 SErrorInterrupt = 17,
255 SyncParityEccError = 24,
257 SErrorParityEccError = 25,
259 AlignmentFault = 33,
261 Debug = 34,
263}
264
265impl SysReg for Dfsr {
266 const CP: u32 = 15;
267 const CRN: u32 = 5;
268 const OP1: u32 = 0;
269 const CRM: u32 = 0;
270 const OP2: u32 = 0;
271}
272
273impl crate::register::SysRegRead for Dfsr {}
274
275impl Dfsr {
276 #[inline]
277 pub fn read() -> Dfsr {
279 Self::new_with_raw_value(<Self as SysRegRead>::read_raw())
280 }
281}
282
283impl crate::register::SysRegWrite for Dfsr {}
284
285impl Dfsr {
286 #[inline]
287 pub unsafe fn write(value: Self) {
293 unsafe {
294 <Self as SysRegWrite>::write_raw(value.raw_value());
295 }
296 }
297}