···11+#[repr(usize)]
22+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
33+#[cfg_attr(feature = "defmt", derive(defmt::Format))]
44+pub enum CsSyscall {
55+ Acquire = 0,
66+ Release = 1,
77+}
88+99+impl TryFrom<usize> for CsSyscall {
1010+ type Error = ();
1111+1212+ fn try_from(value: usize) -> Result<Self, Self::Error> {
1313+ match value {
1414+ x if x == CsSyscall::Acquire as usize => Ok(CsSyscall::Acquire),
1515+ x if x == CsSyscall::Release as usize => Ok(CsSyscall::Release),
1616+ _ => Err(()),
1717+ }
1818+ }
1919+}
+25
eepy-sys/src/critical_section_impl.rs
···11+use crate::critical_section::CsSyscall;
22+use crate::syscall;
33+use crate::syscall::SyscallNumber;
44+55+struct EepyCs;
66+critical_section::set_impl!(EepyCs);
77+88+unsafe impl critical_section::Impl for EepyCs {
99+ unsafe fn acquire() -> bool {
1010+ let mut state: bool;
1111+ syscall!(
1212+ SyscallNumber::CriticalSection,
1313+ out state in CsSyscall::Acquire,
1414+ );
1515+ state
1616+ }
1717+1818+ unsafe fn release(state: bool) {
1919+ syscall!(
2020+ SyscallNumber::CriticalSection,
2121+ in CsSyscall::Release,
2222+ in state,
2323+ );
2424+ }
2525+}
+4
eepy-sys/src/lib.rs
···77pub mod input;
88pub mod usb;
99pub mod exec;
1010+pub mod critical_section;
1111+1212+#[cfg(feature = "critical-section-impl")]
1313+mod critical_section_impl;
10141115pub use tp370pgh01::IMAGE_BYTES;
1216
···77 Input = 2,
88 Usb = 3,
99 Exec = 4,
1010+ CriticalSection = 5,
1011}
11121213impl TryFrom<u8> for SyscallNumber {
···1920 x if x == SyscallNumber::Input as u8 => Ok(SyscallNumber::Input),
2021 x if x == SyscallNumber::Usb as u8 => Ok(SyscallNumber::Usb),
2122 x if x == SyscallNumber::Exec as u8 => Ok(SyscallNumber::Exec),
2323+ x if x == SyscallNumber::CriticalSection as u8 => Ok(SyscallNumber::CriticalSection),
2224 _ => Err(()),
2325 }
2426 }