struct GenericTimer;
#[impl_plat_interface]
impl ax_plat::time::TimeIf for GenericTimer {
fn current_ticks() -> u64 {
somehal::timer::ticks() as _
}
fn ticks_to_nanos(ticks: u64) -> u64 {
let freq = somehal::timer::freq() as u64;
if freq == 0 {
return 0;
}
(ticks * ax_plat::time::NANOS_PER_SEC) / freq
}
fn nanos_to_ticks(nanos: u64) -> u64 {
let freq = somehal::timer::freq() as u64;
if freq == 0 {
return 0;
}
(nanos * freq) / ax_plat::time::NANOS_PER_SEC
}
fn epochoffset_nanos() -> u64 {
0
}
#[cfg(feature = "irq")]
fn irq_num() -> usize {
somehal::irq::systick_irq().into()
}
#[cfg(feature = "irq")]
fn set_oneshot_timer(deadline_ns: u64) {
let cnptct = somehal::timer::ticks() as u64;
let deadline = GenericTimer::nanos_to_ticks(deadline_ns);
let interval = if cnptct < deadline {
let interval = deadline - cnptct;
debug_assert!(interval <= u32::MAX as u64);
interval
} else {
0
};
somehal::timer::set_next_event_in_ticks(interval as _);
}
}