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