1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#![cfg_attr(feature = "std", allow(unused_variables, unreachable_code))]
#[inline]
pub fn wait_for_int() {
#[cfg(feature = "std")]
return unimplemented!();
#[cfg(not(feature = "std"))]
unsafe {
asm!("wfi", options(nomem, nostack, preserves_flags))
}
}
#[inline]
pub fn wait_for_event() {
#[cfg(feature = "std")]
return unimplemented!();
#[cfg(not(feature = "std"))]
unsafe {
asm!("wfe", options(nomem, nostack, preserves_flags));
}
}
#[inline]
pub fn send_event() {
#[cfg(feature = "std")]
return unimplemented!();
#[cfg(not(feature = "std"))]
unsafe {
asm!("sev", options(nomem, nostack, preserves_flags));
}
}
#[allow(clippy::empty_loop)]
#[inline]
pub fn self_reset() -> ! {
#[cfg(feature = "std")]
return unimplemented!();
#[cfg(not(feature = "std"))]
unsafe {
use crate::{map::reg::scb, reg::prelude::*};
use drone_core::token::Token;
asm!("dmb", "cpsid f", options(nomem, nostack, preserves_flags),);
scb::Aircr::<Urt>::take().store(|r| r.write_vectkey(0x05FA).set_sysresetreq());
loop {}
}
}
#[inline(always)]
pub fn spin(cycles: u32) {
#[cfg(feature = "std")]
return unimplemented!();
#[cfg(not(feature = "std"))]
unsafe {
asm!(
"0: subs {0}, {0}, #3",
" bhi 0b",
inlateout(reg) cycles => _,
options(nomem, nostack),
);
}
}
#[cfg(feature = "floating-point-unit")]
#[inline]
pub unsafe fn fpu_init(full_access: bool) {
const FPU_CPACR: usize = 0xE000_ED88;
unsafe {
core::ptr::write_volatile(
FPU_CPACR as *mut u32,
if full_access {
0xF
} else {
0x5
} << 20,
);
}
}