1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2020, 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 /**
30*cfb92d14SAndroid Build Coastguard Worker * @file
31*cfb92d14SAndroid Build Coastguard Worker * This file implements the radio apis on posix platform.
32*cfb92d14SAndroid Build Coastguard Worker */
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Worker #include "platform-posix.h"
35*cfb92d14SAndroid Build Coastguard Worker
36*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker #include <openthread/logging.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 #include "common/new.hpp"
43*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/radio.hpp"
44*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/spinel_driver_getter.hpp"
45*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/spinel_manager.hpp"
46*cfb92d14SAndroid Build Coastguard Worker #include "utils/parse_cmdline.hpp"
47*cfb92d14SAndroid Build Coastguard Worker
48*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_CONFIGURATION_FILE_ENABLE
49*cfb92d14SAndroid Build Coastguard Worker #include "configuration.hpp"
50*cfb92d14SAndroid Build Coastguard Worker static ot::Posix::Configuration sConfig;
51*cfb92d14SAndroid Build Coastguard Worker #endif
52*cfb92d14SAndroid Build Coastguard Worker
53*cfb92d14SAndroid Build Coastguard Worker static ot::Posix::Radio sRadio;
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker namespace ot {
56*cfb92d14SAndroid Build Coastguard Worker namespace Posix {
57*cfb92d14SAndroid Build Coastguard Worker
58*cfb92d14SAndroid Build Coastguard Worker namespace {
platformRadioInit(const char * aUrl)59*cfb92d14SAndroid Build Coastguard Worker extern "C" void platformRadioInit(const char *aUrl) { sRadio.Init(aUrl); }
60*cfb92d14SAndroid Build Coastguard Worker } // namespace
61*cfb92d14SAndroid Build Coastguard Worker
62*cfb92d14SAndroid Build Coastguard Worker const char Radio::kLogModuleName[] = "Radio";
63*cfb92d14SAndroid Build Coastguard Worker
Radio(void)64*cfb92d14SAndroid Build Coastguard Worker Radio::Radio(void)
65*cfb92d14SAndroid Build Coastguard Worker : mRadioUrl(nullptr)
66*cfb92d14SAndroid Build Coastguard Worker , mRadioSpinel()
67*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_RCP_CAPS_DIAG_ENABLE
68*cfb92d14SAndroid Build Coastguard Worker , mRcpCapsDiag(mRadioSpinel)
69*cfb92d14SAndroid Build Coastguard Worker #endif
70*cfb92d14SAndroid Build Coastguard Worker {
71*cfb92d14SAndroid Build Coastguard Worker }
72*cfb92d14SAndroid Build Coastguard Worker
Init(const char * aUrl)73*cfb92d14SAndroid Build Coastguard Worker void Radio::Init(const char *aUrl)
74*cfb92d14SAndroid Build Coastguard Worker {
75*cfb92d14SAndroid Build Coastguard Worker bool resetRadio;
76*cfb92d14SAndroid Build Coastguard Worker bool skipCompatibilityCheck;
77*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2 && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE
78*cfb92d14SAndroid Build Coastguard Worker bool aEnableRcpTimeSync = true;
79*cfb92d14SAndroid Build Coastguard Worker #else
80*cfb92d14SAndroid Build Coastguard Worker bool aEnableRcpTimeSync = false;
81*cfb92d14SAndroid Build Coastguard Worker #endif
82*cfb92d14SAndroid Build Coastguard Worker struct ot::Spinel::RadioSpinelCallbacks callbacks;
83*cfb92d14SAndroid Build Coastguard Worker
84*cfb92d14SAndroid Build Coastguard Worker mRadioUrl.Init(aUrl);
85*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(mRadioUrl.GetPath() != nullptr, OT_EXIT_INVALID_ARGUMENTS);
86*cfb92d14SAndroid Build Coastguard Worker
87*cfb92d14SAndroid Build Coastguard Worker memset(&callbacks, 0, sizeof(callbacks));
88*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
89*cfb92d14SAndroid Build Coastguard Worker callbacks.mDiagReceiveDone = otPlatDiagRadioReceiveDone;
90*cfb92d14SAndroid Build Coastguard Worker callbacks.mDiagTransmitDone = otPlatDiagRadioTransmitDone;
91*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DIAG_ENABLE
92*cfb92d14SAndroid Build Coastguard Worker callbacks.mEnergyScanDone = otPlatRadioEnergyScanDone;
93*cfb92d14SAndroid Build Coastguard Worker callbacks.mBusLatencyChanged = otPlatRadioBusLatencyChanged;
94*cfb92d14SAndroid Build Coastguard Worker callbacks.mReceiveDone = otPlatRadioReceiveDone;
95*cfb92d14SAndroid Build Coastguard Worker callbacks.mTransmitDone = otPlatRadioTxDone;
96*cfb92d14SAndroid Build Coastguard Worker callbacks.mTxStarted = otPlatRadioTxStarted;
97*cfb92d14SAndroid Build Coastguard Worker
98*cfb92d14SAndroid Build Coastguard Worker resetRadio = !mRadioUrl.HasParam("no-reset");
99*cfb92d14SAndroid Build Coastguard Worker skipCompatibilityCheck = mRadioUrl.HasParam("skip-rcp-compatibility-check");
100*cfb92d14SAndroid Build Coastguard Worker
101*cfb92d14SAndroid Build Coastguard Worker mRadioSpinel.SetCallbacks(callbacks);
102*cfb92d14SAndroid Build Coastguard Worker mRadioSpinel.Init(skipCompatibilityCheck, resetRadio, &GetSpinelDriver(), kRequiredRadioCaps, aEnableRcpTimeSync);
103*cfb92d14SAndroid Build Coastguard Worker
104*cfb92d14SAndroid Build Coastguard Worker ProcessRadioUrl(mRadioUrl);
105*cfb92d14SAndroid Build Coastguard Worker }
106*cfb92d14SAndroid Build Coastguard Worker
ProcessRadioUrl(const RadioUrl & aRadioUrl)107*cfb92d14SAndroid Build Coastguard Worker void Radio::ProcessRadioUrl(const RadioUrl &aRadioUrl)
108*cfb92d14SAndroid Build Coastguard Worker {
109*cfb92d14SAndroid Build Coastguard Worker const char *region;
110*cfb92d14SAndroid Build Coastguard Worker int8_t value;
111*cfb92d14SAndroid Build Coastguard Worker
112*cfb92d14SAndroid Build Coastguard Worker if (aRadioUrl.HasParam("ncp-dataset"))
113*cfb92d14SAndroid Build Coastguard Worker {
114*cfb92d14SAndroid Build Coastguard Worker LogCrit("The argument \"ncp-dataset\" is no longer supported");
115*cfb92d14SAndroid Build Coastguard Worker DieNow(OT_ERROR_FAILED);
116*cfb92d14SAndroid Build Coastguard Worker }
117*cfb92d14SAndroid Build Coastguard Worker
118*cfb92d14SAndroid Build Coastguard Worker if (aRadioUrl.HasParam("fem-lnagain"))
119*cfb92d14SAndroid Build Coastguard Worker {
120*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(aRadioUrl.ParseInt8("fem-lnagain", value));
121*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(mRadioSpinel.SetFemLnaGain(value));
122*cfb92d14SAndroid Build Coastguard Worker }
123*cfb92d14SAndroid Build Coastguard Worker
124*cfb92d14SAndroid Build Coastguard Worker if (aRadioUrl.HasParam("cca-threshold"))
125*cfb92d14SAndroid Build Coastguard Worker {
126*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(aRadioUrl.ParseInt8("cca-threshold", value));
127*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(mRadioSpinel.SetCcaEnergyDetectThreshold(value));
128*cfb92d14SAndroid Build Coastguard Worker }
129*cfb92d14SAndroid Build Coastguard Worker
130*cfb92d14SAndroid Build Coastguard Worker if ((region = aRadioUrl.GetValue("region")) != nullptr)
131*cfb92d14SAndroid Build Coastguard Worker {
132*cfb92d14SAndroid Build Coastguard Worker uint16_t regionCode;
133*cfb92d14SAndroid Build Coastguard Worker
134*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(strnlen(region, 3) == 2, OT_EXIT_INVALID_ARGUMENTS);
135*cfb92d14SAndroid Build Coastguard Worker regionCode = static_cast<uint16_t>(static_cast<uint16_t>(region[0]) << 8) + static_cast<uint16_t>(region[1]);
136*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(otPlatRadioSetRegion(gInstance, regionCode));
137*cfb92d14SAndroid Build Coastguard Worker }
138*cfb92d14SAndroid Build Coastguard Worker
139*cfb92d14SAndroid Build Coastguard Worker if (aRadioUrl.HasParam("bus-latency"))
140*cfb92d14SAndroid Build Coastguard Worker {
141*cfb92d14SAndroid Build Coastguard Worker uint32_t busLatency;
142*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(aRadioUrl.ParseUint32("bus-latency", busLatency));
143*cfb92d14SAndroid Build Coastguard Worker mRadioSpinel.SetBusLatency(busLatency);
144*cfb92d14SAndroid Build Coastguard Worker }
145*cfb92d14SAndroid Build Coastguard Worker
146*cfb92d14SAndroid Build Coastguard Worker ProcessMaxPowerTable(aRadioUrl);
147*cfb92d14SAndroid Build Coastguard Worker
148*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
149*cfb92d14SAndroid Build Coastguard Worker {
150*cfb92d14SAndroid Build Coastguard Worker const char *enableCoex = aRadioUrl.GetValue("enable-coex");
151*cfb92d14SAndroid Build Coastguard Worker if (enableCoex != nullptr)
152*cfb92d14SAndroid Build Coastguard Worker {
153*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(mRadioSpinel.SetCoexEnabled(enableCoex[0] != '0'));
154*cfb92d14SAndroid Build Coastguard Worker }
155*cfb92d14SAndroid Build Coastguard Worker }
156*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
157*cfb92d14SAndroid Build Coastguard Worker }
158*cfb92d14SAndroid Build Coastguard Worker
ProcessMaxPowerTable(const RadioUrl & aRadioUrl)159*cfb92d14SAndroid Build Coastguard Worker void Radio::ProcessMaxPowerTable(const RadioUrl &aRadioUrl)
160*cfb92d14SAndroid Build Coastguard Worker {
161*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aRadioUrl);
162*cfb92d14SAndroid Build Coastguard Worker
163*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_MAX_POWER_TABLE_ENABLE
164*cfb92d14SAndroid Build Coastguard Worker otError error;
165*cfb92d14SAndroid Build Coastguard Worker constexpr int8_t kPowerDefault = 30; // Default power 1 watt (30 dBm).
166*cfb92d14SAndroid Build Coastguard Worker const char *str = nullptr;
167*cfb92d14SAndroid Build Coastguard Worker char *pSave = nullptr;
168*cfb92d14SAndroid Build Coastguard Worker uint8_t channel = ot::Radio::kChannelMin;
169*cfb92d14SAndroid Build Coastguard Worker int8_t power = kPowerDefault;
170*cfb92d14SAndroid Build Coastguard Worker const char *maxPowerTable;
171*cfb92d14SAndroid Build Coastguard Worker
172*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit((maxPowerTable = aRadioUrl.GetValue("max-power-table")) != nullptr);
173*cfb92d14SAndroid Build Coastguard Worker
174*cfb92d14SAndroid Build Coastguard Worker for (str = strtok_r(const_cast<char *>(maxPowerTable), ",", &pSave);
175*cfb92d14SAndroid Build Coastguard Worker str != nullptr && channel <= ot::Radio::kChannelMax; str = strtok_r(nullptr, ",", &pSave))
176*cfb92d14SAndroid Build Coastguard Worker {
177*cfb92d14SAndroid Build Coastguard Worker power = static_cast<int8_t>(strtol(str, nullptr, 0));
178*cfb92d14SAndroid Build Coastguard Worker error = mRadioSpinel.SetChannelMaxTransmitPower(channel, power);
179*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie((error == OT_ERROR_NONE) || (error == OT_ERROR_NOT_IMPLEMENTED), OT_EXIT_FAILURE);
180*cfb92d14SAndroid Build Coastguard Worker if (error == OT_ERROR_NOT_IMPLEMENTED)
181*cfb92d14SAndroid Build Coastguard Worker {
182*cfb92d14SAndroid Build Coastguard Worker LogWarn("The RCP doesn't support setting the max transmit power");
183*cfb92d14SAndroid Build Coastguard Worker }
184*cfb92d14SAndroid Build Coastguard Worker
185*cfb92d14SAndroid Build Coastguard Worker ++channel;
186*cfb92d14SAndroid Build Coastguard Worker }
187*cfb92d14SAndroid Build Coastguard Worker
188*cfb92d14SAndroid Build Coastguard Worker // Use the last power if omitted.
189*cfb92d14SAndroid Build Coastguard Worker while (channel <= ot::Radio::kChannelMax)
190*cfb92d14SAndroid Build Coastguard Worker {
191*cfb92d14SAndroid Build Coastguard Worker error = mRadioSpinel.SetChannelMaxTransmitPower(channel, power);
192*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie((error == OT_ERROR_NONE) || (error == OT_ERROR_NOT_IMPLEMENTED), OT_ERROR_FAILED);
193*cfb92d14SAndroid Build Coastguard Worker if (error == OT_ERROR_NOT_IMPLEMENTED)
194*cfb92d14SAndroid Build Coastguard Worker {
195*cfb92d14SAndroid Build Coastguard Worker LogWarn("The RCP doesn't support setting the max transmit power");
196*cfb92d14SAndroid Build Coastguard Worker }
197*cfb92d14SAndroid Build Coastguard Worker
198*cfb92d14SAndroid Build Coastguard Worker ++channel;
199*cfb92d14SAndroid Build Coastguard Worker }
200*cfb92d14SAndroid Build Coastguard Worker
201*cfb92d14SAndroid Build Coastguard Worker VerifyOrDie(str == nullptr, OT_EXIT_INVALID_ARGUMENTS);
202*cfb92d14SAndroid Build Coastguard Worker
203*cfb92d14SAndroid Build Coastguard Worker exit:
204*cfb92d14SAndroid Build Coastguard Worker return;
205*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_POSIX_CONFIG_MAX_POWER_TABLE_ENABLE
206*cfb92d14SAndroid Build Coastguard Worker }
207*cfb92d14SAndroid Build Coastguard Worker
208*cfb92d14SAndroid Build Coastguard Worker } // namespace Posix
209*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
210*cfb92d14SAndroid Build Coastguard Worker
GetRadioSpinel(void)211*cfb92d14SAndroid Build Coastguard Worker ot::Spinel::RadioSpinel &GetRadioSpinel(void) { return sRadio.GetRadioSpinel(); }
212*cfb92d14SAndroid Build Coastguard Worker
213*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_RCP_CAPS_DIAG_ENABLE
GetRcpCapsDiag(void)214*cfb92d14SAndroid Build Coastguard Worker ot::Posix::RcpCapsDiag &GetRcpCapsDiag(void) { return sRadio.GetRcpCapsDiag(); }
215*cfb92d14SAndroid Build Coastguard Worker #endif
216*cfb92d14SAndroid Build Coastguard Worker
platformRadioDeinit(void)217*cfb92d14SAndroid Build Coastguard Worker void platformRadioDeinit(void) { GetRadioSpinel().Deinit(); }
218*cfb92d14SAndroid Build Coastguard Worker
platformRadioHandleStateChange(otInstance * aInstance,otChangedFlags aFlags)219*cfb92d14SAndroid Build Coastguard Worker void platformRadioHandleStateChange(otInstance *aInstance, otChangedFlags aFlags)
220*cfb92d14SAndroid Build Coastguard Worker {
221*cfb92d14SAndroid Build Coastguard Worker if (OT_CHANGED_THREAD_NETIF_STATE & aFlags)
222*cfb92d14SAndroid Build Coastguard Worker {
223*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().SetTimeSyncState(otIp6IsEnabled(aInstance));
224*cfb92d14SAndroid Build Coastguard Worker }
225*cfb92d14SAndroid Build Coastguard Worker }
226*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetIeeeEui64(otInstance * aInstance,uint8_t * aIeeeEui64)227*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64)
228*cfb92d14SAndroid Build Coastguard Worker {
229*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
230*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().GetIeeeEui64(aIeeeEui64));
231*cfb92d14SAndroid Build Coastguard Worker }
232*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetPanId(otInstance * aInstance,uint16_t panid)233*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetPanId(otInstance *aInstance, uint16_t panid)
234*cfb92d14SAndroid Build Coastguard Worker {
235*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
236*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetPanId(panid));
237*cfb92d14SAndroid Build Coastguard Worker }
238*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetExtendedAddress(otInstance * aInstance,const otExtAddress * aAddress)239*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetExtendedAddress(otInstance *aInstance, const otExtAddress *aAddress)
240*cfb92d14SAndroid Build Coastguard Worker {
241*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
242*cfb92d14SAndroid Build Coastguard Worker otExtAddress addr;
243*cfb92d14SAndroid Build Coastguard Worker
244*cfb92d14SAndroid Build Coastguard Worker for (size_t i = 0; i < sizeof(addr); i++)
245*cfb92d14SAndroid Build Coastguard Worker {
246*cfb92d14SAndroid Build Coastguard Worker addr.m8[i] = aAddress->m8[sizeof(addr) - 1 - i];
247*cfb92d14SAndroid Build Coastguard Worker }
248*cfb92d14SAndroid Build Coastguard Worker
249*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetExtendedAddress(addr));
250*cfb92d14SAndroid Build Coastguard Worker }
251*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetShortAddress(otInstance * aInstance,uint16_t aAddress)252*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetShortAddress(otInstance *aInstance, uint16_t aAddress)
253*cfb92d14SAndroid Build Coastguard Worker {
254*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
255*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetShortAddress(aAddress));
256*cfb92d14SAndroid Build Coastguard Worker }
257*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetPromiscuous(otInstance * aInstance,bool aEnable)258*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetPromiscuous(otInstance *aInstance, bool aEnable)
259*cfb92d14SAndroid Build Coastguard Worker {
260*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
261*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetPromiscuous(aEnable));
262*cfb92d14SAndroid Build Coastguard Worker }
263*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioIsEnabled(otInstance * aInstance)264*cfb92d14SAndroid Build Coastguard Worker bool otPlatRadioIsEnabled(otInstance *aInstance)
265*cfb92d14SAndroid Build Coastguard Worker {
266*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
267*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().IsEnabled();
268*cfb92d14SAndroid Build Coastguard Worker }
269*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioEnable(otInstance * aInstance)270*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioEnable(otInstance *aInstance) { return GetRadioSpinel().Enable(aInstance); }
271*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioDisable(otInstance * aInstance)272*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioDisable(otInstance *aInstance)
273*cfb92d14SAndroid Build Coastguard Worker {
274*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
275*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().Disable();
276*cfb92d14SAndroid Build Coastguard Worker }
277*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSleep(otInstance * aInstance)278*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSleep(otInstance *aInstance)
279*cfb92d14SAndroid Build Coastguard Worker {
280*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
281*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().Sleep();
282*cfb92d14SAndroid Build Coastguard Worker }
283*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioReceive(otInstance * aInstance,uint8_t aChannel)284*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioReceive(otInstance *aInstance, uint8_t aChannel)
285*cfb92d14SAndroid Build Coastguard Worker {
286*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
287*cfb92d14SAndroid Build Coastguard Worker
288*cfb92d14SAndroid Build Coastguard Worker otError error;
289*cfb92d14SAndroid Build Coastguard Worker
290*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().Receive(aChannel));
291*cfb92d14SAndroid Build Coastguard Worker
292*cfb92d14SAndroid Build Coastguard Worker exit:
293*cfb92d14SAndroid Build Coastguard Worker return error;
294*cfb92d14SAndroid Build Coastguard Worker }
295*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioTransmit(otInstance * aInstance,otRadioFrame * aFrame)296*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame)
297*cfb92d14SAndroid Build Coastguard Worker {
298*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
299*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().Transmit(*aFrame);
300*cfb92d14SAndroid Build Coastguard Worker }
301*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetTransmitBuffer(otInstance * aInstance)302*cfb92d14SAndroid Build Coastguard Worker otRadioFrame *otPlatRadioGetTransmitBuffer(otInstance *aInstance)
303*cfb92d14SAndroid Build Coastguard Worker {
304*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
305*cfb92d14SAndroid Build Coastguard Worker return &GetRadioSpinel().GetTransmitFrame();
306*cfb92d14SAndroid Build Coastguard Worker }
307*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetRssi(otInstance * aInstance)308*cfb92d14SAndroid Build Coastguard Worker int8_t otPlatRadioGetRssi(otInstance *aInstance)
309*cfb92d14SAndroid Build Coastguard Worker {
310*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
311*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetRssi();
312*cfb92d14SAndroid Build Coastguard Worker }
313*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetCaps(otInstance * aInstance)314*cfb92d14SAndroid Build Coastguard Worker otRadioCaps otPlatRadioGetCaps(otInstance *aInstance)
315*cfb92d14SAndroid Build Coastguard Worker {
316*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
317*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetRadioCaps();
318*cfb92d14SAndroid Build Coastguard Worker }
319*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetVersionString(otInstance * aInstance)320*cfb92d14SAndroid Build Coastguard Worker const char *otPlatRadioGetVersionString(otInstance *aInstance)
321*cfb92d14SAndroid Build Coastguard Worker {
322*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
323*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetVersion();
324*cfb92d14SAndroid Build Coastguard Worker }
325*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetPromiscuous(otInstance * aInstance)326*cfb92d14SAndroid Build Coastguard Worker bool otPlatRadioGetPromiscuous(otInstance *aInstance)
327*cfb92d14SAndroid Build Coastguard Worker {
328*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
329*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().IsPromiscuous();
330*cfb92d14SAndroid Build Coastguard Worker }
331*cfb92d14SAndroid Build Coastguard Worker
platformRadioUpdateFdSet(otSysMainloopContext * aContext)332*cfb92d14SAndroid Build Coastguard Worker void platformRadioUpdateFdSet(otSysMainloopContext *aContext)
333*cfb92d14SAndroid Build Coastguard Worker {
334*cfb92d14SAndroid Build Coastguard Worker uint64_t now = otPlatTimeGet();
335*cfb92d14SAndroid Build Coastguard Worker uint64_t deadline = GetRadioSpinel().GetNextRadioTimeRecalcStart();
336*cfb92d14SAndroid Build Coastguard Worker
337*cfb92d14SAndroid Build Coastguard Worker if (GetRadioSpinel().IsTransmitting())
338*cfb92d14SAndroid Build Coastguard Worker {
339*cfb92d14SAndroid Build Coastguard Worker uint64_t txRadioEndUs = GetRadioSpinel().GetTxRadioEndUs();
340*cfb92d14SAndroid Build Coastguard Worker
341*cfb92d14SAndroid Build Coastguard Worker if (txRadioEndUs < deadline)
342*cfb92d14SAndroid Build Coastguard Worker {
343*cfb92d14SAndroid Build Coastguard Worker deadline = txRadioEndUs;
344*cfb92d14SAndroid Build Coastguard Worker }
345*cfb92d14SAndroid Build Coastguard Worker }
346*cfb92d14SAndroid Build Coastguard Worker
347*cfb92d14SAndroid Build Coastguard Worker if (now < deadline)
348*cfb92d14SAndroid Build Coastguard Worker {
349*cfb92d14SAndroid Build Coastguard Worker uint64_t remain = deadline - now;
350*cfb92d14SAndroid Build Coastguard Worker
351*cfb92d14SAndroid Build Coastguard Worker if (remain < (static_cast<uint64_t>(aContext->mTimeout.tv_sec) * OT_US_PER_S +
352*cfb92d14SAndroid Build Coastguard Worker static_cast<uint64_t>(aContext->mTimeout.tv_usec)))
353*cfb92d14SAndroid Build Coastguard Worker {
354*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_sec = static_cast<time_t>(remain / OT_US_PER_S);
355*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_usec = static_cast<suseconds_t>(remain % OT_US_PER_S);
356*cfb92d14SAndroid Build Coastguard Worker }
357*cfb92d14SAndroid Build Coastguard Worker }
358*cfb92d14SAndroid Build Coastguard Worker else
359*cfb92d14SAndroid Build Coastguard Worker {
360*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_sec = 0;
361*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_usec = 0;
362*cfb92d14SAndroid Build Coastguard Worker }
363*cfb92d14SAndroid Build Coastguard Worker
364*cfb92d14SAndroid Build Coastguard Worker if (GetRadioSpinel().IsTransmitDone())
365*cfb92d14SAndroid Build Coastguard Worker {
366*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_sec = 0;
367*cfb92d14SAndroid Build Coastguard Worker aContext->mTimeout.tv_usec = 0;
368*cfb92d14SAndroid Build Coastguard Worker }
369*cfb92d14SAndroid Build Coastguard Worker }
370*cfb92d14SAndroid Build Coastguard Worker
371*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_VIRTUAL_TIME
virtualTimeRadioProcess(otInstance * aInstance,const struct VirtualTimeEvent * aEvent)372*cfb92d14SAndroid Build Coastguard Worker void virtualTimeRadioProcess(otInstance *aInstance, const struct VirtualTimeEvent *aEvent)
373*cfb92d14SAndroid Build Coastguard Worker {
374*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
375*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().Process(aEvent);
376*cfb92d14SAndroid Build Coastguard Worker }
377*cfb92d14SAndroid Build Coastguard Worker #else
platformRadioProcess(otInstance * aInstance,const otSysMainloopContext * aContext)378*cfb92d14SAndroid Build Coastguard Worker void platformRadioProcess(otInstance *aInstance, const otSysMainloopContext *aContext)
379*cfb92d14SAndroid Build Coastguard Worker {
380*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
381*cfb92d14SAndroid Build Coastguard Worker
382*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().Process(aContext);
383*cfb92d14SAndroid Build Coastguard Worker }
384*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_POSIX_VIRTUAL_TIME
385*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioEnableSrcMatch(otInstance * aInstance,bool aEnable)386*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioEnableSrcMatch(otInstance *aInstance, bool aEnable)
387*cfb92d14SAndroid Build Coastguard Worker {
388*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
389*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().EnableSrcMatch(aEnable));
390*cfb92d14SAndroid Build Coastguard Worker }
391*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioAddSrcMatchShortEntry(otInstance * aInstance,uint16_t aShortAddress)392*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioAddSrcMatchShortEntry(otInstance *aInstance, uint16_t aShortAddress)
393*cfb92d14SAndroid Build Coastguard Worker {
394*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
395*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().AddSrcMatchShortEntry(aShortAddress);
396*cfb92d14SAndroid Build Coastguard Worker }
397*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioAddSrcMatchExtEntry(otInstance * aInstance,const otExtAddress * aExtAddress)398*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioAddSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress)
399*cfb92d14SAndroid Build Coastguard Worker {
400*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
401*cfb92d14SAndroid Build Coastguard Worker otExtAddress addr;
402*cfb92d14SAndroid Build Coastguard Worker
403*cfb92d14SAndroid Build Coastguard Worker for (size_t i = 0; i < sizeof(addr); i++)
404*cfb92d14SAndroid Build Coastguard Worker {
405*cfb92d14SAndroid Build Coastguard Worker addr.m8[i] = aExtAddress->m8[sizeof(addr) - 1 - i];
406*cfb92d14SAndroid Build Coastguard Worker }
407*cfb92d14SAndroid Build Coastguard Worker
408*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().AddSrcMatchExtEntry(addr);
409*cfb92d14SAndroid Build Coastguard Worker }
410*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioClearSrcMatchShortEntry(otInstance * aInstance,uint16_t aShortAddress)411*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioClearSrcMatchShortEntry(otInstance *aInstance, uint16_t aShortAddress)
412*cfb92d14SAndroid Build Coastguard Worker {
413*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
414*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().ClearSrcMatchShortEntry(aShortAddress);
415*cfb92d14SAndroid Build Coastguard Worker }
416*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioClearSrcMatchExtEntry(otInstance * aInstance,const otExtAddress * aExtAddress)417*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioClearSrcMatchExtEntry(otInstance *aInstance, const otExtAddress *aExtAddress)
418*cfb92d14SAndroid Build Coastguard Worker {
419*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
420*cfb92d14SAndroid Build Coastguard Worker otExtAddress addr;
421*cfb92d14SAndroid Build Coastguard Worker
422*cfb92d14SAndroid Build Coastguard Worker for (size_t i = 0; i < sizeof(addr); i++)
423*cfb92d14SAndroid Build Coastguard Worker {
424*cfb92d14SAndroid Build Coastguard Worker addr.m8[i] = aExtAddress->m8[sizeof(addr) - 1 - i];
425*cfb92d14SAndroid Build Coastguard Worker }
426*cfb92d14SAndroid Build Coastguard Worker
427*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().ClearSrcMatchExtEntry(addr);
428*cfb92d14SAndroid Build Coastguard Worker }
429*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioClearSrcMatchShortEntries(otInstance * aInstance)430*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioClearSrcMatchShortEntries(otInstance *aInstance)
431*cfb92d14SAndroid Build Coastguard Worker {
432*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
433*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().ClearSrcMatchShortEntries());
434*cfb92d14SAndroid Build Coastguard Worker }
435*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioClearSrcMatchExtEntries(otInstance * aInstance)436*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioClearSrcMatchExtEntries(otInstance *aInstance)
437*cfb92d14SAndroid Build Coastguard Worker {
438*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
439*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().ClearSrcMatchExtEntries());
440*cfb92d14SAndroid Build Coastguard Worker }
441*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioEnergyScan(otInstance * aInstance,uint8_t aScanChannel,uint16_t aScanDuration)442*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioEnergyScan(otInstance *aInstance, uint8_t aScanChannel, uint16_t aScanDuration)
443*cfb92d14SAndroid Build Coastguard Worker {
444*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
445*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().EnergyScan(aScanChannel, aScanDuration);
446*cfb92d14SAndroid Build Coastguard Worker }
447*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetTransmitPower(otInstance * aInstance,int8_t * aPower)448*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioGetTransmitPower(otInstance *aInstance, int8_t *aPower)
449*cfb92d14SAndroid Build Coastguard Worker {
450*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
451*cfb92d14SAndroid Build Coastguard Worker assert(aPower != nullptr);
452*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetTransmitPower(*aPower);
453*cfb92d14SAndroid Build Coastguard Worker }
454*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetTransmitPower(otInstance * aInstance,int8_t aPower)455*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetTransmitPower(otInstance *aInstance, int8_t aPower)
456*cfb92d14SAndroid Build Coastguard Worker {
457*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
458*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetTransmitPower(aPower);
459*cfb92d14SAndroid Build Coastguard Worker }
460*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetCcaEnergyDetectThreshold(otInstance * aInstance,int8_t * aThreshold)461*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioGetCcaEnergyDetectThreshold(otInstance *aInstance, int8_t *aThreshold)
462*cfb92d14SAndroid Build Coastguard Worker {
463*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
464*cfb92d14SAndroid Build Coastguard Worker assert(aThreshold != nullptr);
465*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetCcaEnergyDetectThreshold(*aThreshold);
466*cfb92d14SAndroid Build Coastguard Worker }
467*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetCcaEnergyDetectThreshold(otInstance * aInstance,int8_t aThreshold)468*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetCcaEnergyDetectThreshold(otInstance *aInstance, int8_t aThreshold)
469*cfb92d14SAndroid Build Coastguard Worker {
470*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
471*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetCcaEnergyDetectThreshold(aThreshold);
472*cfb92d14SAndroid Build Coastguard Worker }
473*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetFemLnaGain(otInstance * aInstance,int8_t * aGain)474*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioGetFemLnaGain(otInstance *aInstance, int8_t *aGain)
475*cfb92d14SAndroid Build Coastguard Worker {
476*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
477*cfb92d14SAndroid Build Coastguard Worker assert(aGain != nullptr);
478*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetFemLnaGain(*aGain);
479*cfb92d14SAndroid Build Coastguard Worker }
480*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetFemLnaGain(otInstance * aInstance,int8_t aGain)481*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetFemLnaGain(otInstance *aInstance, int8_t aGain)
482*cfb92d14SAndroid Build Coastguard Worker {
483*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
484*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetFemLnaGain(aGain);
485*cfb92d14SAndroid Build Coastguard Worker }
486*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetReceiveSensitivity(otInstance * aInstance)487*cfb92d14SAndroid Build Coastguard Worker int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance)
488*cfb92d14SAndroid Build Coastguard Worker {
489*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
490*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetReceiveSensitivity();
491*cfb92d14SAndroid Build Coastguard Worker }
492*cfb92d14SAndroid Build Coastguard Worker
493*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
otPlatRadioSetCoexEnabled(otInstance * aInstance,bool aEnabled)494*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetCoexEnabled(otInstance *aInstance, bool aEnabled)
495*cfb92d14SAndroid Build Coastguard Worker {
496*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
497*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetCoexEnabled(aEnabled);
498*cfb92d14SAndroid Build Coastguard Worker }
499*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioIsCoexEnabled(otInstance * aInstance)500*cfb92d14SAndroid Build Coastguard Worker bool otPlatRadioIsCoexEnabled(otInstance *aInstance)
501*cfb92d14SAndroid Build Coastguard Worker {
502*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
503*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().IsCoexEnabled();
504*cfb92d14SAndroid Build Coastguard Worker }
505*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetCoexMetrics(otInstance * aInstance,otRadioCoexMetrics * aCoexMetrics)506*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioGetCoexMetrics(otInstance *aInstance, otRadioCoexMetrics *aCoexMetrics)
507*cfb92d14SAndroid Build Coastguard Worker {
508*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
509*cfb92d14SAndroid Build Coastguard Worker
510*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
511*cfb92d14SAndroid Build Coastguard Worker
512*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aCoexMetrics != nullptr, error = OT_ERROR_INVALID_ARGS);
513*cfb92d14SAndroid Build Coastguard Worker
514*cfb92d14SAndroid Build Coastguard Worker error = GetRadioSpinel().GetCoexMetrics(*aCoexMetrics);
515*cfb92d14SAndroid Build Coastguard Worker
516*cfb92d14SAndroid Build Coastguard Worker exit:
517*cfb92d14SAndroid Build Coastguard Worker return error;
518*cfb92d14SAndroid Build Coastguard Worker }
519*cfb92d14SAndroid Build Coastguard Worker #endif
520*cfb92d14SAndroid Build Coastguard Worker
521*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_DIAG_ENABLE
522*cfb92d14SAndroid Build Coastguard Worker static otPlatDiagOutputCallback sDiagOutputCallback = nullptr;
523*cfb92d14SAndroid Build Coastguard Worker static void *sDiagCallbackContext = nullptr;
524*cfb92d14SAndroid Build Coastguard Worker static char *sDiagOutput = nullptr;
525*cfb92d14SAndroid Build Coastguard Worker static uint16_t sDiagOutputLen = 0;
526*cfb92d14SAndroid Build Coastguard Worker
handleDiagOutput(const char * aFormat,va_list aArguments,void * aContext)527*cfb92d14SAndroid Build Coastguard Worker static void handleDiagOutput(const char *aFormat, va_list aArguments, void *aContext)
528*cfb92d14SAndroid Build Coastguard Worker {
529*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aContext);
530*cfb92d14SAndroid Build Coastguard Worker int charsWritten;
531*cfb92d14SAndroid Build Coastguard Worker
532*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit((sDiagOutput != nullptr) && (sDiagOutputLen > 0));
533*cfb92d14SAndroid Build Coastguard Worker charsWritten = vsnprintf(sDiagOutput, sDiagOutputLen, aFormat, aArguments);
534*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(charsWritten > 0);
535*cfb92d14SAndroid Build Coastguard Worker charsWritten = (sDiagOutputLen <= charsWritten) ? sDiagOutputLen : charsWritten;
536*cfb92d14SAndroid Build Coastguard Worker sDiagOutput += charsWritten;
537*cfb92d14SAndroid Build Coastguard Worker sDiagOutputLen -= charsWritten;
538*cfb92d14SAndroid Build Coastguard Worker
539*cfb92d14SAndroid Build Coastguard Worker exit:
540*cfb92d14SAndroid Build Coastguard Worker return;
541*cfb92d14SAndroid Build Coastguard Worker }
542*cfb92d14SAndroid Build Coastguard Worker
setDiagOutput(char * aOutput,size_t aSize)543*cfb92d14SAndroid Build Coastguard Worker static void setDiagOutput(char *aOutput, size_t aSize)
544*cfb92d14SAndroid Build Coastguard Worker {
545*cfb92d14SAndroid Build Coastguard Worker sDiagOutput = aOutput;
546*cfb92d14SAndroid Build Coastguard Worker sDiagOutputLen = static_cast<uint16_t>(aSize);
547*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().SetDiagOutputCallback(handleDiagOutput, nullptr);
548*cfb92d14SAndroid Build Coastguard Worker }
549*cfb92d14SAndroid Build Coastguard Worker
freeDiagOutput(void)550*cfb92d14SAndroid Build Coastguard Worker static void freeDiagOutput(void)
551*cfb92d14SAndroid Build Coastguard Worker {
552*cfb92d14SAndroid Build Coastguard Worker sDiagOutput = nullptr;
553*cfb92d14SAndroid Build Coastguard Worker sDiagOutputLen = 0;
554*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().SetDiagOutputCallback(sDiagOutputCallback, sDiagCallbackContext);
555*cfb92d14SAndroid Build Coastguard Worker }
556*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagSetOutputCallback(otInstance * aInstance,otPlatDiagOutputCallback aCallback,void * aContext)557*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagSetOutputCallback(otInstance *aInstance, otPlatDiagOutputCallback aCallback, void *aContext)
558*cfb92d14SAndroid Build Coastguard Worker {
559*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
560*cfb92d14SAndroid Build Coastguard Worker
561*cfb92d14SAndroid Build Coastguard Worker sDiagOutputCallback = aCallback;
562*cfb92d14SAndroid Build Coastguard Worker sDiagCallbackContext = aContext;
563*cfb92d14SAndroid Build Coastguard Worker
564*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().SetDiagOutputCallback(aCallback, aContext);
565*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_RCP_CAPS_DIAG_ENABLE
566*cfb92d14SAndroid Build Coastguard Worker GetRcpCapsDiag().SetDiagOutputCallback(aCallback, aContext);
567*cfb92d14SAndroid Build Coastguard Worker #endif
568*cfb92d14SAndroid Build Coastguard Worker }
569*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagProcess(otInstance * aInstance,uint8_t aArgsLength,char * aArgs[])570*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagProcess(otInstance *aInstance, uint8_t aArgsLength, char *aArgs[])
571*cfb92d14SAndroid Build Coastguard Worker {
572*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
573*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
574*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE] = {'\0'};
575*cfb92d14SAndroid Build Coastguard Worker char *cur = cmd;
576*cfb92d14SAndroid Build Coastguard Worker char *end = cmd + sizeof(cmd);
577*cfb92d14SAndroid Build Coastguard Worker
578*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_RCP_CAPS_DIAG_ENABLE
579*cfb92d14SAndroid Build Coastguard Worker if (strcmp(aArgs[0], "rcpcaps") == 0)
580*cfb92d14SAndroid Build Coastguard Worker {
581*cfb92d14SAndroid Build Coastguard Worker error = GetRcpCapsDiag().DiagProcess(aArgs, aArgsLength);
582*cfb92d14SAndroid Build Coastguard Worker ExitNow();
583*cfb92d14SAndroid Build Coastguard Worker }
584*cfb92d14SAndroid Build Coastguard Worker #endif
585*cfb92d14SAndroid Build Coastguard Worker
586*cfb92d14SAndroid Build Coastguard Worker if (strcmp(aArgs[0], "radiospinel") == 0)
587*cfb92d14SAndroid Build Coastguard Worker {
588*cfb92d14SAndroid Build Coastguard Worker error = GetRadioSpinel().RadioSpinelDiagProcess(aArgs, aArgsLength);
589*cfb92d14SAndroid Build Coastguard Worker ExitNow();
590*cfb92d14SAndroid Build Coastguard Worker }
591*cfb92d14SAndroid Build Coastguard Worker
592*cfb92d14SAndroid Build Coastguard Worker for (uint8_t index = 0; (index < aArgsLength) && (cur < end); index++)
593*cfb92d14SAndroid Build Coastguard Worker {
594*cfb92d14SAndroid Build Coastguard Worker cur += snprintf(cur, static_cast<size_t>(end - cur), "%s ", aArgs[index]);
595*cfb92d14SAndroid Build Coastguard Worker }
596*cfb92d14SAndroid Build Coastguard Worker
597*cfb92d14SAndroid Build Coastguard Worker // deliver the platform specific diags commands to radio only ncp.
598*cfb92d14SAndroid Build Coastguard Worker error = GetRadioSpinel().PlatDiagProcess(cmd);
599*cfb92d14SAndroid Build Coastguard Worker
600*cfb92d14SAndroid Build Coastguard Worker exit:
601*cfb92d14SAndroid Build Coastguard Worker return error;
602*cfb92d14SAndroid Build Coastguard Worker }
603*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagModeSet(bool aMode)604*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagModeSet(bool aMode)
605*cfb92d14SAndroid Build Coastguard Worker {
606*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(GetRadioSpinel().PlatDiagProcess(aMode ? "start" : "stop"));
607*cfb92d14SAndroid Build Coastguard Worker GetRadioSpinel().SetDiagEnabled(aMode);
608*cfb92d14SAndroid Build Coastguard Worker
609*cfb92d14SAndroid Build Coastguard Worker exit:
610*cfb92d14SAndroid Build Coastguard Worker return;
611*cfb92d14SAndroid Build Coastguard Worker }
612*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagModeGet(void)613*cfb92d14SAndroid Build Coastguard Worker bool otPlatDiagModeGet(void) { return GetRadioSpinel().IsDiagEnabled(); }
614*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagTxPowerSet(int8_t aTxPower)615*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagTxPowerSet(int8_t aTxPower)
616*cfb92d14SAndroid Build Coastguard Worker {
617*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
618*cfb92d14SAndroid Build Coastguard Worker
619*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "power %d", aTxPower);
620*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(GetRadioSpinel().PlatDiagProcess(cmd));
621*cfb92d14SAndroid Build Coastguard Worker
622*cfb92d14SAndroid Build Coastguard Worker exit:
623*cfb92d14SAndroid Build Coastguard Worker return;
624*cfb92d14SAndroid Build Coastguard Worker }
625*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagChannelSet(uint8_t aChannel)626*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagChannelSet(uint8_t aChannel)
627*cfb92d14SAndroid Build Coastguard Worker {
628*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
629*cfb92d14SAndroid Build Coastguard Worker
630*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "channel %d", aChannel);
631*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(GetRadioSpinel().PlatDiagProcess(cmd));
632*cfb92d14SAndroid Build Coastguard Worker
633*cfb92d14SAndroid Build Coastguard Worker exit:
634*cfb92d14SAndroid Build Coastguard Worker return;
635*cfb92d14SAndroid Build Coastguard Worker }
636*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagGpioSet(uint32_t aGpio,bool aValue)637*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagGpioSet(uint32_t aGpio, bool aValue)
638*cfb92d14SAndroid Build Coastguard Worker {
639*cfb92d14SAndroid Build Coastguard Worker otError error;
640*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
641*cfb92d14SAndroid Build Coastguard Worker
642*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "gpio set %d %d", aGpio, aValue);
643*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
644*cfb92d14SAndroid Build Coastguard Worker
645*cfb92d14SAndroid Build Coastguard Worker exit:
646*cfb92d14SAndroid Build Coastguard Worker return error;
647*cfb92d14SAndroid Build Coastguard Worker }
648*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagGpioGet(uint32_t aGpio,bool * aValue)649*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagGpioGet(uint32_t aGpio, bool *aValue)
650*cfb92d14SAndroid Build Coastguard Worker {
651*cfb92d14SAndroid Build Coastguard Worker otError error;
652*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
653*cfb92d14SAndroid Build Coastguard Worker char output[OPENTHREAD_CONFIG_DIAG_OUTPUT_BUFFER_SIZE];
654*cfb92d14SAndroid Build Coastguard Worker char *str;
655*cfb92d14SAndroid Build Coastguard Worker
656*cfb92d14SAndroid Build Coastguard Worker setDiagOutput(output, sizeof(output));
657*cfb92d14SAndroid Build Coastguard Worker
658*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "gpio get %d", aGpio);
659*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
660*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit((str = strtok(output, "\r")) != nullptr, error = OT_ERROR_FAILED);
661*cfb92d14SAndroid Build Coastguard Worker *aValue = static_cast<bool>(atoi(str));
662*cfb92d14SAndroid Build Coastguard Worker
663*cfb92d14SAndroid Build Coastguard Worker exit:
664*cfb92d14SAndroid Build Coastguard Worker freeDiagOutput();
665*cfb92d14SAndroid Build Coastguard Worker
666*cfb92d14SAndroid Build Coastguard Worker return error;
667*cfb92d14SAndroid Build Coastguard Worker }
668*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagGpioSetMode(uint32_t aGpio,otGpioMode aMode)669*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagGpioSetMode(uint32_t aGpio, otGpioMode aMode)
670*cfb92d14SAndroid Build Coastguard Worker {
671*cfb92d14SAndroid Build Coastguard Worker otError error;
672*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
673*cfb92d14SAndroid Build Coastguard Worker
674*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "gpio mode %d %s", aGpio, aMode == OT_GPIO_MODE_INPUT ? "in" : "out");
675*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
676*cfb92d14SAndroid Build Coastguard Worker
677*cfb92d14SAndroid Build Coastguard Worker exit:
678*cfb92d14SAndroid Build Coastguard Worker return error;
679*cfb92d14SAndroid Build Coastguard Worker }
680*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagGpioGetMode(uint32_t aGpio,otGpioMode * aMode)681*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagGpioGetMode(uint32_t aGpio, otGpioMode *aMode)
682*cfb92d14SAndroid Build Coastguard Worker {
683*cfb92d14SAndroid Build Coastguard Worker otError error;
684*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
685*cfb92d14SAndroid Build Coastguard Worker char output[OPENTHREAD_CONFIG_DIAG_OUTPUT_BUFFER_SIZE];
686*cfb92d14SAndroid Build Coastguard Worker char *str;
687*cfb92d14SAndroid Build Coastguard Worker
688*cfb92d14SAndroid Build Coastguard Worker setDiagOutput(output, sizeof(output));
689*cfb92d14SAndroid Build Coastguard Worker
690*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "gpio mode %d", aGpio);
691*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
692*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit((str = strtok(output, "\r")) != nullptr, error = OT_ERROR_FAILED);
693*cfb92d14SAndroid Build Coastguard Worker
694*cfb92d14SAndroid Build Coastguard Worker if (strcmp(str, "in") == 0)
695*cfb92d14SAndroid Build Coastguard Worker {
696*cfb92d14SAndroid Build Coastguard Worker *aMode = OT_GPIO_MODE_INPUT;
697*cfb92d14SAndroid Build Coastguard Worker }
698*cfb92d14SAndroid Build Coastguard Worker else if (strcmp(str, "out") == 0)
699*cfb92d14SAndroid Build Coastguard Worker {
700*cfb92d14SAndroid Build Coastguard Worker *aMode = OT_GPIO_MODE_OUTPUT;
701*cfb92d14SAndroid Build Coastguard Worker }
702*cfb92d14SAndroid Build Coastguard Worker else
703*cfb92d14SAndroid Build Coastguard Worker {
704*cfb92d14SAndroid Build Coastguard Worker error = OT_ERROR_FAILED;
705*cfb92d14SAndroid Build Coastguard Worker }
706*cfb92d14SAndroid Build Coastguard Worker
707*cfb92d14SAndroid Build Coastguard Worker exit:
708*cfb92d14SAndroid Build Coastguard Worker freeDiagOutput();
709*cfb92d14SAndroid Build Coastguard Worker
710*cfb92d14SAndroid Build Coastguard Worker return error;
711*cfb92d14SAndroid Build Coastguard Worker }
712*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioGetPowerSettings(otInstance * aInstance,uint8_t aChannel,int16_t * aTargetPower,int16_t * aActualPower,uint8_t * aRawPowerSetting,uint16_t * aRawPowerSettingLength)713*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioGetPowerSettings(otInstance *aInstance,
714*cfb92d14SAndroid Build Coastguard Worker uint8_t aChannel,
715*cfb92d14SAndroid Build Coastguard Worker int16_t *aTargetPower,
716*cfb92d14SAndroid Build Coastguard Worker int16_t *aActualPower,
717*cfb92d14SAndroid Build Coastguard Worker uint8_t *aRawPowerSetting,
718*cfb92d14SAndroid Build Coastguard Worker uint16_t *aRawPowerSettingLength)
719*cfb92d14SAndroid Build Coastguard Worker {
720*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
721*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kRawPowerStringSize = OPENTHREAD_CONFIG_POWER_CALIBRATION_RAW_POWER_SETTING_SIZE * 2 + 1;
722*cfb92d14SAndroid Build Coastguard Worker static constexpr uint16_t kFmtStringSize = 100;
723*cfb92d14SAndroid Build Coastguard Worker
724*cfb92d14SAndroid Build Coastguard Worker otError error;
725*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
726*cfb92d14SAndroid Build Coastguard Worker char output[OPENTHREAD_CONFIG_DIAG_OUTPUT_BUFFER_SIZE];
727*cfb92d14SAndroid Build Coastguard Worker int targetPower;
728*cfb92d14SAndroid Build Coastguard Worker int actualPower;
729*cfb92d14SAndroid Build Coastguard Worker char rawPowerSetting[kRawPowerStringSize];
730*cfb92d14SAndroid Build Coastguard Worker char fmt[kFmtStringSize];
731*cfb92d14SAndroid Build Coastguard Worker
732*cfb92d14SAndroid Build Coastguard Worker assert((aTargetPower != nullptr) && (aActualPower != nullptr) && (aRawPowerSetting != nullptr) &&
733*cfb92d14SAndroid Build Coastguard Worker (aRawPowerSettingLength != nullptr));
734*cfb92d14SAndroid Build Coastguard Worker
735*cfb92d14SAndroid Build Coastguard Worker setDiagOutput(output, sizeof(output));
736*cfb92d14SAndroid Build Coastguard Worker
737*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "powersettings %d", aChannel);
738*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
739*cfb92d14SAndroid Build Coastguard Worker snprintf(fmt, sizeof(fmt), "TargetPower(0.01dBm): %%d\r\nActualPower(0.01dBm): %%d\r\nRawPowerSetting: %%%us\r\n",
740*cfb92d14SAndroid Build Coastguard Worker kRawPowerStringSize);
741*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(sscanf(output, fmt, &targetPower, &actualPower, rawPowerSetting) == 3, error = OT_ERROR_FAILED);
742*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(
743*cfb92d14SAndroid Build Coastguard Worker error = ot::Utils::CmdLineParser::ParseAsHexString(rawPowerSetting, *aRawPowerSettingLength, aRawPowerSetting));
744*cfb92d14SAndroid Build Coastguard Worker *aTargetPower = static_cast<int16_t>(targetPower);
745*cfb92d14SAndroid Build Coastguard Worker *aActualPower = static_cast<int16_t>(actualPower);
746*cfb92d14SAndroid Build Coastguard Worker
747*cfb92d14SAndroid Build Coastguard Worker exit:
748*cfb92d14SAndroid Build Coastguard Worker freeDiagOutput();
749*cfb92d14SAndroid Build Coastguard Worker
750*cfb92d14SAndroid Build Coastguard Worker return error;
751*cfb92d14SAndroid Build Coastguard Worker }
752*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioSetRawPowerSetting(otInstance * aInstance,const uint8_t * aRawPowerSetting,uint16_t aRawPowerSettingLength)753*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioSetRawPowerSetting(otInstance *aInstance,
754*cfb92d14SAndroid Build Coastguard Worker const uint8_t *aRawPowerSetting,
755*cfb92d14SAndroid Build Coastguard Worker uint16_t aRawPowerSettingLength)
756*cfb92d14SAndroid Build Coastguard Worker {
757*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
758*cfb92d14SAndroid Build Coastguard Worker
759*cfb92d14SAndroid Build Coastguard Worker otError error;
760*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
761*cfb92d14SAndroid Build Coastguard Worker int nbytes;
762*cfb92d14SAndroid Build Coastguard Worker
763*cfb92d14SAndroid Build Coastguard Worker assert(aRawPowerSetting != nullptr);
764*cfb92d14SAndroid Build Coastguard Worker
765*cfb92d14SAndroid Build Coastguard Worker nbytes = snprintf(cmd, sizeof(cmd), "rawpowersetting ");
766*cfb92d14SAndroid Build Coastguard Worker
767*cfb92d14SAndroid Build Coastguard Worker for (uint16_t i = 0; i < aRawPowerSettingLength; i++)
768*cfb92d14SAndroid Build Coastguard Worker {
769*cfb92d14SAndroid Build Coastguard Worker nbytes += snprintf(cmd + nbytes, sizeof(cmd) - static_cast<size_t>(nbytes), "%02x", aRawPowerSetting[i]);
770*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(nbytes < static_cast<int>(sizeof(cmd)), error = OT_ERROR_INVALID_ARGS);
771*cfb92d14SAndroid Build Coastguard Worker }
772*cfb92d14SAndroid Build Coastguard Worker
773*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
774*cfb92d14SAndroid Build Coastguard Worker
775*cfb92d14SAndroid Build Coastguard Worker exit:
776*cfb92d14SAndroid Build Coastguard Worker return error;
777*cfb92d14SAndroid Build Coastguard Worker }
778*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioGetRawPowerSetting(otInstance * aInstance,uint8_t * aRawPowerSetting,uint16_t * aRawPowerSettingLength)779*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioGetRawPowerSetting(otInstance *aInstance,
780*cfb92d14SAndroid Build Coastguard Worker uint8_t *aRawPowerSetting,
781*cfb92d14SAndroid Build Coastguard Worker uint16_t *aRawPowerSettingLength)
782*cfb92d14SAndroid Build Coastguard Worker {
783*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
784*cfb92d14SAndroid Build Coastguard Worker otError error;
785*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
786*cfb92d14SAndroid Build Coastguard Worker char output[OPENTHREAD_CONFIG_DIAG_OUTPUT_BUFFER_SIZE];
787*cfb92d14SAndroid Build Coastguard Worker char *str;
788*cfb92d14SAndroid Build Coastguard Worker
789*cfb92d14SAndroid Build Coastguard Worker assert((aRawPowerSetting != nullptr) && (aRawPowerSettingLength != nullptr));
790*cfb92d14SAndroid Build Coastguard Worker
791*cfb92d14SAndroid Build Coastguard Worker setDiagOutput(output, sizeof(output));
792*cfb92d14SAndroid Build Coastguard Worker
793*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "rawpowersetting");
794*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
795*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit((str = strtok(output, "\r")) != nullptr, error = OT_ERROR_FAILED);
796*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = ot::Utils::CmdLineParser::ParseAsHexString(str, *aRawPowerSettingLength, aRawPowerSetting));
797*cfb92d14SAndroid Build Coastguard Worker
798*cfb92d14SAndroid Build Coastguard Worker exit:
799*cfb92d14SAndroid Build Coastguard Worker freeDiagOutput();
800*cfb92d14SAndroid Build Coastguard Worker
801*cfb92d14SAndroid Build Coastguard Worker return error;
802*cfb92d14SAndroid Build Coastguard Worker }
803*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioRawPowerSettingEnable(otInstance * aInstance,bool aEnable)804*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioRawPowerSettingEnable(otInstance *aInstance, bool aEnable)
805*cfb92d14SAndroid Build Coastguard Worker {
806*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
807*cfb92d14SAndroid Build Coastguard Worker
808*cfb92d14SAndroid Build Coastguard Worker otError error;
809*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
810*cfb92d14SAndroid Build Coastguard Worker
811*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "rawpowersetting %s", aEnable ? "enable" : "disable");
812*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
813*cfb92d14SAndroid Build Coastguard Worker
814*cfb92d14SAndroid Build Coastguard Worker exit:
815*cfb92d14SAndroid Build Coastguard Worker return error;
816*cfb92d14SAndroid Build Coastguard Worker }
817*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioTransmitCarrier(otInstance * aInstance,bool aEnable)818*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioTransmitCarrier(otInstance *aInstance, bool aEnable)
819*cfb92d14SAndroid Build Coastguard Worker {
820*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
821*cfb92d14SAndroid Build Coastguard Worker
822*cfb92d14SAndroid Build Coastguard Worker otError error;
823*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
824*cfb92d14SAndroid Build Coastguard Worker
825*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "cw %s", aEnable ? "start" : "stop");
826*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = GetRadioSpinel().PlatDiagProcess(cmd));
827*cfb92d14SAndroid Build Coastguard Worker
828*cfb92d14SAndroid Build Coastguard Worker exit:
829*cfb92d14SAndroid Build Coastguard Worker return error;
830*cfb92d14SAndroid Build Coastguard Worker }
831*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioTransmitStream(otInstance * aInstance,bool aEnable)832*cfb92d14SAndroid Build Coastguard Worker otError otPlatDiagRadioTransmitStream(otInstance *aInstance, bool aEnable)
833*cfb92d14SAndroid Build Coastguard Worker {
834*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
835*cfb92d14SAndroid Build Coastguard Worker
836*cfb92d14SAndroid Build Coastguard Worker char cmd[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
837*cfb92d14SAndroid Build Coastguard Worker
838*cfb92d14SAndroid Build Coastguard Worker snprintf(cmd, sizeof(cmd), "stream %s", aEnable ? "start" : "stop");
839*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().PlatDiagProcess(cmd);
840*cfb92d14SAndroid Build Coastguard Worker }
841*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagRadioReceived(otInstance * aInstance,otRadioFrame * aFrame,otError aError)842*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagRadioReceived(otInstance *aInstance, otRadioFrame *aFrame, otError aError)
843*cfb92d14SAndroid Build Coastguard Worker {
844*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
845*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aFrame);
846*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aError);
847*cfb92d14SAndroid Build Coastguard Worker }
848*cfb92d14SAndroid Build Coastguard Worker
otPlatDiagAlarmCallback(otInstance * aInstance)849*cfb92d14SAndroid Build Coastguard Worker void otPlatDiagAlarmCallback(otInstance *aInstance) { OT_UNUSED_VARIABLE(aInstance); }
850*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_DIAG_ENABLE
851*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetSupportedChannelMask(otInstance * aInstance)852*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatRadioGetSupportedChannelMask(otInstance *aInstance)
853*cfb92d14SAndroid Build Coastguard Worker {
854*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
855*cfb92d14SAndroid Build Coastguard Worker
856*cfb92d14SAndroid Build Coastguard Worker uint32_t channelMask;
857*cfb92d14SAndroid Build Coastguard Worker
858*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_CONFIGURATION_FILE_ENABLE
859*cfb92d14SAndroid Build Coastguard Worker if (sConfig.IsValid())
860*cfb92d14SAndroid Build Coastguard Worker {
861*cfb92d14SAndroid Build Coastguard Worker channelMask = sConfig.GetSupportedChannelMask();
862*cfb92d14SAndroid Build Coastguard Worker }
863*cfb92d14SAndroid Build Coastguard Worker else
864*cfb92d14SAndroid Build Coastguard Worker #endif
865*cfb92d14SAndroid Build Coastguard Worker {
866*cfb92d14SAndroid Build Coastguard Worker channelMask = GetRadioSpinel().GetRadioChannelMask(false);
867*cfb92d14SAndroid Build Coastguard Worker }
868*cfb92d14SAndroid Build Coastguard Worker
869*cfb92d14SAndroid Build Coastguard Worker return channelMask;
870*cfb92d14SAndroid Build Coastguard Worker }
871*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetPreferredChannelMask(otInstance * aInstance)872*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatRadioGetPreferredChannelMask(otInstance *aInstance)
873*cfb92d14SAndroid Build Coastguard Worker {
874*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
875*cfb92d14SAndroid Build Coastguard Worker
876*cfb92d14SAndroid Build Coastguard Worker uint32_t channelMask;
877*cfb92d14SAndroid Build Coastguard Worker
878*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_CONFIGURATION_FILE_ENABLE
879*cfb92d14SAndroid Build Coastguard Worker if (sConfig.IsValid())
880*cfb92d14SAndroid Build Coastguard Worker {
881*cfb92d14SAndroid Build Coastguard Worker channelMask = sConfig.GetPreferredChannelMask();
882*cfb92d14SAndroid Build Coastguard Worker }
883*cfb92d14SAndroid Build Coastguard Worker else
884*cfb92d14SAndroid Build Coastguard Worker #endif
885*cfb92d14SAndroid Build Coastguard Worker {
886*cfb92d14SAndroid Build Coastguard Worker channelMask = GetRadioSpinel().GetRadioChannelMask(true);
887*cfb92d14SAndroid Build Coastguard Worker }
888*cfb92d14SAndroid Build Coastguard Worker
889*cfb92d14SAndroid Build Coastguard Worker return channelMask;
890*cfb92d14SAndroid Build Coastguard Worker }
891*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetState(otInstance * aInstance)892*cfb92d14SAndroid Build Coastguard Worker otRadioState otPlatRadioGetState(otInstance *aInstance)
893*cfb92d14SAndroid Build Coastguard Worker {
894*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
895*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetState();
896*cfb92d14SAndroid Build Coastguard Worker }
897*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetMacKey(otInstance * aInstance,uint8_t aKeyIdMode,uint8_t aKeyId,const otMacKeyMaterial * aPrevKey,const otMacKeyMaterial * aCurrKey,const otMacKeyMaterial * aNextKey,otRadioKeyType aKeyType)898*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetMacKey(otInstance *aInstance,
899*cfb92d14SAndroid Build Coastguard Worker uint8_t aKeyIdMode,
900*cfb92d14SAndroid Build Coastguard Worker uint8_t aKeyId,
901*cfb92d14SAndroid Build Coastguard Worker const otMacKeyMaterial *aPrevKey,
902*cfb92d14SAndroid Build Coastguard Worker const otMacKeyMaterial *aCurrKey,
903*cfb92d14SAndroid Build Coastguard Worker const otMacKeyMaterial *aNextKey,
904*cfb92d14SAndroid Build Coastguard Worker otRadioKeyType aKeyType)
905*cfb92d14SAndroid Build Coastguard Worker {
906*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetMacKey(aKeyIdMode, aKeyId, aPrevKey, aCurrKey, aNextKey));
907*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
908*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aKeyType);
909*cfb92d14SAndroid Build Coastguard Worker }
910*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetMacFrameCounter(otInstance * aInstance,uint32_t aMacFrameCounter)911*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetMacFrameCounter(otInstance *aInstance, uint32_t aMacFrameCounter)
912*cfb92d14SAndroid Build Coastguard Worker {
913*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetMacFrameCounter(aMacFrameCounter, /* aSetIfLarger */ false));
914*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
915*cfb92d14SAndroid Build Coastguard Worker }
916*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetMacFrameCounterIfLarger(otInstance * aInstance,uint32_t aMacFrameCounter)917*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioSetMacFrameCounterIfLarger(otInstance *aInstance, uint32_t aMacFrameCounter)
918*cfb92d14SAndroid Build Coastguard Worker {
919*cfb92d14SAndroid Build Coastguard Worker SuccessOrDie(GetRadioSpinel().SetMacFrameCounter(aMacFrameCounter, /* aSetIfLarger */ true));
920*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
921*cfb92d14SAndroid Build Coastguard Worker }
922*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetNow(otInstance * aInstance)923*cfb92d14SAndroid Build Coastguard Worker uint64_t otPlatRadioGetNow(otInstance *aInstance)
924*cfb92d14SAndroid Build Coastguard Worker {
925*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
926*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetNow();
927*cfb92d14SAndroid Build Coastguard Worker }
928*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetBusSpeed(otInstance * aInstance)929*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatRadioGetBusSpeed(otInstance *aInstance)
930*cfb92d14SAndroid Build Coastguard Worker {
931*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
932*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetBusSpeed();
933*cfb92d14SAndroid Build Coastguard Worker }
934*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetBusLatency(otInstance * aInstance)935*cfb92d14SAndroid Build Coastguard Worker uint32_t otPlatRadioGetBusLatency(otInstance *aInstance)
936*cfb92d14SAndroid Build Coastguard Worker {
937*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
938*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetBusLatency();
939*cfb92d14SAndroid Build Coastguard Worker }
940*cfb92d14SAndroid Build Coastguard Worker
941*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE || OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE
otPlatRadioGetCslAccuracy(otInstance * aInstance)942*cfb92d14SAndroid Build Coastguard Worker uint8_t otPlatRadioGetCslAccuracy(otInstance *aInstance)
943*cfb92d14SAndroid Build Coastguard Worker {
944*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
945*cfb92d14SAndroid Build Coastguard Worker
946*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetCslAccuracy();
947*cfb92d14SAndroid Build Coastguard Worker }
948*cfb92d14SAndroid Build Coastguard Worker #endif
949*cfb92d14SAndroid Build Coastguard Worker
950*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE
otPlatRadioGetCslUncertainty(otInstance * aInstance)951*cfb92d14SAndroid Build Coastguard Worker uint8_t otPlatRadioGetCslUncertainty(otInstance *aInstance)
952*cfb92d14SAndroid Build Coastguard Worker {
953*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
954*cfb92d14SAndroid Build Coastguard Worker
955*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().GetCslUncertainty();
956*cfb92d14SAndroid Build Coastguard Worker }
957*cfb92d14SAndroid Build Coastguard Worker #endif
958*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetChannelMaxTransmitPower(otInstance * aInstance,uint8_t aChannel,int8_t aMaxPower)959*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetChannelMaxTransmitPower(otInstance *aInstance, uint8_t aChannel, int8_t aMaxPower)
960*cfb92d14SAndroid Build Coastguard Worker {
961*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
962*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetChannelMaxTransmitPower(aChannel, aMaxPower);
963*cfb92d14SAndroid Build Coastguard Worker }
964*cfb92d14SAndroid Build Coastguard Worker
965*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_POWER_CALIBRATION_ENABLE
otPlatRadioAddCalibratedPower(otInstance * aInstance,uint8_t aChannel,int16_t aActualPower,const uint8_t * aRawPowerSetting,uint16_t aRawPowerSettingLength)966*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioAddCalibratedPower(otInstance *aInstance,
967*cfb92d14SAndroid Build Coastguard Worker uint8_t aChannel,
968*cfb92d14SAndroid Build Coastguard Worker int16_t aActualPower,
969*cfb92d14SAndroid Build Coastguard Worker const uint8_t *aRawPowerSetting,
970*cfb92d14SAndroid Build Coastguard Worker uint16_t aRawPowerSettingLength)
971*cfb92d14SAndroid Build Coastguard Worker {
972*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
973*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().AddCalibratedPower(aChannel, aActualPower, aRawPowerSetting, aRawPowerSettingLength);
974*cfb92d14SAndroid Build Coastguard Worker }
975*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioClearCalibratedPowers(otInstance * aInstance)976*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioClearCalibratedPowers(otInstance *aInstance)
977*cfb92d14SAndroid Build Coastguard Worker {
978*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
979*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().ClearCalibratedPowers();
980*cfb92d14SAndroid Build Coastguard Worker }
981*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetChannelTargetPower(otInstance * aInstance,uint8_t aChannel,int16_t aTargetPower)982*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetChannelTargetPower(otInstance *aInstance, uint8_t aChannel, int16_t aTargetPower)
983*cfb92d14SAndroid Build Coastguard Worker {
984*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
985*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SetChannelTargetPower(aChannel, aTargetPower);
986*cfb92d14SAndroid Build Coastguard Worker }
987*cfb92d14SAndroid Build Coastguard Worker #endif
988*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioSetRegion(otInstance * aInstance,uint16_t aRegionCode)989*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioSetRegion(otInstance *aInstance, uint16_t aRegionCode)
990*cfb92d14SAndroid Build Coastguard Worker {
991*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
992*cfb92d14SAndroid Build Coastguard Worker
993*cfb92d14SAndroid Build Coastguard Worker otError error;
994*cfb92d14SAndroid Build Coastguard Worker
995*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_CONFIGURATION_FILE_ENABLE
996*cfb92d14SAndroid Build Coastguard Worker if (sConfig.IsValid())
997*cfb92d14SAndroid Build Coastguard Worker {
998*cfb92d14SAndroid Build Coastguard Worker error = sConfig.SetRegion(aRegionCode);
999*cfb92d14SAndroid Build Coastguard Worker }
1000*cfb92d14SAndroid Build Coastguard Worker else
1001*cfb92d14SAndroid Build Coastguard Worker #endif
1002*cfb92d14SAndroid Build Coastguard Worker {
1003*cfb92d14SAndroid Build Coastguard Worker error = GetRadioSpinel().SetRadioRegion(aRegionCode);
1004*cfb92d14SAndroid Build Coastguard Worker }
1005*cfb92d14SAndroid Build Coastguard Worker
1006*cfb92d14SAndroid Build Coastguard Worker return error;
1007*cfb92d14SAndroid Build Coastguard Worker }
1008*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioGetRegion(otInstance * aInstance,uint16_t * aRegionCode)1009*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioGetRegion(otInstance *aInstance, uint16_t *aRegionCode)
1010*cfb92d14SAndroid Build Coastguard Worker {
1011*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
1012*cfb92d14SAndroid Build Coastguard Worker
1013*cfb92d14SAndroid Build Coastguard Worker otError error;
1014*cfb92d14SAndroid Build Coastguard Worker
1015*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_CONFIGURATION_FILE_ENABLE
1016*cfb92d14SAndroid Build Coastguard Worker if (sConfig.IsValid())
1017*cfb92d14SAndroid Build Coastguard Worker {
1018*cfb92d14SAndroid Build Coastguard Worker *aRegionCode = sConfig.GetRegion();
1019*cfb92d14SAndroid Build Coastguard Worker error = OT_ERROR_NONE;
1020*cfb92d14SAndroid Build Coastguard Worker }
1021*cfb92d14SAndroid Build Coastguard Worker else
1022*cfb92d14SAndroid Build Coastguard Worker #endif
1023*cfb92d14SAndroid Build Coastguard Worker {
1024*cfb92d14SAndroid Build Coastguard Worker error = GetRadioSpinel().GetRadioRegion(aRegionCode);
1025*cfb92d14SAndroid Build Coastguard Worker }
1026*cfb92d14SAndroid Build Coastguard Worker
1027*cfb92d14SAndroid Build Coastguard Worker return error;
1028*cfb92d14SAndroid Build Coastguard Worker }
1029*cfb92d14SAndroid Build Coastguard Worker
1030*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
otPlatRadioConfigureEnhAckProbing(otInstance * aInstance,otLinkMetrics aLinkMetrics,const otShortAddress aShortAddress,const otExtAddress * aExtAddress)1031*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioConfigureEnhAckProbing(otInstance *aInstance,
1032*cfb92d14SAndroid Build Coastguard Worker otLinkMetrics aLinkMetrics,
1033*cfb92d14SAndroid Build Coastguard Worker const otShortAddress aShortAddress,
1034*cfb92d14SAndroid Build Coastguard Worker const otExtAddress *aExtAddress)
1035*cfb92d14SAndroid Build Coastguard Worker {
1036*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
1037*cfb92d14SAndroid Build Coastguard Worker
1038*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().ConfigureEnhAckProbing(aLinkMetrics, aShortAddress, *aExtAddress);
1039*cfb92d14SAndroid Build Coastguard Worker }
1040*cfb92d14SAndroid Build Coastguard Worker #endif
1041*cfb92d14SAndroid Build Coastguard Worker
otPlatRadioReceiveAt(otInstance * aInstance,uint8_t aChannel,uint32_t aStart,uint32_t aDuration)1042*cfb92d14SAndroid Build Coastguard Worker otError otPlatRadioReceiveAt(otInstance *aInstance, uint8_t aChannel, uint32_t aStart, uint32_t aDuration)
1043*cfb92d14SAndroid Build Coastguard Worker {
1044*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
1045*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aChannel);
1046*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aStart);
1047*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aDuration);
1048*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NOT_IMPLEMENTED;
1049*cfb92d14SAndroid Build Coastguard Worker }
1050*cfb92d14SAndroid Build Coastguard Worker
1051*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_PLATFORM_BOOTLOADER_MODE_ENABLE
otPlatResetToBootloader(otInstance * aInstance)1052*cfb92d14SAndroid Build Coastguard Worker otError otPlatResetToBootloader(otInstance *aInstance)
1053*cfb92d14SAndroid Build Coastguard Worker {
1054*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aInstance);
1055*cfb92d14SAndroid Build Coastguard Worker
1056*cfb92d14SAndroid Build Coastguard Worker return GetRadioSpinel().SendReset(SPINEL_RESET_BOOTLOADER);
1057*cfb92d14SAndroid Build Coastguard Worker }
1058*cfb92d14SAndroid Build Coastguard Worker #endif
1059*cfb92d14SAndroid Build Coastguard Worker
otSysGetRadioSpinelMetrics(void)1060*cfb92d14SAndroid Build Coastguard Worker const otRadioSpinelMetrics *otSysGetRadioSpinelMetrics(void) { return GetRadioSpinel().GetRadioSpinelMetrics(); }
1061*cfb92d14SAndroid Build Coastguard Worker
otSysGetRcpInterfaceMetrics(void)1062*cfb92d14SAndroid Build Coastguard Worker const otRcpInterfaceMetrics *otSysGetRcpInterfaceMetrics(void)
1063*cfb92d14SAndroid Build Coastguard Worker {
1064*cfb92d14SAndroid Build Coastguard Worker return sRadio.GetSpinelInterface().GetRcpInterfaceMetrics();
1065*cfb92d14SAndroid Build Coastguard Worker }
1066