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}
10
11impl TryFrom<u8> for SyscallNumber {
12 type Error = ();
13
14 fn try_from(value: u8) -> Result<Self, Self::Error> {
15 match value {
16 x if x == SyscallNumber::Misc as u8 => Ok(SyscallNumber::Misc),
17 x if x == SyscallNumber::Image as u8 => Ok(SyscallNumber::Image),
18 x if x == SyscallNumber::Input as u8 => Ok(SyscallNumber::Input),
19 x if x == SyscallNumber::Usb as u8 => Ok(SyscallNumber::Usb),
20 _ => Err(()),
21 }
22 }
23}
24
25/// Perform a raw system call.
26#[macro_export]
27macro_rules! syscall {
28 (
29 $syscall_num:expr,
30 $( out $r0out:ident )? $( in $r0in:expr )? $(,
31 $( out $r1out:ident )? $( in $r1in:expr )? $(,
32 $( out $r2out:ident )? $( in $r2in:expr )? $(,
33 $( out $r3out:ident )? $( in $r3in:expr )? $(,)?
34 )?
35 )?
36 )?
37 ) => {
38 ::core::arch::asm!(
39 "svc #{syscall_num}",
40 $( in("r0") $r0in as usize, )?
41 $( lateout("r0") $r0out, )?
42 $(
43 $( in("r1") $r1in as usize, )?
44 $( lateout("r1") $r1out, )?
45 $(
46 $( in("r2") $r2in as usize, )?
47 $( lateout("r2") $r2out, )?
48 $(
49 $( in("r3") $r3in as usize, )?
50 $( lateout("r3") $r3out, )?
51 )?
52 )?
53 )?
54 syscall_num = const $syscall_num as u8,
55 )
56 }
57}