1fbe6becdSLoGin use core::ptr::NonNull; 2fbe6becdSLoGin 3fbe6becdSLoGin use crate::libs::volatile::Volatile; 4fbe6becdSLoGin 5fbe6becdSLoGin #[repr(C, packed)] 6fbe6becdSLoGin pub struct HpetRegisters { 7fbe6becdSLoGin capabilties: Volatile<u32>, 8fbe6becdSLoGin period: Volatile<u32>, 9fbe6becdSLoGin _reserved0: Volatile<u64>, 10fbe6becdSLoGin general_config: Volatile<u64>, 11fbe6becdSLoGin _reserved1: Volatile<u64>, 12fbe6becdSLoGin general_intr_status: Volatile<u64>, 13fbe6becdSLoGin _reserved2: [Volatile<u64>; 25], 14fbe6becdSLoGin main_counter_value: Volatile<u64>, 15fbe6becdSLoGin _reserved3: Volatile<u64>, 16fbe6becdSLoGin // 这里后面跟着各个定时器的寄存器(数量由capabilties决定) 17fbe6becdSLoGin } 18fbe6becdSLoGin 19fbe6becdSLoGin impl HpetRegisters { 20fbe6becdSLoGin /// 获取 HPET Timer 的数量 timers_num(&self) -> usize21fbe6becdSLoGin pub fn timers_num(&self) -> usize { 22fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 23fbe6becdSLoGin let cap = unsafe { volread!(p, capabilties) }; 24fbe6becdSLoGin (cap >> 8) as usize & 0x1f 25fbe6becdSLoGin } 26fbe6becdSLoGin 27fbe6becdSLoGin /// 获取 HPET 计数器的周期 counter_clock_period(&self) -> u6428fbe6becdSLoGin pub fn counter_clock_period(&self) -> u64 { 29fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 30fbe6becdSLoGin let period = unsafe { volread!(p, period) }; 31fbe6becdSLoGin period as u64 32fbe6becdSLoGin } 33fbe6becdSLoGin 34fbe6becdSLoGin /// 获取 HPET 计数器的频率 frequency(&self) -> u6435fbe6becdSLoGin pub fn frequency(&self) -> u64 { 36*b5b571e0SLoGin 1_000_000_000_000_000 / self.counter_clock_period() 37fbe6becdSLoGin } 38fbe6becdSLoGin main_counter_value(&self) -> u6439fbe6becdSLoGin pub fn main_counter_value(&self) -> u64 { 40fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 41fbe6becdSLoGin let main_counter_value = unsafe { volread!(p, main_counter_value) }; 42fbe6becdSLoGin main_counter_value 43fbe6becdSLoGin } 44fbe6becdSLoGin write_main_counter_value(&mut self, value: u64)45fbe6becdSLoGin pub unsafe fn write_main_counter_value(&mut self, value: u64) { 46fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 47fbe6becdSLoGin volwrite!(p, main_counter_value, value); 48fbe6becdSLoGin } 49fbe6becdSLoGin 50fbe6becdSLoGin #[allow(dead_code)] general_config(&self) -> u6451fbe6becdSLoGin pub fn general_config(&self) -> u64 { 52fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 53fbe6becdSLoGin unsafe { volread!(p, general_config) } 54fbe6becdSLoGin } 55fbe6becdSLoGin write_general_config(&mut self, value: u64)56fbe6becdSLoGin pub unsafe fn write_general_config(&mut self, value: u64) { 57fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 58fbe6becdSLoGin volwrite!(p, general_config, value); 59fbe6becdSLoGin } 60fbe6becdSLoGin 61fbe6becdSLoGin #[allow(dead_code)] general_intr_status(&self) -> u6462fbe6becdSLoGin pub fn general_intr_status(&self) -> u64 { 63fbe6becdSLoGin let p = NonNull::new(self as *const HpetRegisters as *mut HpetRegisters).unwrap(); 64fbe6becdSLoGin unsafe { volread!(p, general_intr_status) } 65fbe6becdSLoGin } 66fbe6becdSLoGin } 67fbe6becdSLoGin 68fbe6becdSLoGin #[repr(C, packed)] 69fbe6becdSLoGin pub struct HpetTimerRegisters { 70fbe6becdSLoGin pub config: Volatile<u64>, 71fbe6becdSLoGin pub comparator_value: Volatile<u64>, 72fbe6becdSLoGin pub fsb_interrupt_route: [Volatile<u64>; 2], 73fbe6becdSLoGin } 74