1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-07-10     xqyjlj       The first version.
9  * 2024-04-26     Shell        Improve ipc performance
10  */
11 
12 #ifndef __KTIME_H__
13 #define __KTIME_H__
14 
15 #include <stdint.h>
16 #include <sys/time.h>
17 #include <ipc/completion.h>
18 
19 #include "rtthread.h"
20 
21 #define RT_KTIME_RESMUL (1000000ULL)
22 
23 struct rt_ktime_hrtimer
24 {
25     rt_uint8_t           flag;                  /**< compatible to tick timer's flag */
26     char                 name[RT_NAME_MAX];
27     rt_list_t            node;
28     void                *parameter;
29     unsigned long        delay_cnt;
30     unsigned long        timeout_cnt;
31     rt_err_t             error;
32     struct rt_completion completion;
33     void (*timeout_func)(void *parameter);
34 };
35 typedef struct rt_ktime_hrtimer *rt_ktime_hrtimer_t;
36 
37 /**
38  * @brief Get boottime with us precision
39  *
40  * @param tv: timeval
41  * @return rt_err_t
42  */
43 rt_err_t rt_ktime_boottime_get_us(struct timeval *tv);
44 
45 /**
46  * @brief Get boottime with s precision
47  *
48  * @param t: time_t
49  * @return rt_err_t
50  */
51 rt_err_t rt_ktime_boottime_get_s(time_t *t);
52 
53 /**
54  * @brief Get boottime with ns precision
55  *
56  * @param ts: timespec
57  * @return rt_err_t
58  */
59 rt_err_t rt_ktime_boottime_get_ns(struct timespec *ts);
60 
61 /**
62  * @brief Get cputimer resolution
63  *
64  * @return (resolution * RT_KTIME_RESMUL)
65  */
66 rt_uint64_t rt_ktime_cputimer_getres(void);
67 
68 /**
69  * @brief Get cputimer frequency
70  *
71  * @return frequency
72  */
73 unsigned long rt_ktime_cputimer_getfrq(void);
74 
75 /**
76  * @brief Get cputimer the value of the cnt counter
77  *
78  * @return cnt
79  */
80 unsigned long rt_ktime_cputimer_getcnt(void);
81 
82 /**
83  * @brief Get cputimer the cnt value corresponding to 1 os tick
84  *
85  * @return step
86  */
87 unsigned long rt_ktime_cputimer_getstep(void);
88 
89 /**
90  * @brief Init cputimer
91  *
92  */
93 void rt_ktime_cputimer_init(void);
94 
95 /**
96  * @brief Get hrtimer resolution
97  *
98  * @return (resolution * RT_KTIME_RESMUL)
99  */
100 rt_uint64_t rt_ktime_hrtimer_getres(void);
101 
102 /**
103  * @brief Get hrtimer frequency
104  *
105  * @return frequency
106  */
107 unsigned long rt_ktime_hrtimer_getfrq(void);
108 
109 /**
110  * @brief Get hrtimer the value of the cnt counter
111  *
112  * @return cnt
113  */
114 unsigned long rt_ktime_hrtimer_getcnt(void);
115 
116 /**
117  * @brief set hrtimer interrupt timeout count (cnt), you should re-implemented it in hrtimer device driver
118  *
119  * @param cnt: hrtimer requires a timing cnt value
120  * @return rt_err_t
121  */
122 rt_err_t rt_ktime_hrtimer_settimeout(unsigned long cnt);
123 
124 /**
125  * @brief called in hrtimer device driver isr routinue, it will process the timeouts
126  */
127 void     rt_ktime_hrtimer_process(void);
128 
129 void     rt_ktime_hrtimer_init(rt_ktime_hrtimer_t timer,
130                                const char        *name,
131                                rt_uint8_t         flag,
132                                void (*timeout)(void *parameter),
133                                void *parameter);
134 rt_err_t rt_ktime_hrtimer_start(rt_ktime_hrtimer_t timer, unsigned long cnt);
135 rt_err_t rt_ktime_hrtimer_stop(rt_ktime_hrtimer_t timer);
136 rt_err_t rt_ktime_hrtimer_control(rt_ktime_hrtimer_t timer, int cmd, void *arg);
137 rt_err_t rt_ktime_hrtimer_detach(rt_ktime_hrtimer_t timer);
138 
rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer,rt_err_t err)139 rt_inline void rt_ktime_hrtimer_keep_errno(rt_ktime_hrtimer_t timer, rt_err_t err)
140 {
141     RT_ASSERT(timer != RT_NULL);
142 
143     timer->error = err;
144     rt_set_errno(-err);
145 }
146 
147 void rt_ktime_hrtimer_delay_init(struct rt_ktime_hrtimer *timer);
148 void rt_ktime_hrtimer_delay_detach(struct rt_ktime_hrtimer *timer);
149 void rt_ktime_hrtimer_process(void);
150 
151 /**
152  * @brief sleep by the cputimer cnt value
153  *
154  * @param cnt: the cputimer cnt value
155  * @return rt_err_t
156  */
157 rt_err_t rt_ktime_hrtimer_sleep(struct rt_ktime_hrtimer *timer, unsigned long cnt);
158 
159 /**
160  * @brief sleep by ns
161  *
162  * @param ns: ns
163  * @return rt_err_t
164  */
165 rt_err_t rt_ktime_hrtimer_ndelay(struct rt_ktime_hrtimer *timer, unsigned long ns);
166 
167 /**
168  * @brief sleep by us
169  *
170  * @param us: us
171  * @return rt_err_t
172  */
173 rt_err_t rt_ktime_hrtimer_udelay(struct rt_ktime_hrtimer *timer, unsigned long us);
174 
175 /**
176  * @brief sleep by ms
177  *
178  * @param ms: ms
179  * @return rt_err_t
180  */
181 rt_err_t rt_ktime_hrtimer_mdelay(struct rt_ktime_hrtimer *timer, unsigned long ms);
182 
183 #endif
184