xref: /DragonOS/kernel/src/driver/timers/hpet/mod.rs (revision b5b571e02693d91eb6918d3b7561e088c3e7ee81)
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