firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
1#[repr(u8)]
2#[derive(Copy, Clone, Debug, Eq, PartialEq)]
3#[cfg_attr(feature = "defmt", derive(defmt::Format))]
4pub enum SyscallNumber {
5 Misc = 0,
6 Image = 1,
7 Input = 2,
8 Usb = 3,
9 Exec = 4,
10 CriticalSection = 5,
11 Flash = 6,
12}
13
14impl TryFrom<u8> for SyscallNumber {
15 type Error = ();
16
17 fn try_from(value: u8) -> Result<Self, Self::Error> {
18 match value {
19 x if x == SyscallNumber::Misc as u8 => Ok(SyscallNumber::Misc),
20 x if x == SyscallNumber::Image as u8 => Ok(SyscallNumber::Image),
21 x if x == SyscallNumber::Input as u8 => Ok(SyscallNumber::Input),
22 x if x == SyscallNumber::Usb as u8 => Ok(SyscallNumber::Usb),
23 x if x == SyscallNumber::Exec as u8 => Ok(SyscallNumber::Exec),
24 x if x == SyscallNumber::CriticalSection as u8 => Ok(SyscallNumber::CriticalSection),
25 x if x == SyscallNumber::Flash as u8 => Ok(SyscallNumber::Flash),
26 _ => Err(()),
27 }
28 }
29}
30
31/// Perform a raw system call.
32#[macro_export]
33#[cfg(all(target_os = "none", target_arch = "arm"))]
34macro_rules! syscall {
35 (
36 $syscall_num:expr,
37 $( out $r0out:ident )? $( in $r0in:expr )? $(,
38 $( out $r1out:ident )? $( in $r1in:expr )? $(,
39 $( out $r2out:ident )? $( in $r2in:expr )? $(,
40 $( out $r3out:ident )? $( in $r3in:expr )? $(,)?
41 )?
42 )?
43 )?
44 ) => {
45 ::core::arch::asm!(
46 "svc #{syscall_num}",
47 $( in("r0") $r0in as usize, )?
48 $( lateout("r0") $r0out, )?
49 $(
50 $( in("r1") $r1in as usize, )?
51 $( lateout("r1") $r1out, )?
52 $(
53 $( in("r2") $r2in as usize, )?
54 $( lateout("r2") $r2out, )?
55 $(
56 $( in("r3") $r3in as usize, )?
57 $( lateout("r3") $r3out, )?
58 )?
59 )?
60 )?
61 syscall_num = const $syscall_num as u8,
62 )
63 }
64}
65
66#[macro_export]
67#[cfg(not(all(target_os = "none", target_arch = "arm")))]
68macro_rules! syscall {
69 ( $( $_foo:tt )* ) => { panic!("Cannot use eepyOS syscalls on non-eepyOS platforms") };
70}