1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker #include "openthread-posix-config.h"
30*cfb92d14SAndroid Build Coastguard Worker #include "platform-posix.h"
31*cfb92d14SAndroid Build Coastguard Worker
32*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
33*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
34*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
35*cfb92d14SAndroid Build Coastguard Worker #include <time.h>
36*cfb92d14SAndroid Build Coastguard Worker
37*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-micro.h>
38*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/alarm-milli.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/diag.h>
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
42*cfb92d14SAndroid Build Coastguard Worker
43*cfb92d14SAndroid Build Coastguard Worker static bool sIsMsRunning = false;
44*cfb92d14SAndroid Build Coastguard Worker static uint32_t sMsAlarm = 0;
45*cfb92d14SAndroid Build Coastguard Worker
46*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
47*cfb92d14SAndroid Build Coastguard Worker static bool sIsUsRunning = false;
48*cfb92d14SAndroid Build Coastguard Worker static uint32_t sUsAlarm = 0;
49*cfb92d14SAndroid Build Coastguard Worker #endif
50*cfb92d14SAndroid Build Coastguard Worker
51*cfb92d14SAndroid Build Coastguard Worker static uint32_t sSpeedUpFactor = 1;
52*cfb92d14SAndroid Build Coastguard Worker
53*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker #include <signal.h>
56*cfb92d14SAndroid Build Coastguard Worker #include <time.h>
57*cfb92d14SAndroid Build Coastguard Worker
58*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
59*cfb92d14SAndroid Build Coastguard Worker static timer_t sMicroTimer;
60*cfb92d14SAndroid Build Coastguard Worker static int sRealTimeSignal = 0;
61*cfb92d14SAndroid Build Coastguard Worker
microTimerHandler(int aSignal,siginfo_t * aSignalInfo,void * aUserContext)62*cfb92d14SAndroid Build Coastguard Worker static void microTimerHandler(int aSignal, siginfo_t *aSignalInfo, void *aUserContext)
63*cfb92d14SAndroid Build Coastguard Worker {
64*cfb92d14SAndroid Build Coastguard Worker assert(aSignal == sRealTimeSignal);
65*cfb92d14SAndroid Build Coastguard Worker assert(aSignalInfo->si_value.sival_ptr == &sMicroTimer);
66*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aSignal);
67*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aSignalInfo);
68*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aUserContext);
69*cfb92d14SAndroid Build Coastguard Worker }
70*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
71*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
72*cfb92d14SAndroid Build Coastguard Worker
73*cfb92d14SAndroid Build Coastguard Worker #ifdef CLOCK_MONOTONIC_RAW
74*cfb92d14SAndroid Build Coastguard Worker #define OT_POSIX_CLOCK_ID CLOCK_MONOTONIC_RAW
75*cfb92d14SAndroid Build Coastguard Worker #else
76*cfb92d14SAndroid Build Coastguard Worker #define OT_POSIX_CLOCK_ID CLOCK_MONOTONIC
77*cfb92d14SAndroid Build Coastguard Worker #endif
78*cfb92d14SAndroid Build Coastguard Worker
79*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_POSIX_VIRTUAL_TIME
otPlatTimeGet(void)80*cfb92d14SAndroid Build Coastguard Worker uint64_t otPlatTimeGet(void)
81*cfb92d14SAndroid Build Coastguard Worker {
82*cfb92d14SAndroid Build Coastguard Worker struct timespec now;
83*cfb92d14SAndroid Build Coastguard Worker
84*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(clock_gettime(OT_POSIX_CLOCK_ID, &now) == 0, OT_EXIT_FAILURE);
85*cfb92d14SAndroid Build Coastguard Worker
86*cfb92d14SAndroid Build Coastguard Worker return static_cast<uint64_t>(now.tv_sec) * OT_US_PER_S + static_cast<uint64_t>(now.tv_nsec) / OT_NS_PER_US;
87*cfb92d14SAndroid Build Coastguard Worker }
88*cfb92d14SAndroid Build Coastguard Worker #endif // !OPENTHREAD_POSIX_VIRTUAL_TIME
89*cfb92d14SAndroid Build Coastguard Worker
platformAlarmGetNow(void)90*cfb92d14SAndroid Build Coastguard Worker static uint64_t platformAlarmGetNow(void) { return otPlatTimeGet() * sSpeedUpFactor; }
91*cfb92d14SAndroid Build Coastguard Worker
platformAlarmInit(uint32_t aSpeedUpFactor,int aRealTimeSignal)92*cfb92d14SAndroid Build Coastguard Worker void platformAlarmInit(uint32_t aSpeedUpFactor, int aRealTimeSignal)
93*cfb92d14SAndroid Build Coastguard Worker {
94*cfb92d14SAndroid Build Coastguard Worker sSpeedUpFactor = aSpeedUpFactor;
95*cfb92d14SAndroid Build Coastguard Worker
96*cfb92d14SAndroid Build Coastguard Worker if (aRealTimeSignal == 0)
97*cfb92d14SAndroid Build Coastguard Worker {
98*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
99*cfb92d14SAndroid Build Coastguard Worker otLogWarnPlat("Real time signal not enabled, microsecond timers may be inaccurate!");
100*cfb92d14SAndroid Build Coastguard Worker #endif
101*cfb92d14SAndroid Build Coastguard Worker }
102*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
103*cfb92d14SAndroid Build Coastguard Worker else if (aRealTimeSignal >= SIGRTMIN && aRealTimeSignal <= SIGRTMAX)
104*cfb92d14SAndroid Build Coastguard Worker {
105*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
106*cfb92d14SAndroid Build Coastguard Worker struct sigaction sa;
107*cfb92d14SAndroid Build Coastguard Worker struct sigevent sev;
108*cfb92d14SAndroid Build Coastguard Worker
109*cfb92d14SAndroid Build Coastguard Worker sa.sa_flags = SA_SIGINFO;
110*cfb92d14SAndroid Build Coastguard Worker sa.sa_sigaction = microTimerHandler;
111*cfb92d14SAndroid Build Coastguard Worker sigemptyset(&sa.sa_mask);
112*cfb92d14SAndroid Build Coastguard Worker
113*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(sigaction(aRealTimeSignal, &sa, nullptr) != -1, OT_EXIT_ERROR_ERRNO);
114*cfb92d14SAndroid Build Coastguard Worker
115*cfb92d14SAndroid Build Coastguard Worker sev.sigev_notify = SIGEV_SIGNAL;
116*cfb92d14SAndroid Build Coastguard Worker sev.sigev_signo = aRealTimeSignal;
117*cfb92d14SAndroid Build Coastguard Worker sev.sigev_value.sival_ptr = &sMicroTimer;
118*cfb92d14SAndroid Build Coastguard Worker
119*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(timer_create(CLOCK_MONOTONIC, &sev, &sMicroTimer) != -1, OT_EXIT_ERROR_ERRNO);
120*cfb92d14SAndroid Build Coastguard Worker
121*cfb92d14SAndroid Build Coastguard Worker sRealTimeSignal = aRealTimeSignal;
122*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE && !OPENTHREAD_POSIX_VIRTUAL_TIME
123*cfb92d14SAndroid Build Coastguard Worker }
124*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
125*cfb92d14SAndroid Build Coastguard Worker else
126*cfb92d14SAndroid Build Coastguard Worker {
127*cfb92d14SAndroid Build Coastguard Worker DieNow(OT_EXIT_INVALID_ARGUMENTS);
128*cfb92d14SAndroid Build Coastguard Worker }
129*cfb92d14SAndroid Build Coastguard Worker }
130*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliGetNow(void)131*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMilliGetNow(void) { return (uint32_t)(platformAlarmGetNow() / OT_US_PER_MS); }
132*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)133*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
134*cfb92d14SAndroid Build Coastguard Worker {
135*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
136*cfb92d14SAndroid Build Coastguard Worker
137*cfb92d14SAndroid Build Coastguard Worker sMsAlarm = aT0 + aDt;
138*cfb92d14SAndroid Build Coastguard Worker sIsMsRunning = true;
139*cfb92d14SAndroid Build Coastguard Worker }
140*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMilliStop(otInstance * aInstance)141*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMilliStop(otInstance *aInstance)
142*cfb92d14SAndroid Build Coastguard Worker {
143*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
144*cfb92d14SAndroid Build Coastguard Worker
145*cfb92d14SAndroid Build Coastguard Worker sIsMsRunning = false;
146*cfb92d14SAndroid Build Coastguard Worker }
147*cfb92d14SAndroid Build Coastguard Worker
148*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
otPlatAlarmMicroGetNow(void)149*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatAlarmMicroGetNow(void) { return static_cast<uint32_t>(platformAlarmGetNow()); }
150*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMicroStartAt(otInstance * aInstance,uint32_t aT0,uint32_t aDt)151*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt)
152*cfb92d14SAndroid Build Coastguard Worker {
153*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
154*cfb92d14SAndroid Build Coastguard Worker
155*cfb92d14SAndroid Build Coastguard Worker sUsAlarm = aT0 + aDt;
156*cfb92d14SAndroid Build Coastguard Worker sIsUsRunning = true;
157*cfb92d14SAndroid Build Coastguard Worker
158*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
159*cfb92d14SAndroid Build Coastguard Worker if (sRealTimeSignal != 0)
160*cfb92d14SAndroid Build Coastguard Worker {
161*cfb92d14SAndroid Build Coastguard Worker struct itimerspec its;
162*cfb92d14SAndroid Build Coastguard Worker uint32_t diff = sUsAlarm - otPlatAlarmMicroGetNow();
163*cfb92d14SAndroid Build Coastguard Worker
164*cfb92d14SAndroid Build Coastguard Worker its.it_value.tv_sec = diff / OT_US_PER_S;
165*cfb92d14SAndroid Build Coastguard Worker its.it_value.tv_nsec = (diff % OT_US_PER_S) * OT_NS_PER_US;
166*cfb92d14SAndroid Build Coastguard Worker
167*cfb92d14SAndroid Build Coastguard Worker its.it_interval.tv_sec = 0;
168*cfb92d14SAndroid Build Coastguard Worker its.it_interval.tv_nsec = 0;
169*cfb92d14SAndroid Build Coastguard Worker
170*cfb92d14SAndroid Build Coastguard Worker if (-1 == timer_settime(sMicroTimer, 0, &its, nullptr))
171*cfb92d14SAndroid Build Coastguard Worker {
172*cfb92d14SAndroid Build Coastguard Worker otLogWarnPlat("Failed to update microsecond timer: %s", strerror(errno));
173*cfb92d14SAndroid Build Coastguard Worker }
174*cfb92d14SAndroid Build Coastguard Worker }
175*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
176*cfb92d14SAndroid Build Coastguard Worker }
177*cfb92d14SAndroid Build Coastguard Worker
otPlatAlarmMicroStop(otInstance * aInstance)178*cfb92d14SAndroid Build Coastguard Worker void otPlatAlarmMicroStop(otInstance *aInstance)
179*cfb92d14SAndroid Build Coastguard Worker {
180*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
181*cfb92d14SAndroid Build Coastguard Worker
182*cfb92d14SAndroid Build Coastguard Worker sIsUsRunning = false;
183*cfb92d14SAndroid Build Coastguard Worker
184*cfb92d14SAndroid Build Coastguard Worker #ifdef __linux__
185*cfb92d14SAndroid Build Coastguard Worker if (sRealTimeSignal != 0)
186*cfb92d14SAndroid Build Coastguard Worker {
187*cfb92d14SAndroid Build Coastguard Worker struct itimerspec its = {{0, 0}, {0, 0}};
188*cfb92d14SAndroid Build Coastguard Worker
189*cfb92d14SAndroid Build Coastguard Worker if (-1 == timer_settime(sMicroTimer, 0, &its, nullptr))
190*cfb92d14SAndroid Build Coastguard Worker {
191*cfb92d14SAndroid Build Coastguard Worker otLogWarnPlat("Failed to stop microsecond timer: %s", strerror(errno));
192*cfb92d14SAndroid Build Coastguard Worker }
193*cfb92d14SAndroid Build Coastguard Worker }
194*cfb92d14SAndroid Build Coastguard Worker #endif // __linux__
195*cfb92d14SAndroid Build Coastguard Worker }
196*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
197*cfb92d14SAndroid Build Coastguard Worker
platformAlarmUpdateTimeout(struct timeval * aTimeout)198*cfb92d14SAndroid Build Coastguard Worker void platformAlarmUpdateTimeout(struct timeval *aTimeout)
199*cfb92d14SAndroid Build Coastguard Worker {
200*cfb92d14SAndroid Build Coastguard Worker int64_t remaining = INT32_MAX;
201*cfb92d14SAndroid Build Coastguard Worker uint64_t now = platformAlarmGetNow();
202*cfb92d14SAndroid Build Coastguard Worker
203*cfb92d14SAndroid Build Coastguard Worker assert(aTimeout != nullptr);
204*cfb92d14SAndroid Build Coastguard Worker
205*cfb92d14SAndroid Build Coastguard Worker if (sIsMsRunning)
206*cfb92d14SAndroid Build Coastguard Worker {
207*cfb92d14SAndroid Build Coastguard Worker remaining = (int32_t)(sMsAlarm - (uint32_t)(now / OT_US_PER_MS));
208*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(remaining > 0);
209*cfb92d14SAndroid Build Coastguard Worker remaining *= OT_US_PER_MS;
210*cfb92d14SAndroid Build Coastguard Worker remaining -= (now % OT_US_PER_MS);
211*cfb92d14SAndroid Build Coastguard Worker }
212*cfb92d14SAndroid Build Coastguard Worker
213*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
214*cfb92d14SAndroid Build Coastguard Worker if (sIsUsRunning)
215*cfb92d14SAndroid Build Coastguard Worker {
216*cfb92d14SAndroid Build Coastguard Worker int32_t usRemaining = (int32_t)(sUsAlarm - (uint32_t)now);
217*cfb92d14SAndroid Build Coastguard Worker
218*cfb92d14SAndroid Build Coastguard Worker if (usRemaining < remaining)
219*cfb92d14SAndroid Build Coastguard Worker {
220*cfb92d14SAndroid Build Coastguard Worker remaining = usRemaining;
221*cfb92d14SAndroid Build Coastguard Worker }
222*cfb92d14SAndroid Build Coastguard Worker }
223*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
224*cfb92d14SAndroid Build Coastguard Worker
225*cfb92d14SAndroid Build Coastguard Worker exit:
226*cfb92d14SAndroid Build Coastguard Worker if (remaining <= 0)
227*cfb92d14SAndroid Build Coastguard Worker {
228*cfb92d14SAndroid Build Coastguard Worker aTimeout->tv_sec = 0;
229*cfb92d14SAndroid Build Coastguard Worker aTimeout->tv_usec = 0;
230*cfb92d14SAndroid Build Coastguard Worker }
231*cfb92d14SAndroid Build Coastguard Worker else
232*cfb92d14SAndroid Build Coastguard Worker {
233*cfb92d14SAndroid Build Coastguard Worker remaining /= sSpeedUpFactor;
234*cfb92d14SAndroid Build Coastguard Worker
235*cfb92d14SAndroid Build Coastguard Worker if (remaining == 0)
236*cfb92d14SAndroid Build Coastguard Worker {
237*cfb92d14SAndroid Build Coastguard Worker remaining = 1;
238*cfb92d14SAndroid Build Coastguard Worker }
239*cfb92d14SAndroid Build Coastguard Worker
240*cfb92d14SAndroid Build Coastguard Worker if (remaining < static_cast<int64_t>(aTimeout->tv_sec) * OT_US_PER_S + static_cast<int64_t>(aTimeout->tv_usec))
241*cfb92d14SAndroid Build Coastguard Worker {
242*cfb92d14SAndroid Build Coastguard Worker aTimeout->tv_sec = static_cast<time_t>(remaining / OT_US_PER_S);
243*cfb92d14SAndroid Build Coastguard Worker aTimeout->tv_usec = static_cast<suseconds_t>(remaining % OT_US_PER_S);
244*cfb92d14SAndroid Build Coastguard Worker }
245*cfb92d14SAndroid Build Coastguard Worker }
246*cfb92d14SAndroid Build Coastguard Worker }
247*cfb92d14SAndroid Build Coastguard Worker
platformAlarmProcess(otInstance * aInstance)248*cfb92d14SAndroid Build Coastguard Worker void platformAlarmProcess(otInstance *aInstance)
249*cfb92d14SAndroid Build Coastguard Worker {
250*cfb92d14SAndroid Build Coastguard Worker int32_t remaining;
251*cfb92d14SAndroid Build Coastguard Worker
252*cfb92d14SAndroid Build Coastguard Worker if (sIsMsRunning)
253*cfb92d14SAndroid Build Coastguard Worker {
254*cfb92d14SAndroid Build Coastguard Worker remaining = (int32_t)(sMsAlarm - otPlatAlarmMilliGetNow());
255*cfb92d14SAndroid Build Coastguard Worker
256*cfb92d14SAndroid Build Coastguard Worker if (remaining <= 0)
257*cfb92d14SAndroid Build Coastguard Worker {
258*cfb92d14SAndroid Build Coastguard Worker sIsMsRunning = false;
259*cfb92d14SAndroid Build Coastguard Worker
260*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
261*cfb92d14SAndroid Build Coastguard Worker
262*cfb92d14SAndroid Build Coastguard Worker if (otPlatDiagModeGet())
263*cfb92d14SAndroid Build Coastguard Worker {
264*cfb92d14SAndroid Build Coastguard Worker otPlatDiagAlarmFired(aInstance);
265*cfb92d14SAndroid Build Coastguard Worker }
266*cfb92d14SAndroid Build Coastguard Worker else
267*cfb92d14SAndroid Build Coastguard Worker #endif
268*cfb92d14SAndroid Build Coastguard Worker {
269*cfb92d14SAndroid Build Coastguard Worker otPlatAlarmMilliFired(aInstance);
270*cfb92d14SAndroid Build Coastguard Worker }
271*cfb92d14SAndroid Build Coastguard Worker }
272*cfb92d14SAndroid Build Coastguard Worker }
273*cfb92d14SAndroid Build Coastguard Worker
274*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
275*cfb92d14SAndroid Build Coastguard Worker
276*cfb92d14SAndroid Build Coastguard Worker if (sIsUsRunning)
277*cfb92d14SAndroid Build Coastguard Worker {
278*cfb92d14SAndroid Build Coastguard Worker remaining = (int32_t)(sUsAlarm - otPlatAlarmMicroGetNow());
279*cfb92d14SAndroid Build Coastguard Worker
280*cfb92d14SAndroid Build Coastguard Worker if (remaining <= 0)
281*cfb92d14SAndroid Build Coastguard Worker {
282*cfb92d14SAndroid Build Coastguard Worker sIsUsRunning = false;
283*cfb92d14SAndroid Build Coastguard Worker
284*cfb92d14SAndroid Build Coastguard Worker otPlatAlarmMicroFired(aInstance);
285*cfb92d14SAndroid Build Coastguard Worker }
286*cfb92d14SAndroid Build Coastguard Worker }
287*cfb92d14SAndroid Build Coastguard Worker
288*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_USEC_TIMER_ENABLE
289*cfb92d14SAndroid Build Coastguard Worker }
290