• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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