mirror of
https://github.com/iceHtwoO/novaOS.git
synced 2026-04-17 04:32:27 +00:00
update timer
This commit is contained in:
@@ -51,7 +51,7 @@ macro_rules! mailbox_command {
|
|||||||
return Err(NovaError::Mailbox);
|
return Err(NovaError::Mailbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut out = [0u32; $response_len / 4]; // TODO: Can this be improved?
|
let mut out = [0u32; $response_len / 4];
|
||||||
out.copy_from_slice(&mailbox[5..(5 + $response_len / 4)]);
|
out.copy_from_slice(&mailbox[5..(5 + $response_len / 4)]);
|
||||||
Ok(out)
|
Ok(out)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ pub fn set_rising_edge_detect(gpio: u8, enable: bool) {
|
|||||||
mmio_write(register_addr, new_val);
|
mmio_write(register_addr, new_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn blink_gpio(gpio: u8, duration_ms: u32) {
|
pub fn blink_gpio(gpio: u8, duration_ms: u64) {
|
||||||
let _ = gpio_high(gpio);
|
let _ = gpio_high(gpio);
|
||||||
|
|
||||||
sleep_ms(duration_ms);
|
sleep_ms(duration_ms);
|
||||||
|
|||||||
55
src/timer.rs
55
src/timer.rs
@@ -1,32 +1,61 @@
|
|||||||
use crate::mmio_read;
|
use core::{hint::spin_loop, ptr::read_volatile};
|
||||||
|
|
||||||
const TIMER_CLO: u32 = 0x3F00_3004;
|
const TIMER_CLOCK_LO: u32 = 0x3F00_3004;
|
||||||
|
const TIMER_CLOCK_HI: u32 = 0x3F00_3008;
|
||||||
|
|
||||||
fn read_clo() -> u32 {
|
fn read_timer_32() -> u32 {
|
||||||
mmio_read(TIMER_CLO)
|
unsafe { read_volatile(TIMER_CLOCK_LO as *const u32) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_timer_64() -> u64 {
|
||||||
|
loop {
|
||||||
|
let clock_hi1 = unsafe { read_volatile(TIMER_CLOCK_HI as *const u32) };
|
||||||
|
let clock_lo = unsafe { read_volatile(TIMER_CLOCK_LO as *const u32) };
|
||||||
|
let clock_hi2 = unsafe { read_volatile(TIMER_CLOCK_HI as *const u32) };
|
||||||
|
|
||||||
|
// account for roll over during read
|
||||||
|
if clock_hi1 == clock_hi2 {
|
||||||
|
return ((clock_hi1 as u64) << 32) | clock_lo as u64;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sleep for `us` microseconds
|
/// Sleep for `us` microseconds
|
||||||
pub fn sleep_us(us: u32) {
|
pub fn sleep_us(us: u64) {
|
||||||
let start = read_clo();
|
if us < u32::MAX as u64 {
|
||||||
while read_clo() - start < us {
|
sleep_us_u32(us as u32);
|
||||||
unsafe { core::arch::asm!("nop") }
|
} else {
|
||||||
|
sleep_us_u64(us);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sleep_us_u32(us: u32) {
|
||||||
|
let start = read_timer_32();
|
||||||
|
while read_timer_32().wrapping_sub(start) < us {
|
||||||
|
spin_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sleep_us_u64(us: u64) {
|
||||||
|
let start = read_timer_64();
|
||||||
|
while read_timer_64().wrapping_sub(start) < us {
|
||||||
|
spin_loop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sleep for `ms` milliseconds
|
/// Sleep for `ms` milliseconds
|
||||||
pub fn sleep_ms(ms: u32) {
|
pub fn sleep_ms(ms: u64) {
|
||||||
sleep_us(ms * 1000);
|
sleep_us(ms * 1_000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sleep for `s` seconds
|
/// Sleep for `s` seconds
|
||||||
pub fn sleep_s(s: u32) {
|
pub fn sleep_s(s: u64) {
|
||||||
sleep_us(s * 1000);
|
sleep_ms(s * 1_000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Wait for `count` operations to pass
|
/// Wait for `count` operations to pass
|
||||||
pub fn delay_nops(count: u32) {
|
pub fn delay_nops(count: u32) {
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
unsafe { core::arch::asm!("nop") }
|
spin_loop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user