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