1 /*
2 * Copyright (C) 2016 Freescale Semiconductor, Inc.
3 * Copyright 2017-2019 NXP
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 /*!
9 * File containing client-side RPC functions for the TIMER service. These
10 * functions are ported to clients that communicate to the SC.
11 *
12 * @addtogroup TIMER_SVC
13 * @{
14 */
15
16 /* Includes */
17
18 #include <sci/sci_types.h>
19 #include <sci/svc/rm/sci_rm_api.h>
20 #include <sci/svc/timer/sci_timer_api.h>
21 #include <sci/sci_rpc.h>
22 #include <stdlib.h>
23 #include "sci_timer_rpc.h"
24
25 /* Local Defines */
26
27 /* Local Types */
28
29 /* Local Functions */
30
sc_timer_set_wdog_timeout(sc_ipc_t ipc,sc_timer_wdog_time_t timeout)31 sc_err_t sc_timer_set_wdog_timeout(sc_ipc_t ipc, sc_timer_wdog_time_t timeout)
32 {
33 sc_rpc_msg_t msg;
34 uint8_t result;
35
36 RPC_VER(&msg) = SC_RPC_VERSION;
37 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
38 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_WDOG_TIMEOUT;
39 RPC_U32(&msg, 0U) = (uint32_t)timeout;
40 RPC_SIZE(&msg) = 2U;
41
42 sc_call_rpc(ipc, &msg, SC_FALSE);
43
44 result = RPC_R8(&msg);
45 return (sc_err_t)result;
46 }
47
sc_timer_set_wdog_pre_timeout(sc_ipc_t ipc,sc_timer_wdog_time_t pre_timeout)48 sc_err_t sc_timer_set_wdog_pre_timeout(sc_ipc_t ipc,
49 sc_timer_wdog_time_t pre_timeout)
50 {
51 sc_rpc_msg_t msg;
52 uint8_t result;
53
54 RPC_VER(&msg) = SC_RPC_VERSION;
55 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
56 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_WDOG_PRE_TIMEOUT;
57 RPC_U32(&msg, 0U) = (uint32_t)pre_timeout;
58 RPC_SIZE(&msg) = 2U;
59
60 sc_call_rpc(ipc, &msg, SC_FALSE);
61
62 result = RPC_R8(&msg);
63 return (sc_err_t)result;
64 }
65
sc_timer_start_wdog(sc_ipc_t ipc,sc_bool_t lock)66 sc_err_t sc_timer_start_wdog(sc_ipc_t ipc, sc_bool_t lock)
67 {
68 sc_rpc_msg_t msg;
69 uint8_t result;
70
71 RPC_VER(&msg) = SC_RPC_VERSION;
72 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
73 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_START_WDOG;
74 RPC_U8(&msg, 0U) = (uint8_t)lock;
75 RPC_SIZE(&msg) = 2U;
76
77 sc_call_rpc(ipc, &msg, SC_FALSE);
78
79 result = RPC_R8(&msg);
80 return (sc_err_t)result;
81 }
82
sc_timer_stop_wdog(sc_ipc_t ipc)83 sc_err_t sc_timer_stop_wdog(sc_ipc_t ipc)
84 {
85 sc_rpc_msg_t msg;
86 uint8_t result;
87
88 RPC_VER(&msg) = SC_RPC_VERSION;
89 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
90 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_STOP_WDOG;
91 RPC_SIZE(&msg) = 1U;
92
93 sc_call_rpc(ipc, &msg, SC_FALSE);
94
95 result = RPC_R8(&msg);
96 return (sc_err_t)result;
97 }
98
sc_timer_ping_wdog(sc_ipc_t ipc)99 sc_err_t sc_timer_ping_wdog(sc_ipc_t ipc)
100 {
101 sc_rpc_msg_t msg;
102 uint8_t result;
103
104 RPC_VER(&msg) = SC_RPC_VERSION;
105 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
106 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_PING_WDOG;
107 RPC_SIZE(&msg) = 1U;
108
109 sc_call_rpc(ipc, &msg, SC_FALSE);
110
111 result = RPC_R8(&msg);
112 return (sc_err_t)result;
113 }
114
sc_timer_get_wdog_status(sc_ipc_t ipc,sc_timer_wdog_time_t * timeout,sc_timer_wdog_time_t * max_timeout,sc_timer_wdog_time_t * remaining_time)115 sc_err_t sc_timer_get_wdog_status(sc_ipc_t ipc,
116 sc_timer_wdog_time_t *timeout,
117 sc_timer_wdog_time_t *max_timeout,
118 sc_timer_wdog_time_t *remaining_time)
119 {
120 sc_rpc_msg_t msg;
121 uint8_t result;
122
123 RPC_VER(&msg) = SC_RPC_VERSION;
124 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
125 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_GET_WDOG_STATUS;
126 RPC_SIZE(&msg) = 1U;
127
128 sc_call_rpc(ipc, &msg, SC_FALSE);
129
130 if (timeout != NULL)
131 *timeout = RPC_U32(&msg, 0U);
132
133 if (max_timeout != NULL)
134 *max_timeout = RPC_U32(&msg, 4U);
135
136 if (remaining_time != NULL)
137 *remaining_time = RPC_U32(&msg, 8U);
138
139 result = RPC_R8(&msg);
140 return (sc_err_t)result;
141 }
142
sc_timer_pt_get_wdog_status(sc_ipc_t ipc,sc_rm_pt_t pt,sc_bool_t * enb,sc_timer_wdog_time_t * timeout,sc_timer_wdog_time_t * remaining_time)143 sc_err_t sc_timer_pt_get_wdog_status(sc_ipc_t ipc, sc_rm_pt_t pt,
144 sc_bool_t *enb,
145 sc_timer_wdog_time_t *timeout,
146 sc_timer_wdog_time_t *remaining_time)
147 {
148 sc_rpc_msg_t msg;
149 uint8_t result;
150
151 RPC_VER(&msg) = SC_RPC_VERSION;
152 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
153 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_PT_GET_WDOG_STATUS;
154 RPC_U8(&msg, 0U) = (uint8_t)pt;
155 RPC_SIZE(&msg) = 2U;
156
157 sc_call_rpc(ipc, &msg, SC_FALSE);
158
159 if (timeout != NULL)
160 *timeout = RPC_U32(&msg, 0U);
161
162 if (remaining_time != NULL)
163 *remaining_time = RPC_U32(&msg, 4U);
164
165 result = RPC_R8(&msg);
166 if (enb != NULL)
167 *enb = RPC_U8(&msg, 8U);
168
169 return (sc_err_t)result;
170 }
171
sc_timer_set_wdog_action(sc_ipc_t ipc,sc_rm_pt_t pt,sc_timer_wdog_action_t action)172 sc_err_t sc_timer_set_wdog_action(sc_ipc_t ipc,
173 sc_rm_pt_t pt, sc_timer_wdog_action_t action)
174 {
175 sc_rpc_msg_t msg;
176 uint8_t result;
177
178 RPC_VER(&msg) = SC_RPC_VERSION;
179 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
180 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_WDOG_ACTION;
181 RPC_U8(&msg, 0U) = (uint8_t)pt;
182 RPC_U8(&msg, 1U) = (uint8_t)action;
183 RPC_SIZE(&msg) = 2U;
184
185 sc_call_rpc(ipc, &msg, SC_FALSE);
186
187 result = RPC_R8(&msg);
188 return (sc_err_t)result;
189 }
190
sc_timer_set_rtc_time(sc_ipc_t ipc,uint16_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec)191 sc_err_t sc_timer_set_rtc_time(sc_ipc_t ipc, uint16_t year, uint8_t mon,
192 uint8_t day, uint8_t hour, uint8_t min,
193 uint8_t sec)
194 {
195 sc_rpc_msg_t msg;
196 uint8_t result;
197
198 RPC_VER(&msg) = SC_RPC_VERSION;
199 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
200 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_RTC_TIME;
201 RPC_U16(&msg, 0U) = (uint16_t)year;
202 RPC_U8(&msg, 2U) = (uint8_t)mon;
203 RPC_U8(&msg, 3U) = (uint8_t)day;
204 RPC_U8(&msg, 4U) = (uint8_t)hour;
205 RPC_U8(&msg, 5U) = (uint8_t)min;
206 RPC_U8(&msg, 6U) = (uint8_t)sec;
207 RPC_SIZE(&msg) = 3U;
208
209 sc_call_rpc(ipc, &msg, SC_FALSE);
210
211 result = RPC_R8(&msg);
212 return (sc_err_t)result;
213 }
214
sc_timer_get_rtc_time(sc_ipc_t ipc,uint16_t * year,uint8_t * mon,uint8_t * day,uint8_t * hour,uint8_t * min,uint8_t * sec)215 sc_err_t sc_timer_get_rtc_time(sc_ipc_t ipc, uint16_t *year, uint8_t *mon,
216 uint8_t *day, uint8_t *hour, uint8_t *min,
217 uint8_t *sec)
218 {
219 sc_rpc_msg_t msg;
220 uint8_t result;
221
222 RPC_VER(&msg) = SC_RPC_VERSION;
223 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
224 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_GET_RTC_TIME;
225 RPC_SIZE(&msg) = 1U;
226
227 sc_call_rpc(ipc, &msg, SC_FALSE);
228
229 if (year != NULL)
230 *year = RPC_U16(&msg, 0U);
231
232 result = RPC_R8(&msg);
233 if (mon != NULL)
234 *mon = RPC_U8(&msg, 2U);
235
236 if (day != NULL)
237 *day = RPC_U8(&msg, 3U);
238
239 if (hour != NULL)
240 *hour = RPC_U8(&msg, 4U);
241
242 if (min != NULL)
243 *min = RPC_U8(&msg, 5U);
244
245 if (sec != NULL)
246 *sec = RPC_U8(&msg, 6U);
247
248 return (sc_err_t)result;
249 }
250
sc_timer_get_rtc_sec1970(sc_ipc_t ipc,uint32_t * sec)251 sc_err_t sc_timer_get_rtc_sec1970(sc_ipc_t ipc, uint32_t *sec)
252 {
253 sc_rpc_msg_t msg;
254 uint8_t result;
255
256 RPC_VER(&msg) = SC_RPC_VERSION;
257 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
258 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_GET_RTC_SEC1970;
259 RPC_SIZE(&msg) = 1U;
260
261 sc_call_rpc(ipc, &msg, SC_FALSE);
262
263 if (sec != NULL)
264 *sec = RPC_U32(&msg, 0U);
265
266 result = RPC_R8(&msg);
267 return (sc_err_t)result;
268 }
269
sc_timer_set_rtc_alarm(sc_ipc_t ipc,uint16_t year,uint8_t mon,uint8_t day,uint8_t hour,uint8_t min,uint8_t sec)270 sc_err_t sc_timer_set_rtc_alarm(sc_ipc_t ipc, uint16_t year, uint8_t mon,
271 uint8_t day, uint8_t hour, uint8_t min,
272 uint8_t sec)
273 {
274 sc_rpc_msg_t msg;
275 uint8_t result;
276
277 RPC_VER(&msg) = SC_RPC_VERSION;
278 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
279 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_RTC_ALARM;
280 RPC_U16(&msg, 0U) = (uint16_t)year;
281 RPC_U8(&msg, 2U) = (uint8_t)mon;
282 RPC_U8(&msg, 3U) = (uint8_t)day;
283 RPC_U8(&msg, 4U) = (uint8_t)hour;
284 RPC_U8(&msg, 5U) = (uint8_t)min;
285 RPC_U8(&msg, 6U) = (uint8_t)sec;
286 RPC_SIZE(&msg) = 3U;
287
288 sc_call_rpc(ipc, &msg, SC_FALSE);
289
290 result = RPC_R8(&msg);
291 return (sc_err_t)result;
292 }
293
sc_timer_set_rtc_periodic_alarm(sc_ipc_t ipc,uint32_t sec)294 sc_err_t sc_timer_set_rtc_periodic_alarm(sc_ipc_t ipc, uint32_t sec)
295 {
296 sc_rpc_msg_t msg;
297 uint8_t result;
298
299 RPC_VER(&msg) = SC_RPC_VERSION;
300 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
301 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_RTC_PERIODIC_ALARM;
302 RPC_U32(&msg, 0U) = (uint32_t)sec;
303 RPC_SIZE(&msg) = 2U;
304
305 sc_call_rpc(ipc, &msg, SC_FALSE);
306
307 result = RPC_R8(&msg);
308 return (sc_err_t)result;
309 }
310
sc_timer_cancel_rtc_alarm(sc_ipc_t ipc)311 sc_err_t sc_timer_cancel_rtc_alarm(sc_ipc_t ipc)
312 {
313 sc_rpc_msg_t msg;
314 uint8_t result;
315
316 RPC_VER(&msg) = SC_RPC_VERSION;
317 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
318 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_CANCEL_RTC_ALARM;
319 RPC_SIZE(&msg) = 1U;
320
321 sc_call_rpc(ipc, &msg, SC_FALSE);
322
323 result = RPC_R8(&msg);
324 return (sc_err_t)result;
325 }
326
sc_timer_set_rtc_calb(sc_ipc_t ipc,int8_t count)327 sc_err_t sc_timer_set_rtc_calb(sc_ipc_t ipc, int8_t count)
328 {
329 sc_rpc_msg_t msg;
330 uint8_t result;
331
332 RPC_VER(&msg) = SC_RPC_VERSION;
333 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
334 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_RTC_CALB;
335 RPC_I8(&msg, 0U) = (int8_t) count;
336 RPC_SIZE(&msg) = 2U;
337
338 sc_call_rpc(ipc, &msg, SC_FALSE);
339
340 result = RPC_R8(&msg);
341 return (sc_err_t)result;
342 }
343
sc_timer_set_sysctr_alarm(sc_ipc_t ipc,uint64_t ticks)344 sc_err_t sc_timer_set_sysctr_alarm(sc_ipc_t ipc, uint64_t ticks)
345 {
346 sc_rpc_msg_t msg;
347 uint8_t result;
348
349 RPC_VER(&msg) = SC_RPC_VERSION;
350 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
351 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_SYSCTR_ALARM;
352 RPC_U32(&msg, 0U) = (uint32_t)(ticks >> 32U);
353 RPC_U32(&msg, 4U) = (uint32_t)ticks;
354 RPC_SIZE(&msg) = 3U;
355
356 sc_call_rpc(ipc, &msg, SC_FALSE);
357
358 result = RPC_R8(&msg);
359 return (sc_err_t)result;
360 }
361
sc_timer_set_sysctr_periodic_alarm(sc_ipc_t ipc,uint64_t ticks)362 sc_err_t sc_timer_set_sysctr_periodic_alarm(sc_ipc_t ipc, uint64_t ticks)
363 {
364 sc_rpc_msg_t msg;
365 uint8_t result;
366
367 RPC_VER(&msg) = SC_RPC_VERSION;
368 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
369 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_SET_SYSCTR_PERIODIC_ALARM;
370 RPC_U32(&msg, 0U) = (uint32_t)(ticks >> 32U);
371 RPC_U32(&msg, 4U) = (uint32_t)ticks;
372 RPC_SIZE(&msg) = 3U;
373
374 sc_call_rpc(ipc, &msg, SC_FALSE);
375
376 result = RPC_R8(&msg);
377 return (sc_err_t)result;
378 }
379
sc_timer_cancel_sysctr_alarm(sc_ipc_t ipc)380 sc_err_t sc_timer_cancel_sysctr_alarm(sc_ipc_t ipc)
381 {
382 sc_rpc_msg_t msg;
383 uint8_t result;
384
385 RPC_VER(&msg) = SC_RPC_VERSION;
386 RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_TIMER;
387 RPC_FUNC(&msg) = (uint8_t)TIMER_FUNC_CANCEL_SYSCTR_ALARM;
388 RPC_SIZE(&msg) = 1U;
389
390 sc_call_rpc(ipc, &msg, SC_FALSE);
391
392 result = RPC_R8(&msg);
393 return (sc_err_t)result;
394 }
395
396 /**@}*/
397