alpha
Login
or
Join now
arthomnix.dev
/
eepy
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
Implement get_serial syscall
author
arthomnix
date
1 year ago
(Jan 24, 2025, 9:35 PM UTC)
commit
32b03616
32b03616a7cdb349ddb2c9b051998b77de74abee
parent
0eeb749f
0eeb749f8abfbfc75982073c7a1bd55c946fcfb5
+88
-35
3 changed files
Expand all
Collapse all
Unified
Split
eepy
src
main.rs
syscall.rs
eepy-sys
src
syscall
mod.rs
+72
-14
eepy-sys/src/syscall/mod.rs
Reviewed
···
1
1
+
#[repr(u8)]
2
2
+
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
3
3
+
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
4
4
+
pub enum SyscallNumber {
5
5
+
Misc = 0,
6
6
+
Image = 1,
7
7
+
Input = 2,
8
8
+
Usb = 3,
9
9
+
}
10
10
+
11
11
+
impl TryFrom<u8> for SyscallNumber {
12
12
+
type Error = ();
13
13
+
14
14
+
fn try_from(value: u8) -> Result<Self, Self::Error> {
15
15
+
match value {
16
16
+
x if x == SyscallNumber::Misc as u8 => Ok(SyscallNumber::Misc),
17
17
+
x if x == SyscallNumber::Image as u8 => Ok(SyscallNumber::Image),
18
18
+
x if x == SyscallNumber::Input as u8 => Ok(SyscallNumber::Input),
19
19
+
x if x == SyscallNumber::Usb as u8 => Ok(SyscallNumber::Usb),
20
20
+
_ => Err(()),
21
21
+
}
22
22
+
}
23
23
+
}
24
24
+
25
25
+
#[repr(usize)]
26
26
+
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
27
27
+
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
28
28
+
pub enum MiscSyscall {
29
29
+
GetSerial = 0,
30
30
+
}
31
31
+
32
32
+
impl TryFrom<usize> for MiscSyscall {
33
33
+
type Error = ();
34
34
+
35
35
+
fn try_from(value: usize) -> Result<Self, Self::Error> {
36
36
+
match value {
37
37
+
x if x == MiscSyscall::GetSerial as usize => Ok(MiscSyscall::GetSerial),
38
38
+
_ => Err(()),
39
39
+
}
40
40
+
}
41
41
+
}
42
42
+
43
43
+
1
44
/// Perform a raw system call.
2
45
#[macro_export]
3
46
macro_rules! syscall {
4
47
(
5
48
$syscall_num:expr,
6
6
-
$( out $r0out:ident )? $( in $r0in:expr )?,
7
7
-
$( out $r1out:ident )? $( in $r1in:expr )?,
8
8
-
$( out $r2out:ident )? $( in $r2in:expr )?,
9
9
-
$( out $r3out:ident )? $( in $r3in:expr )?,
49
49
+
$( out $r0out:ident )? $( in $r0in:expr )? $(,
50
50
+
$( out $r1out:ident )? $( in $r1in:expr )? $(,
51
51
+
$( out $r2out:ident )? $( in $r2in:expr )? $(,
52
52
+
$( out $r3out:ident )? $( in $r3in:expr )? $(,)?
53
53
+
)?
54
54
+
)?
55
55
+
)?
10
56
) => {
11
11
-
asm!(
57
57
+
::core::arch::asm!(
12
58
"svc #{syscall_num}",
13
13
-
$( in("r0") $r0in, )?
59
59
+
$( in("r0") $r0in as usize, )?
14
60
$( lateout("r0") $r0out, )?
15
15
-
$( in("r1") $r1in, )?
16
16
-
$( lateout("r1") $r1out, )?
17
17
-
$( in("r2") $r2in, )?
18
18
-
$( lateout("r2") $r2out, )?
19
19
-
$( in("r3") $r3in, )?
20
20
-
$( lateout("r3") $r3out, )?
21
21
-
syscall_num = const $syscall_num,
22
22
-
);
61
61
+
$(
62
62
+
$( in("r1") $r1in as usize, )?
63
63
+
$( lateout("r1") $r1out, )?
64
64
+
$(
65
65
+
$( in("r2") $r2in as usize, )?
66
66
+
$( lateout("r2") $r2out, )?
67
67
+
$(
68
68
+
$( in("r3") $r3in as usize, )?
69
69
+
$( lateout("r3") $r3out, )?
70
70
+
)?
71
71
+
)?
72
72
+
)?
73
73
+
syscall_num = const $syscall_num as u8,
74
74
+
)
23
75
}
24
76
}
77
77
+
78
78
+
pub fn get_serial() -> &'static str {
79
79
+
let mut ptr: *const [u8; 16];
80
80
+
unsafe { syscall!(SyscallNumber::Misc, out ptr in MiscSyscall::GetSerial) };
81
81
+
unsafe { core::str::from_utf8_unchecked(&*ptr) }
82
82
+
}
+3
-16
eepy/src/main.rs
Reviewed
···
15
15
16
16
use core::cell::RefCell;
17
17
use critical_section::Mutex;
18
18
-
use defmt::{debug, info, trace, warn};
18
18
+
use defmt::{debug, info, println, trace, warn};
19
19
use embedded_hal::delay::DelayNs;
20
20
use embedded_hal::digital::OutputPin;
21
21
use embedded_hal::i2c::I2c;
···
39
39
use fw16_epd_bsp::pac::I2C0;
40
40
use fw16_epd_bsp::pac::interrupt;
41
41
use eepy_gui::draw_target::EpdDrawTarget;
42
42
-
use eepy_sys::{syscall as do_syscall, Event, RefreshBlockMode, SafeOption, TouchEvent, TouchEventType};
42
42
+
use eepy_sys::{Event, RefreshBlockMode, SafeOption, TouchEvent, TouchEventType};
43
43
use tp370pgh01::rp2040::{Rp2040PervasiveSpiDelays, IoPin};
44
44
use tp370pgh01::{Tp370pgh01, IMAGE_BYTES};
45
45
use crate::ringbuffer::RingBuffer;
···
329
329
}*/
330
330
331
331
// Test syscall
332
332
-
unsafe {
333
333
-
let mut r0: usize;
334
334
-
let mut r1: usize;
335
335
-
let mut r2: usize;
336
336
-
let mut r3: usize;
337
337
-
do_syscall!(
338
338
-
31,
339
339
-
out r0 in 0,
340
340
-
out r1 in 1,
341
341
-
out r2 in 2,
342
342
-
out r3 in 3,
343
343
-
);
344
344
-
debug!("{} {} {} {}", r0, r1, r2, r3);
345
345
-
}
332
332
+
println!("{}", eepy_sys::syscall::get_serial());
346
333
347
334
let draw_target = EpdDrawTarget::new(write_image, refresh);
348
335
gui::gui_main(draw_target);
+13
-5
eepy/src/syscall.rs
Reviewed
···
1
1
use core::arch::{asm, global_asm};
2
2
use cortex_m_rt::exception;
3
3
use defmt::debug;
4
4
+
use defmt::export::panic;
5
5
+
use eepy_sys::syscall::{MiscSyscall, SyscallNumber};
6
6
+
use crate::SERIAL_NUMBER;
4
7
5
8
global_asm!(include_str!("syscall.s"));
6
9
···
18
21
extern "C" fn syscall(sp: *mut usize) {
19
22
// Stack contains R0, R1, R2, R3, R12, LR, ReturnAddress, xPSR
20
23
let stack_values = unsafe { core::slice::from_raw_parts_mut(sp, 8) };
21
21
-
let svc_operand = unsafe { (stack_values[6] as *const u8).sub(2).read() };
22
22
-
debug!("{:x}", svc_operand);
24
24
+
let syscall_num = unsafe { (stack_values[6] as *const u8).sub(2).read() };
23
25
24
24
-
// Increase the value of R0-R3 by 1
25
25
-
for i in 0..4 {
26
26
-
stack_values[i] += 1;
26
26
+
match SyscallNumber::try_from(syscall_num) {
27
27
+
Ok(SyscallNumber::Misc) => match MiscSyscall::try_from(stack_values[0]) {
28
28
+
Ok(MiscSyscall::GetSerial) => {
29
29
+
let serial = SERIAL_NUMBER.get().unwrap();
30
30
+
stack_values[0] = (&raw const *serial) as usize;
31
31
+
},
32
32
+
_ => panic!("illegal syscall"),
33
33
+
},
34
34
+
_ => panic!("illegal syscall"),
27
35
}
28
36
}