xref: /aosp_15_r20/external/openthread/src/posix/platform/radio.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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