diff --git a/eepy-sys/src/misc.rs b/eepy-sys/src/misc.rs index 880cbdb..f1ceb64 100644 --- a/eepy-sys/src/misc.rs +++ b/eepy-sys/src/misc.rs @@ -11,6 +11,7 @@ use once_cell::sync::OnceCell; pub enum MiscSyscall { GetSerial = 0, LogMessage = 1, + GetTimeMicros = 2, } #[repr(usize)] @@ -87,4 +88,19 @@ pub fn warn(message: &str) { pub fn error(message: &str) { log(message, LogLevel::Error); +} + +pub fn get_time_micros() -> u64 { + let mut low_word: u32; + let mut high_word: u32; + + unsafe { + syscall!( + SyscallNumber::Misc, + out high_word in MiscSyscall::GetTimeMicros, + out low_word, + ) + } + + ((high_word as u64) << 32) | low_word as u64 } \ No newline at end of file diff --git a/eepy/src/syscall.rs b/eepy/src/syscall.rs index a4d572b..af0f0aa 100644 --- a/eepy/src/syscall.rs +++ b/eepy/src/syscall.rs @@ -93,13 +93,15 @@ mod misc { use defmt::{debug, error, info, trace, warn}; use eepy_sys::header::{SLOT_SIZE, XIP_BASE}; use eepy_sys::misc::{LogLevel, MiscSyscall}; - use crate::SERIAL_NUMBER; + use fw16_epd_bsp::pac::Peripherals; + use crate::{SERIAL_NUMBER}; use super::StackFrame; pub(super) fn handle_misc(stack_values: &mut StackFrame) { match MiscSyscall::from_repr(stack_values.r0) { Some(MiscSyscall::GetSerial) => handle_get_serial(stack_values), Some(MiscSyscall::LogMessage) => handle_log_message(stack_values), + Some(MiscSyscall::GetTimeMicros) => handle_get_time_micros(stack_values), None => panic!("illegal syscall"), } } @@ -126,6 +128,12 @@ mod misc { LogLevel::Error => error!("[PROGRAM:{}] {}", slot_n, s), } } + + fn handle_get_time_micros(stack_values: &mut StackFrame) { + let timer = unsafe { Peripherals::steal() }.TIMER; + stack_values.r1 = timer.timelr().read().bits() as usize; + stack_values.r0 = timer.timehr().read().bits() as usize; + } } mod image {