hal_nordic/drivers/nrf_802154/serialization/src/nrf_802154_spinel_app.c

2163 lines
66 KiB
C

/*
* Copyright (c) 2020 - 2022, Nordic Semiconductor ASA
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @file nrf_802154_spinel_app.c
*
* @brief Implementation of nRF 802.15.4 Radio Driver API for application
* core talking to network core through spinel
*
* This file is responsible for providing implementation of API calls
* defined by nrf_802154.h. Application is responsible for providing
* appropriate callouts according to nRF 802.15.4 API.
*/
#include <stdint.h>
#include "nrf_802154_const.h"
#include "../spinel_base/spinel.h"
#include "nrf_802154_serialization.h"
#include "nrf_802154_spinel.h"
#include "nrf_802154_spinel_datatypes.h"
#include "nrf_802154_spinel_enc_app.h"
#include "nrf_802154_spinel_dec_app.h"
#include "nrf_802154_spinel_log.h"
#include "nrf_802154_spinel_response_notifier.h"
#include "nrf_802154_serialization_error.h"
#include "nrf_802154_serialization_error_helper.h"
#include "nrf_802154_buffer_mgr_dst.h"
#include "nrf_802154_buffer_mgr_src.h"
#include "nrf_802154.h"
#include "nrf_802154_config.h"
#include "nrf_802154_types.h"
#include "nrf_802154_nrfx_addons.h"
/**
* @brief Wait with timeout for SPINEL_STATUS_OK to be received.
*
* @param[in] timeout Timeout in us.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t status_ok_await(uint32_t timeout)
{
spinel_status_t status = SPINEL_STATUS_FAILURE;
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_last_status(p_notify_data->data,
p_notify_data->data_len,
&status);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", spinel_status_to_cstr(status), "status");
SERIALIZATION_ERROR_IF(status != SPINEL_STATUS_OK,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_INVALID,
error,
bail);
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
/**
* @brief Wait with timeout for some single bool property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_net_response Pointer to the bool variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t net_generic_bool_response_await(uint32_t timeout,
bool * p_net_response)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_generic_bool(p_notify_data->data,
p_notify_data->data_len,
p_net_response);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (*p_net_response) ? "true" : "false", "net response");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
/**
* @brief Wait with timeout for some single uint8_t property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_net_response Pointer to the uint8_t variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t net_generic_uint8_response_await(uint32_t timeout,
uint8_t * p_net_response)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_generic_uint8(p_notify_data->data,
p_notify_data->data_len,
p_net_response);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
#if NRF_802154_IFS_ENABLED
/**
* @brief Wait with timeout for some single uint16_t property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_net_response Pointer to the uint16_t variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t net_generic_uint16_response_await(uint32_t timeout,
uint16_t * p_net_response)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_generic_uint16(p_notify_data->data,
p_notify_data->data_len,
p_net_response);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
#endif
/**
* @brief Wait with timeout for TX Power property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_power Pointer to the power variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t tx_power_await(uint32_t timeout, int8_t * p_power)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(
timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_nrf_802154_tx_power_get_ret(p_notify_data->data,
p_notify_data->data_len,
p_power);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%d", *p_power, "Tx power");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
/**
* @brief Wait with timeout for capabilities property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_capabilities Pointer to the capabilities variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t capabilities_await(uint32_t timeout,
nrf_802154_capabilities_t * p_capabilities)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(
timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_nrf_802154_capabilities_get_ret(p_notify_data->data,
p_notify_data->data_len,
p_capabilities);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_capabilities, "Capabilities");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
/**
* @brief Wait with timeout for time property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_time Pointer to the time variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t time_await(uint32_t timeout,
uint64_t * p_time)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(
timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_nrf_802154_time_get_ret(p_notify_data->data,
p_notify_data->data_len,
p_time);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%llu", *p_time, "Time");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
/**
* @brief Wait with timeout for CCA configuration property to be received.
*
* @param[in] timeout Timeout in us.
* @param[out] p_cfg Pointer to the CCA configuration variable which needs to be populated.
*
* @returns zero on success or negative error value on failure.
*
*/
static nrf_802154_ser_err_t cca_cfg_await(uint32_t timeout,
nrf_802154_cca_cfg_t * p_cfg)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(
timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_nrf_802154_cca_cfg_get_ret(p_notify_data->data,
p_notify_data->data_len,
p_cfg);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
void nrf_802154_init(void)
{
nrf_802154_serialization_init();
}
bool nrf_802154_sleep(void)
{
nrf_802154_ser_err_t res;
bool sleep_remote_resp = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP);
res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP,
SPINEL_DATATYPE_NRF_802154_SLEEP,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&sleep_remote_resp);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return sleep_remote_resp;
}
nrf_802154_sleep_error_t nrf_802154_sleep_if_idle(void)
{
nrf_802154_ser_err_t res;
nrf_802154_sleep_error_t sleep_remote_resp = NRF_802154_SLEEP_ERROR_NONE;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE,
SPINEL_DATATYPE_NRF_802154_SLEEP_IF_IDLE,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&sleep_remote_resp);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return sleep_remote_resp;
}
bool nrf_802154_receive(void)
{
nrf_802154_ser_err_t res;
bool receive_remote_resp = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE);
res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE,
SPINEL_DATATYPE_NRF_802154_RECEIVE,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&receive_remote_resp);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return receive_remote_resp;
}
bool nrf_802154_receive_at(uint64_t rx_time,
uint32_t timeout,
uint8_t channel,
uint32_t id)
{
nrf_802154_ser_err_t res;
bool rx_at_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT,
SPINEL_DATATYPE_NRF_802154_RECEIVE_AT,
rx_time,
timeout,
channel,
id);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&rx_at_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return rx_at_result;
}
bool nrf_802154_receive_at_cancel(uint32_t id)
{
nrf_802154_ser_err_t res;
bool cancel_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL,
SPINEL_DATATYPE_NRF_802154_RECEIVE_AT_CANCEL,
id);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&cancel_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return cancel_result;
}
void nrf_802154_pan_id_set(const uint8_t * p_pan_id)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_pan_id, PAN_ID_SIZE);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_ID_SET,
SPINEL_DATATYPE_NRF_802154_PAN_ID_SET,
p_pan_id,
PAN_ID_SIZE);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_short_address_set(const uint8_t * p_short_address)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_short_address, SHORT_ADDRESS_SIZE);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SHORT_ADDRESS_SET,
SPINEL_DATATYPE_NRF_802154_SHORT_ADDRESS_SET,
p_short_address,
SHORT_ADDRESS_SIZE);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_extended_address_set(const uint8_t * p_extended_address)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_extended_address, EXTENDED_ADDRESS_SIZE);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_EXTENDED_ADDRESS_SET,
SPINEL_DATATYPE_NRF_802154_EXTENDED_ADDRESS_SET,
p_extended_address,
EXTENDED_ADDRESS_SIZE);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_pan_coord_set(bool enabled)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_SET,
SPINEL_DATATYPE_NRF_802154_PAN_COORD_SET,
enabled);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_promiscuous_set(bool enabled)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PROMISCUOUS_SET,
SPINEL_DATATYPE_NRF_802154_PROMISCUOUS_SET,
enabled);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
}
void nrf_802154_src_addr_matching_method_set(nrf_802154_src_addr_match_t match_method)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", match_method);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
SPINEL_DATATYPE_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
match_method);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
}
bool nrf_802154_ack_data_set(const uint8_t * p_addr,
bool extended,
const void * p_data,
uint16_t length,
nrf_802154_ack_data_t data_type)
{
nrf_802154_ser_err_t res;
bool ack_data_set_res = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET,
SPINEL_DATATYPE_NRF_802154_ACK_DATA_SET,
p_addr,
extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
p_data,
length,
data_type);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&ack_data_set_res);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return ack_data_set_res;
}
bool nrf_802154_ack_data_clear(const uint8_t * p_addr,
bool extended,
nrf_802154_ack_data_t data_type)
{
nrf_802154_ser_err_t res;
bool ack_data_clear_res = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR,
SPINEL_DATATYPE_NRF_802154_ACK_DATA_CLEAR,
p_addr,
extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
data_type);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&ack_data_clear_res);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return ack_data_clear_res;
}
void nrf_802154_auto_pending_bit_set(bool enabled)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (enabled ? "true" : "false"), "enabled");
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_AUTO_PENDING_BIT_SET,
SPINEL_DATATYPE_NRF_802154_AUTO_PENDING_BIT_SET,
enabled);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
}
bool nrf_802154_pending_bit_for_addr_set(const uint8_t * p_addr, bool extended)
{
nrf_802154_ser_err_t res;
bool addr_set_res = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
p_addr,
extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&addr_set_res);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return addr_set_res;
}
bool nrf_802154_pending_bit_for_addr_clear(const uint8_t * p_addr, bool extended)
{
nrf_802154_ser_err_t res;
bool addr_clr_res = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
p_addr,
extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&addr_clr_res);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return addr_clr_res;
}
void nrf_802154_pending_bit_for_addr_reset(bool extended)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
extended);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_channel_set(uint8_t channel)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", channel);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_SET,
SPINEL_DATATYPE_NRF_802154_CHANNEL_SET,
channel);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
uint8_t nrf_802154_channel_get(void)
{
nrf_802154_ser_err_t res;
uint8_t channel = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET,
SPINEL_DATATYPE_NRF_802154_CHANNEL_GET,
&channel);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&channel);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return channel;
}
bool nrf_802154_cca(void)
{
nrf_802154_ser_err_t res;
bool cca_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA,
SPINEL_DATATYPE_NRF_802154_CCA,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&cca_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return cca_result;
}
#if NRF_802154_CARRIER_FUNCTIONS_ENABLED
bool nrf_802154_continuous_carrier(void)
{
nrf_802154_ser_err_t res;
bool continuous_carrier_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER,
SPINEL_DATATYPE_NRF_802154_CONTINUOUS_CARRIER,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&continuous_carrier_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return continuous_carrier_result;
}
bool nrf_802154_modulated_carrier(const uint8_t * p_data)
{
nrf_802154_ser_err_t res;
bool modulated_carrier_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_data, RAW_PAYLOAD_OFFSET + p_data[0]);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER,
SPINEL_DATATYPE_NRF_802154_MODULATED_CARRIER,
p_data,
RAW_PAYLOAD_OFFSET + p_data[0]);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&modulated_carrier_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return modulated_carrier_result;
}
#endif // NRF_802154_CARRIER_FUNCTIONS_ENABLED
bool nrf_802154_energy_detection(uint32_t time_us)
{
nrf_802154_ser_err_t res;
bool ed_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION,
SPINEL_DATATYPE_NRF_802154_ENERGY_DETECTION,
time_us);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&ed_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return ed_result;
}
#if NRF_802154_CSMA_CA_ENABLED
bool nrf_802154_transmit_csma_ca_raw(uint8_t * p_data,
const nrf_802154_transmit_csma_ca_metadata_t * p_metadata)
{
nrf_802154_ser_err_t res;
uint32_t data_handle;
bool transmit_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
p_data,
&data_handle);
if (p_metadata == NULL)
{
static const nrf_802154_transmit_csma_ca_metadata_t metadata_default =
{
.frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
.tx_power = {.use_metadata_value = false}
};
p_metadata = &metadata_default;
}
SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW,
SPINEL_DATATYPE_NRF_802154_TRANSMIT_CSMA_CA_RAW,
NRF_802154_TRANSMIT_CSMA_CA_METADATA_ENCODE(*p_metadata),
NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&transmit_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
return transmit_result;
bail:
if (handle_added)
{
/* Rollback what we did until an error to avoid memory leak. */
nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
nrf_802154_spinel_src_buffer_mgr_get(),
data_handle);
}
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return transmit_result;
}
bool nrf_802154_csma_ca_min_be_set(uint8_t min_be)
{
nrf_802154_ser_err_t res;
bool result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", min_be);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_SET,
min_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return result;
}
uint8_t nrf_802154_csma_ca_min_be_get(void)
{
nrf_802154_ser_err_t res;
uint8_t min_be = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_GET,
&min_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&min_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return min_be;
}
bool nrf_802154_csma_ca_max_be_set(uint8_t max_be)
{
nrf_802154_ser_err_t res;
bool result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", max_be);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_SET,
max_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return result;
}
uint8_t nrf_802154_csma_ca_max_be_get(void)
{
nrf_802154_ser_err_t res;
uint8_t max_be = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_GET,
&max_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&max_be);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return max_be;
}
void nrf_802154_csma_ca_max_backoffs_set(uint8_t max_backoffs)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", max_backoffs);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
max_backoffs);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
uint8_t nrf_802154_csma_ca_max_backoffs_get(void)
{
nrf_802154_ser_err_t res;
uint8_t max_backoffs = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
&max_backoffs);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&max_backoffs);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return max_backoffs;
}
#endif // NRF_802154_CSMA_CA_ENABLED
#if NRF_802154_TEST_MODES_ENABLED
nrf_802154_test_mode_csmaca_backoff_t nrf_802154_test_mode_csmaca_backoff_get(void)
{
nrf_802154_ser_err_t res;
nrf_802154_test_mode_csmaca_backoff_t value = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
&value);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&value);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return value;
}
void nrf_802154_test_mode_csmaca_backoff_set(nrf_802154_test_mode_csmaca_backoff_t value)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", value);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
value);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
#endif // NRF_802154_TEST_MODES_ENABLED
bool nrf_802154_transmit_raw(uint8_t * p_data,
const nrf_802154_transmit_metadata_t * p_metadata)
{
nrf_802154_ser_err_t res;
uint32_t data_handle;
bool transmit_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
p_data,
&data_handle);
if (p_metadata == NULL)
{
static const nrf_802154_transmit_metadata_t metadata_default =
{
.frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
.cca = true,
.tx_power = {.use_metadata_value = false}
};
p_metadata = &metadata_default;
}
SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW,
SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW,
NRF_802154_TRANSMIT_METADATA_ENCODE(*p_metadata),
NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&transmit_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
return transmit_result;
bail:
if (handle_added)
{
/* Rollback what we did until an error to avoid memory leak. */
nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
nrf_802154_spinel_src_buffer_mgr_get(),
data_handle);
}
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return transmit_result;
}
bool nrf_802154_transmit_raw_at(uint8_t * p_data,
uint64_t tx_time,
const nrf_802154_transmit_at_metadata_t * p_metadata)
{
nrf_802154_ser_err_t res;
uint32_t data_handle;
bool transmit_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
p_data,
&data_handle);
if (p_metadata == NULL)
{
static const nrf_802154_transmit_at_metadata_t metadata_default =
{
.frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
.cca = true,
// channel set to 0 will be replaced on net core by the current channel from PIB
.channel = 0,
.tx_power = {.use_metadata_value = false}
};
p_metadata = &metadata_default;
}
SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT,
SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW_AT,
NRF_802154_TRANSMIT_AT_METADATA_ENCODE(*p_metadata),
tx_time,
NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&transmit_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
return transmit_result;
bail:
if (handle_added)
{
/* Rollback what we did until an error to avoid memory leak. */
nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
nrf_802154_spinel_src_buffer_mgr_get(),
data_handle);
}
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return transmit_result;
}
bool nrf_802154_transmit_at_cancel(void)
{
nrf_802154_ser_err_t res;
bool cancel_result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL,
SPINEL_DATATYPE_NRF_802154_TRANSMIT_AT_CANCEL,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&cancel_result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return cancel_result;
}
void nrf_802154_buffer_free_raw(uint8_t * p_data)
{
nrf_802154_ser_err_t res;
uint32_t data_handle;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
bool handle_found = nrf_802154_buffer_mgr_dst_search_by_local_pointer(
nrf_802154_spinel_dst_buffer_mgr_get(),
p_data,
&data_handle);
SERIALIZATION_ERROR_IF(!handle_found,
NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
error,
bail);
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_BUFFER_FREE_RAW,
SPINEL_DATATYPE_NRF_802154_BUFFER_FREE_RAW,
data_handle);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bool removed = nrf_802154_buffer_mgr_dst_remove_by_local_pointer(
nrf_802154_spinel_dst_buffer_mgr_get(),
p_data);
SERIALIZATION_ERROR_IF(!removed,
NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
error,
bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_tx_power_set(int8_t power)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_SET,
SPINEL_DATATYPE_NRF_802154_TX_POWER_SET,
power);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
int8_t nrf_802154_tx_power_get(void)
{
int32_t res;
int8_t power = 0;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET,
SPINEL_DATATYPE_NRF_802154_TX_POWER_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = tx_power_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &power);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return power;
}
nrf_802154_capabilities_t nrf_802154_capabilities_get(void)
{
int32_t res;
nrf_802154_capabilities_t caps = 0UL;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET,
SPINEL_DATATYPE_NRF_802154_CAPABILITIES_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = capabilities_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &caps);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return caps;
}
uint64_t nrf_802154_time_get(void)
{
int32_t res;
uint64_t time = 0UL;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET,
SPINEL_DATATYPE_NRF_802154_TIME_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = time_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &time);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return time;
}
void nrf_802154_cca_cfg_set(const nrf_802154_cca_cfg_t * p_cfg)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_SET,
SPINEL_DATATYPE_NRF_802154_CCA_CFG_SET,
NRF_802154_CCA_CFG_ENCODE(*p_cfg));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_cca_cfg_get(nrf_802154_cca_cfg_t * p_cfg)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET,
SPINEL_DATATYPE_NRF_802154_CCA_CFG_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = cca_cfg_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, p_cfg);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
}
int8_t nrf_802154_dbm_from_energy_level_calculate(uint8_t energy_level)
{
return nrf_802154_addons_dbm_from_energy_level_calculate(energy_level);
}
uint64_t nrf_802154_first_symbol_timestamp_get(uint64_t end_timestamp, uint8_t psdu_length)
{
uint32_t frame_symbols = PHY_SHR_SYMBOLS;
frame_symbols += (PHR_SIZE + psdu_length) * PHY_SYMBOLS_PER_OCTET;
return end_timestamp - (frame_symbols * PHY_US_PER_SYMBOL);
}
uint64_t nrf_802154_mhr_timestamp_get(uint64_t end_timestamp, uint8_t psdu_length)
{
return end_timestamp - (psdu_length * PHY_SYMBOLS_PER_OCTET * PHY_US_PER_SYMBOL);
}
void nrf_802154_security_global_frame_counter_set(uint32_t frame_counter)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
SPINEL_DATATYPE_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
frame_counter);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
nrf_802154_security_error_t nrf_802154_security_key_store(nrf_802154_key_t * p_key)
{
nrf_802154_ser_err_t res;
nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE,
SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_STORE,
NRF_802154_SECURITY_KEY_STORE_ENCODE(*p_key, AES_CCM_KEY_SIZE, KEY_ID_MODE_3_SIZE));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return err;
}
nrf_802154_security_error_t nrf_802154_security_key_remove(nrf_802154_key_id_t * p_id)
{
nrf_802154_ser_err_t res;
nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE,
SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_REMOVE,
NRF_802154_SECURITY_KEY_REMOVE_ENCODE(*p_id, KEY_ID_MODE_3_SIZE));
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return err;
}
void nrf_802154_csl_writer_period_set(uint16_t period)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_PERIOD_SET,
SPINEL_DATATYPE_NRF_802154_CSL_WRITER_PERIOD_SET,
period);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
void nrf_802154_csl_writer_anchor_time_set(uint64_t anchor_time)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
SPINEL_DATATYPE_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
anchor_time);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
static nrf_802154_ser_err_t stat_timestamps_get_ret_await(uint32_t timeout,
nrf_802154_stat_timestamps_t * p_stat_timestamps)
{
nrf_802154_ser_err_t res;
nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
SERIALIZATION_ERROR_INIT(error);
p_notify_data = nrf_802154_spinel_response_notifier_property_await(
timeout);
SERIALIZATION_ERROR_IF(p_notify_data == NULL,
NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
error,
bail);
res = nrf_802154_spinel_decode_prop_nrf_802154_stat_timestamps_get_ret(
p_notify_data->data,
p_notify_data->data_len,
p_stat_timestamps);
SERIALIZATION_ERROR_CHECK(res, error, bail);
NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
bail:
if (p_notify_data != NULL)
{
nrf_802154_spinel_response_notifier_free(p_notify_data);
}
return error;
}
void nrf_802154_stat_timestamps_get(nrf_802154_stat_timestamps_t * p_stat_timestamps)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET,
SPINEL_DATATYPE_NRF_802154_STAT_TIMESTAMPS_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = stat_timestamps_get_ret_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
p_stat_timestamps);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
}
#if NRF_802154_IFS_ENABLED
nrf_802154_ifs_mode_t nrf_802154_ifs_mode_get(void)
{
nrf_802154_ser_err_t res;
nrf_802154_ifs_mode_t mode = NRF_802154_IFS_MODE_DISABLED;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET,
SPINEL_DATATYPE_NRF_802154_IFS_MODE_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&mode);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return mode;
}
bool nrf_802154_ifs_mode_set(nrf_802154_ifs_mode_t mode)
{
nrf_802154_ser_err_t res;
bool result = false;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
NRF_802154_SPINEL_LOG_VAR("%u", mode);
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET,
SPINEL_DATATYPE_NRF_802154_IFS_MODE_SET,
mode);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&result);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return result;
}
uint16_t nrf_802154_ifs_min_sifs_period_get(void)
{
nrf_802154_ser_err_t res;
uint16_t period = 0U;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&period);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return period;
}
void nrf_802154_ifs_min_sifs_period_set(uint16_t period)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
period);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
uint16_t nrf_802154_ifs_min_lifs_period_get(void)
{
nrf_802154_ser_err_t res;
uint16_t period = 0U;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
NULL);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
&period);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return period;
}
void nrf_802154_ifs_min_lifs_period_set(uint16_t period)
{
nrf_802154_ser_err_t res;
SERIALIZATION_ERROR_INIT(error);
NRF_802154_SPINEL_LOG_BANNER_CALLING();
nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
res = nrf_802154_spinel_send_cmd_prop_value_set(
SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
period);
SERIALIZATION_ERROR_CHECK(res, error, bail);
res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
SERIALIZATION_ERROR_CHECK(res, error, bail);
bail:
SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
return;
}
#endif // NRF_802154_IFS_ENABLED