firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement get_serial syscall

+88 -35
+72 -14
eepy-sys/src/syscall/mod.rs
··· 1 + #[repr(u8)] 2 + #[derive(Copy, Clone, Debug, Eq, PartialEq)] 3 + #[cfg_attr(feature = "defmt", derive(defmt::Format))] 4 + pub enum SyscallNumber { 5 + Misc = 0, 6 + Image = 1, 7 + Input = 2, 8 + Usb = 3, 9 + } 10 + 11 + impl 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 + #[repr(usize)] 26 + #[derive(Copy, Clone, Debug, Eq, PartialEq)] 27 + #[cfg_attr(feature = "defmt", derive(defmt::Format))] 28 + pub enum MiscSyscall { 29 + GetSerial = 0, 30 + } 31 + 32 + impl TryFrom<usize> for MiscSyscall { 33 + type Error = (); 34 + 35 + fn try_from(value: usize) -> Result<Self, Self::Error> { 36 + match value { 37 + x if x == MiscSyscall::GetSerial as usize => Ok(MiscSyscall::GetSerial), 38 + _ => Err(()), 39 + } 40 + } 41 + } 42 + 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 - $( out $r0out:ident )? $( in $r0in:expr )?, 7 - $( out $r1out:ident )? $( in $r1in:expr )?, 8 - $( out $r2out:ident )? $( in $r2in:expr )?, 9 - $( out $r3out:ident )? $( in $r3in:expr )?, 49 + $( out $r0out:ident )? $( in $r0in:expr )? $(, 50 + $( out $r1out:ident )? $( in $r1in:expr )? $(, 51 + $( out $r2out:ident )? $( in $r2in:expr )? $(, 52 + $( out $r3out:ident )? $( in $r3in:expr )? $(,)? 53 + )? 54 + )? 55 + )? 10 56 ) => { 11 - asm!( 57 + ::core::arch::asm!( 12 58 "svc #{syscall_num}", 13 - $( in("r0") $r0in, )? 59 + $( in("r0") $r0in as usize, )? 14 60 $( lateout("r0") $r0out, )? 15 - $( in("r1") $r1in, )? 16 - $( lateout("r1") $r1out, )? 17 - $( in("r2") $r2in, )? 18 - $( lateout("r2") $r2out, )? 19 - $( in("r3") $r3in, )? 20 - $( lateout("r3") $r3out, )? 21 - syscall_num = const $syscall_num, 22 - ); 61 + $( 62 + $( in("r1") $r1in as usize, )? 63 + $( lateout("r1") $r1out, )? 64 + $( 65 + $( in("r2") $r2in as usize, )? 66 + $( lateout("r2") $r2out, )? 67 + $( 68 + $( in("r3") $r3in as usize, )? 69 + $( lateout("r3") $r3out, )? 70 + )? 71 + )? 72 + )? 73 + syscall_num = const $syscall_num as u8, 74 + ) 23 75 } 24 76 } 77 + 78 + pub fn get_serial() -> &'static str { 79 + let mut ptr: *const [u8; 16]; 80 + unsafe { syscall!(SyscallNumber::Misc, out ptr in MiscSyscall::GetSerial) }; 81 + unsafe { core::str::from_utf8_unchecked(&*ptr) } 82 + }
+3 -16
eepy/src/main.rs
··· 15 15 16 16 use core::cell::RefCell; 17 17 use critical_section::Mutex; 18 - use defmt::{debug, info, trace, warn}; 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 - use eepy_sys::{syscall as do_syscall, Event, RefreshBlockMode, SafeOption, TouchEvent, TouchEventType}; 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 - unsafe { 333 - let mut r0: usize; 334 - let mut r1: usize; 335 - let mut r2: usize; 336 - let mut r3: usize; 337 - do_syscall!( 338 - 31, 339 - out r0 in 0, 340 - out r1 in 1, 341 - out r2 in 2, 342 - out r3 in 3, 343 - ); 344 - debug!("{} {} {} {}", r0, r1, r2, r3); 345 - } 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
··· 1 1 use core::arch::{asm, global_asm}; 2 2 use cortex_m_rt::exception; 3 3 use defmt::debug; 4 + use defmt::export::panic; 5 + use eepy_sys::syscall::{MiscSyscall, SyscallNumber}; 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 - let svc_operand = unsafe { (stack_values[6] as *const u8).sub(2).read() }; 22 - debug!("{:x}", svc_operand); 24 + let syscall_num = unsafe { (stack_values[6] as *const u8).sub(2).read() }; 23 25 24 - // Increase the value of R0-R3 by 1 25 - for i in 0..4 { 26 - stack_values[i] += 1; 26 + match SyscallNumber::try_from(syscall_num) { 27 + Ok(SyscallNumber::Misc) => match MiscSyscall::try_from(stack_values[0]) { 28 + Ok(MiscSyscall::GetSerial) => { 29 + let serial = SERIAL_NUMBER.get().unwrap(); 30 + stack_values[0] = (&raw const *serial) as usize; 31 + }, 32 + _ => panic!("illegal syscall"), 33 + }, 34 + _ => panic!("illegal syscall"), 27 35 } 28 36 }