1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 #ifndef __OAL_TIME_H__
20 #define __OAL_TIME_H__
21
22 /* ****************************************************************************
23 1 其他头文件包含
24 **************************************************************************** */
25 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
26 #include <linux/jiffies.h>
27 #include <linux/time.h>
28 #include <linux/ktime.h>
29 #include <linux/rtc.h>
30 #endif
31
32 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
33 #include <los_sys.h>
34 #include <linux/kernel.h>
35 #include "hi_types.h"
36 #include <linux/hrtimer.h>
37 #include <linux/rtc.h>
38 #endif
39
40 #ifdef __cplusplus
41 #if __cplusplus
42 extern "C" {
43 #endif
44 #endif
45
46 /* ****************************************************************************
47 2 宏定义
48 **************************************************************************** */
49 /* 32位寄存器最大长度 */
50 #define OAL_TIME_US_MAX_LEN (0xFFFFFFFF - 1)
51
52 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
53 /* 获取毫秒级时间戳 */
54 #define hi_get_milli_seconds() jiffies_to_msecs(jiffies)
55 #endif
56 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
57 #define hi_get_milli_seconds() LOS_Tick2MS(OAL_TIME_JIFFY)
58 #endif
59
60 /* 获取高精度毫秒时间戳,精度1ms */
61 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
62 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0))
63 #define OAL_TIME_GET_HIGH_PRECISION_MS() oal_get_time_stamp_from_timeval()
64 #endif
65 #endif
66
67 #define OAL_ENABLE_CYCLE_COUNT()
68 #define OAL_DISABLE_CYCLE_COUNT()
69 #define OAL_GET_CYCLE_COUNT() 0
70
71 /* 寄存器反转模块运行时间计算 */
72 #define OAL_TIME_CALC_RUNTIME(_ul_start, _ul_end) \
73 ((((OAL_TIME_US_MAX_LEN) / HZ) * 1000) + ((OAL_TIME_US_MAX_LEN) % HZ) * (1000 / HZ) - (_ul_start) + (_ul_end))
74
75 #define OAL_TIME_HZ HZ
76
77 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
78 #define OAL_TIME_JIFFY jiffies
79 #define OAL_MSECS_TO_JIFFIES(_msecs) msecs_to_jiffies(_msecs)
80
81 #define OAL_JIFFIES_TO_MSECS(_jiffies) jiffies_to_msecs(_jiffies)
82 #endif
83
84 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
85 #define OAL_TIME_JIFFY LOS_TickCountGet()
86 #define OAL_MSECS_TO_JIFFIES(_msecs) LOS_MS2Tick(_msecs)
87 #define OAL_JIFFIES_TO_MSECS(_jiffies) LOS_Tick2MS(_jiffies)
88 #endif
89
90 /* 获取从_ul_start到_ul_end的时间差 */
91 #define OAL_TIME_GET_RUNTIME(_ul_start, _ul_end) \
92 (((_ul_start) > (_ul_end)) ? (OAL_TIME_CALC_RUNTIME((_ul_start), (_ul_end))) : ((_ul_end) - (_ul_start)))
93
94 /* ****************************************************************************
95 3 枚举定义
96 **************************************************************************** */
97 /* ****************************************************************************
98 4 全局变量声明
99 **************************************************************************** */
100 /* ****************************************************************************
101 5 消息头定义
102 **************************************************************************** */
103 /* ****************************************************************************
104 6 消息定义
105 **************************************************************************** */
106 /* ****************************************************************************
107 7 STRUCT定义
108 **************************************************************************** */
109 typedef struct {
110 signed long i_sec;
111 signed long i_usec;
112 } oal_time_us_stru;
113
114 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
115 typedef ktime_t oal_time_t_stru;
116 #endif
117
118 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
119 typedef union ktime oal_time_t_stru;
120
121 #ifndef ktime_t
122 #define ktime_t union ktime
123 #endif
124
125 #endif
126 typedef struct timeval oal_timeval_stru;
127 typedef struct rtc_time oal_rtctime_stru;
128
129 /* ****************************************************************************
130 8 UNION定义
131 **************************************************************************** */
132 /* ****************************************************************************
133 9 OTHERS定义
134 **************************************************************************** */
135 /* ****************************************************************************
136 10 函数声明
137 **************************************************************************** */
138 #if (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
139
140 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0))
141 /* ****************************************************************************
142 功能描述 : 获取微妙精度级的时间戳
143 输入参数 : pst_usec: 时间结构体指针
144 输出参数 : 无
145 返 回 值 :
146 **************************************************************************** */
oal_time_get_stamp_us(oal_time_us_stru * pst_usec)147 static inline hi_void oal_time_get_stamp_us(oal_time_us_stru *pst_usec)
148 {
149 struct timespec ts;
150 getnstimeofday(&ts);
151 pst_usec->i_sec = ts.tv_sec;
152 pst_usec->i_usec = ts.tv_nsec / 1000; /* 1us 是 1000ns */
153 }
154 #endif
155 /* ****************************************************************************
156 功能描述 : 调用内核函数获取当前时间戳
157 输入参数 : hi_void
158 输出参数 :
159 返 回 值 :
160 **************************************************************************** */
oal_ktime_get(hi_void)161 static inline oal_time_t_stru oal_ktime_get(hi_void)
162 {
163 return ktime_get();
164 }
165
166 /* ****************************************************************************
167 功能描述 : 调用内核函数获取时间差值
168 输入参数 :
169 输出参数 :
170 返 回 值 :
171 **************************************************************************** */
oal_ktime_sub(const oal_time_t_stru lhs,const oal_time_t_stru rhs)172 static inline oal_time_t_stru oal_ktime_sub(const oal_time_t_stru lhs, const oal_time_t_stru rhs)
173 {
174 return ktime_sub(lhs, rhs);
175 }
176
177 #if (LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0))
178 /* ****************************************************************************
179 功能描述 : 获取时间精度
180 输入参数 : 无
181 输出参数 : 无
182 返 回 值 :
183 **************************************************************************** */
oal_get_time_stamp_from_timeval(hi_void)184 static inline hi_u64 oal_get_time_stamp_from_timeval(hi_void)
185 {
186 struct timeval tv;
187 hi_u64 curr_time;
188
189 do_gettimeofday(&tv);
190 curr_time = tv.tv_usec;
191 do_div(curr_time, 1000); /* div 1000 */
192 curr_time = curr_time + tv.tv_sec * 1000; /* mul 1000 */
193
194 return curr_time;
195 }
196
oal_do_gettimeofday(oal_timeval_stru * tv)197 static inline hi_void oal_do_gettimeofday(oal_timeval_stru *tv)
198 {
199 do_gettimeofday(tv);
200 }
201
oal_rtc_time_to_tm(unsigned long time,oal_rtctime_stru * tm)202 static inline hi_void oal_rtc_time_to_tm(unsigned long time, oal_rtctime_stru *tm)
203 {
204 rtc_time_to_tm(time, tm);
205 }
206 #endif
207
208 /* ****************************************************************************
209 功能描述 : 判断ul_time是否比当前时间早
210 若早,表示超时时间已过;若不早,表明还未超时
211 输入参数 : unsigned long ui_time
212 输出参数 : 无
213 返 回 值 : static inline hi_u32
214 **************************************************************************** */
oal_time_is_before(unsigned long ui_time)215 static inline hi_u32 oal_time_is_before(unsigned long ui_time)
216 {
217 return (hi_u32)time_is_before_jiffies(ui_time);
218 }
219
220 /* ****************************************************************************
221 功能描述 : 判断时间戳ul_time_a是否在ul_time_b之后:
222 输入参数 : unsigned long ui_time
223 输出参数 : 无
224 返 回 值 : Return: 1 ul_time_a在ul_time_b之后; 否则 Return: 0
225 **************************************************************************** */
oal_time_after(hi_u64 ul_time_a,hi_u64 ul_time_b)226 static inline hi_u32 oal_time_after(hi_u64 ul_time_a, hi_u64 ul_time_b)
227 {
228 return (hi_u32)time_after((unsigned long)ul_time_a, (unsigned long)ul_time_b);
229 }
230
oal_ktime_to_us(const oal_time_t_stru kt)231 static inline unsigned long oal_ktime_to_us(const oal_time_t_stru kt)
232 {
233 return ktime_to_us(kt);
234 }
235
oal_time_before_eq(hi_u32 ul_time_a,hi_u32 ul_time_b)236 static inline hi_u32 oal_time_before_eq(hi_u32 ul_time_a, hi_u32 ul_time_b)
237 {
238 return (hi_u32)time_before_eq((unsigned long)ul_time_a, (unsigned long)ul_time_b);
239 }
240
oal_time_before(hi_u32 ul_time_a,hi_u32 ul_time_b)241 static inline hi_u32 oal_time_before(hi_u32 ul_time_a, hi_u32 ul_time_b)
242 {
243 return (hi_u32)time_before((unsigned long)ul_time_a, (unsigned long)ul_time_b);
244 }
245 #endif
246
247 #if (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
248 /* ****************************************************************************
249 功能描述 : 获取微妙精度级的时间戳
250 输入参数 : pst_usec: 时间结构体指针
251 输出参数 : 无
252 返 回 值 :
253 **************************************************************************** */
oal_time_get_stamp_us(oal_time_us_stru * pst_usec)254 static inline hi_void oal_time_get_stamp_us(oal_time_us_stru *pst_usec)
255 {
256 oal_timeval_stru tv;
257 do_gettimeofday(&tv);
258 pst_usec->i_sec = tv.tv_sec;
259 pst_usec->i_usec = tv.tv_usec;
260 }
261
262 /* ****************************************************************************
263 功能描述 : 调用内核函数获取当前时间戳
264 输入参数 : hi_void
265 输出参数 :
266 返 回 值 :
267 **************************************************************************** */
oal_ktime_get(hi_void)268 static inline oal_time_t_stru oal_ktime_get(hi_void)
269 {
270 oal_time_t_stru time;
271 time.tv64 = (hi_s64)LOS_TickCountGet();
272 return time;
273 }
274
275 /* ****************************************************************************
276 功能描述 : 调用内核函数获取时间差值
277 输入参数 :
278 输出参数 :
279 返 回 值 :
280 **************************************************************************** */
oal_ktime_sub(const oal_time_t_stru lhs,const oal_time_t_stru rhs)281 static inline oal_time_t_stru oal_ktime_sub(const oal_time_t_stru lhs, const oal_time_t_stru rhs)
282 {
283 oal_time_t_stru res;
284 res.tv64 = lhs.tv64 - rhs.tv64;
285 return res;
286 }
287
288 /* ****************************************************************************
289 功能描述 : 获取时间精度
290 输入参数 : 无
291 输出参数 : 无
292 返 回 值 :
293 **************************************************************************** */
oal_get_time_stamp_from_timeval(hi_void)294 static inline hi_u64 oal_get_time_stamp_from_timeval(hi_void)
295 {
296 oal_timeval_stru tv;
297 do_gettimeofday(&tv);
298 return ((hi_u64)tv.tv_usec / 1000 + (hi_u64)tv.tv_sec * 1000); /* div/mul 1000 */
299 }
300
oal_do_gettimeofday(oal_timeval_stru * tv)301 static inline hi_void oal_do_gettimeofday(oal_timeval_stru *tv)
302 {
303 do_gettimeofday(tv);
304 }
305
306 /* ****************************************************************************
307 功能描述 : 判断时间戳ul_time_a是否在ul_time_b之后:
308 输入参数 : hi_u64 ui_time
309 输出参数 : 无
310 返 回 值 : Return: 1 ul_time_a在ul_time_b之后; 否则 Return: 0
311 **************************************************************************** */
oal_time_after(hi_u64 ul_time_a,hi_u64 ul_time_b)312 static inline hi_u32 oal_time_after(hi_u64 ul_time_a, hi_u64 ul_time_b)
313 {
314 return (hi_u32)((hi_s64)((hi_s64)(ul_time_b) - (ul_time_a)) < 0);
315 }
316
317 /* ****************************************************************************
318 功能描述 : 判断ul_time是否比当前时间早
319 若早,表示超时时间已过;若不早,表明还未超时
320 输入参数 :
321 输出参数 : 无
322 返 回 值 :
323 **************************************************************************** */
oal_time_is_before(hi_u64 ui_time)324 static inline hi_u32 oal_time_is_before(hi_u64 ui_time)
325 {
326 return oal_time_after(OAL_TIME_JIFFY, ui_time);
327 }
328
oal_ktime_to_us(const oal_time_t_stru kt)329 static inline hi_u64 oal_ktime_to_us(const oal_time_t_stru kt)
330 {
331 return (OAL_JIFFIES_TO_MSECS((hi_u32)kt.tv64) * 1000); /* mul 1000 */
332 }
333
oal_ktime_to_ms(const oal_time_t_stru kt)334 static inline hi_u64 oal_ktime_to_ms(const oal_time_t_stru kt)
335 {
336 return (OAL_JIFFIES_TO_MSECS(kt.tv64));
337 }
338
oal_time_before_eq(hi_u32 ul_time_a,hi_u32 ul_time_b)339 static inline hi_u32 oal_time_before_eq(hi_u32 ul_time_a, hi_u32 ul_time_b)
340 {
341 return (hi_u32)((hi_s64)((ul_time_a) - (ul_time_b)) <= 0);
342 }
343
oal_time_before(hi_u32 ul_time_a,hi_u32 ul_time_b)344 static inline hi_u32 oal_time_before(hi_u32 ul_time_a, hi_u32 ul_time_b)
345 {
346 return (hi_u32)((hi_s64)((hi_s64)(ul_time_a) - (ul_time_b)) < 0);
347 }
348
349 #endif
350
351 #ifdef __cplusplus
352 #if __cplusplus
353 }
354 #endif
355 #endif
356
357 #endif /* end of oal_time.h */
358