xref: /DragonOS/kernel/src/time/timekeep.rs (revision 01876902fbf6ed43992cc7d153bd8c505cb5224b)
1*01876902SGou Ngai #![allow(dead_code)]
2*01876902SGou Ngai use crate::include::bindings::bindings::{rtc_get_cmos_time, rtc_time_t};
3*01876902SGou Ngai 
4*01876902SGou Ngai #[allow(non_camel_case_types)]
5*01876902SGou Ngai pub type ktime_t = i64;
6*01876902SGou Ngai 
7*01876902SGou Ngai // @brief 将ktime_t类型转换为纳秒类型
8*01876902SGou Ngai #[inline]
9*01876902SGou Ngai fn ktime_to_ns(kt: ktime_t) -> i64 {
10*01876902SGou Ngai     return kt as i64;
11*01876902SGou Ngai }
12*01876902SGou Ngai 
13*01876902SGou Ngai /// @brief 从RTC获取当前时间,然后计算时间戳。
14*01876902SGou Ngai /// 时间戳为从UTC+0 1970-01-01 00:00到当前UTC+0时间,所经过的纳秒数。
15*01876902SGou Ngai /// 注意,由于当前未引入时区,因此本函数默认时区为UTC+8来计算
16*01876902SGou Ngai fn ktime_get_real() -> ktime_t {
17*01876902SGou Ngai     let mut rtc_time: rtc_time_t = rtc_time_t {
18*01876902SGou Ngai         second: (0),
19*01876902SGou Ngai         minute: (0),
20*01876902SGou Ngai         hour: (0),
21*01876902SGou Ngai         day: (0),
22*01876902SGou Ngai         month: (0),
23*01876902SGou Ngai         year: (0),
24*01876902SGou Ngai     };
25*01876902SGou Ngai 
26*01876902SGou Ngai     unsafe {
27*01876902SGou Ngai         //调用rtc.h里面的函数
28*01876902SGou Ngai         rtc_get_cmos_time(&mut rtc_time);
29*01876902SGou Ngai     }
30*01876902SGou Ngai 
31*01876902SGou Ngai     let mut day_count: i32 = 0;
32*01876902SGou Ngai     for year in 1970..rtc_time.year {
33*01876902SGou Ngai         let leap: bool = (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
34*01876902SGou Ngai         if leap {
35*01876902SGou Ngai             day_count += 366;
36*01876902SGou Ngai         } else {
37*01876902SGou Ngai             day_count += 365;
38*01876902SGou Ngai         }
39*01876902SGou Ngai         //println!("{},{}",year,day_count);
40*01876902SGou Ngai     }
41*01876902SGou Ngai     //println!("day count1: {}",day_count);
42*01876902SGou Ngai     for month in 1..rtc_time.month {
43*01876902SGou Ngai         match month {
44*01876902SGou Ngai             1 | 3 | 5 | 7 | 8 | 10 | 12 => day_count += 31,
45*01876902SGou Ngai             2 => day_count += 28,
46*01876902SGou Ngai             4 | 6 | 9 | 11 => day_count += 30,
47*01876902SGou Ngai             _ => day_count += 0,
48*01876902SGou Ngai         }
49*01876902SGou Ngai         //println!("{}:{}",month,day_count);
50*01876902SGou Ngai     }
51*01876902SGou Ngai 
52*01876902SGou Ngai     day_count += rtc_time.day - 1;
53*01876902SGou Ngai     //println!("day count2: {}",day_count);
54*01876902SGou Ngai     //转换成纳秒
55*01876902SGou Ngai     let timestamp: ktime_t = day_count as i64 * 86_400_000_000_000i64
56*01876902SGou Ngai         + (rtc_time.hour - 8) as i64 * 3_600_000_000_000i64
57*01876902SGou Ngai         + rtc_time.minute as i64 * 60_000_000_000i64
58*01876902SGou Ngai         + rtc_time.second as i64 * 1_000_000_000i64 as ktime_t;
59*01876902SGou Ngai 
60*01876902SGou Ngai     return timestamp;
61*01876902SGou Ngai }
62*01876902SGou Ngai 
63*01876902SGou Ngai /// @brief 暴露给外部使用的接口,返回一个时间戳
64*01876902SGou Ngai #[inline]
65*01876902SGou Ngai pub fn ktime_get_real_ns() -> i64 {
66*01876902SGou Ngai     let kt: ktime_t = ktime_get_real();
67*01876902SGou Ngai     return ktime_to_ns(kt);
68*01876902SGou Ngai }
69