2020-10-23 12:14:24 +02:00
|
|
|
/*
|
2022-02-23 17:13:55 +01:00
|
|
|
* Copyright (c) 2020 - 2022, Nordic Semiconductor ASA
|
2020-10-23 12:14:24 +02:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
2021-01-25 15:05:07 +01:00
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
*
|
2021-01-04 12:26:47 +01:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
2020-10-23 12:14:24 +02:00
|
|
|
*
|
2021-01-25 15:05:07 +01:00
|
|
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
|
|
|
* list of conditions and the following disclaimer.
|
2020-10-23 12:14:24 +02:00
|
|
|
*
|
2021-01-25 15:05:07 +01:00
|
|
|
* 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.
|
2020-10-23 12:14:24 +02:00
|
|
|
*
|
2021-01-25 15:05:07 +01:00
|
|
|
* 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.
|
2020-10-23 12:14:24 +02:00
|
|
|
*
|
2021-01-04 12:26:47 +01:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
2021-01-25 15:05:07 +01:00
|
|
|
* 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.
|
2020-10-23 12:14:24 +02:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
#include <nrf.h>
|
|
|
|
#include "nrf_errno.h"
|
2021-07-12 15:58:52 +02:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdint.h>
|
2020-10-23 12:14:24 +02:00
|
|
|
|
2022-06-02 15:38:51 +02:00
|
|
|
#include "nrf_802154_fal.h"
|
2022-06-30 09:49:04 +02:00
|
|
|
#include "nrf_802154_types.h"
|
2022-06-02 15:38:51 +02:00
|
|
|
|
2021-12-21 18:11:29 +01:00
|
|
|
#include "protocol/mpsl_fem_protocol_api.h"
|
2020-10-23 12:14:24 +02:00
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2022-06-30 09:49:04 +02:00
|
|
|
/**@brief Macro to get the number of elements in an array.
|
|
|
|
*
|
|
|
|
* @param[in] X Array.
|
|
|
|
*/
|
|
|
|
#define NUMELTS(X) (sizeof((X)) / sizeof(X[0]))
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Converts TX power integer values to RADIO TX power allowed values.
|
|
|
|
*
|
|
|
|
* @param[in] integer_tx_power TX power integer value.
|
|
|
|
*
|
|
|
|
* @retval RADIO TX power allowed value.
|
|
|
|
*/
|
|
|
|
static nrf_radio_txpower_t to_radio_tx_power_convert(int8_t integer_tx_power)
|
|
|
|
{
|
|
|
|
static const nrf_radio_txpower_t allowed_values[] =
|
|
|
|
{
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Neg40dBm)
|
|
|
|
NRF_RADIO_TXPOWER_NEG40DBM, /**< -40 dBm. */
|
|
|
|
#endif
|
|
|
|
NRF_RADIO_TXPOWER_NEG20DBM, /**< -20 dBm. */
|
|
|
|
NRF_RADIO_TXPOWER_NEG16DBM, /**< -16 dBm. */
|
|
|
|
NRF_RADIO_TXPOWER_NEG12DBM, /**< -12 dBm. */
|
|
|
|
NRF_RADIO_TXPOWER_NEG8DBM, /**< -8 dBm. */
|
|
|
|
NRF_RADIO_TXPOWER_NEG4DBM, /**< -4 dBm. */
|
|
|
|
NRF_RADIO_TXPOWER_0DBM, /**< 0 dBm. */
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos2dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS2DBM, /**< 2 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos3dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS3DBM, /**< 3 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos4dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS4DBM, /**< 4 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos5dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS5DBM, /**< 5 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos6dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS6DBM, /**< 6 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos7dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS7DBM, /**< 7 dBm. */
|
|
|
|
#endif
|
|
|
|
#if defined(RADIO_TXPOWER_TXPOWER_Pos8dBm)
|
|
|
|
NRF_RADIO_TXPOWER_POS8DBM, /**< 8 dBm. */
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
for (uint32_t i = NUMELTS(allowed_values) - 1; i > 0; i--)
|
|
|
|
{
|
|
|
|
if (integer_tx_power >= (int8_t)allowed_values[i])
|
|
|
|
{
|
|
|
|
return allowed_values[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return allowed_values[0];
|
|
|
|
}
|
|
|
|
|
2021-12-21 18:11:29 +01:00
|
|
|
int32_t mpsl_fem_disable(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_pa_configuration_set(const mpsl_fem_event_t * const p_activate_event,
|
|
|
|
const mpsl_fem_event_t * const p_deactivate_event)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
(void)p_activate_event;
|
|
|
|
(void)p_deactivate_event;
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_pa_configuration_clear(void)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_lna_configuration_set(const mpsl_fem_event_t * const p_activate_event,
|
|
|
|
const mpsl_fem_event_t * const p_deactivate_event)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
(void)p_activate_event;
|
|
|
|
(void)p_deactivate_event;
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_lna_configuration_clear(void)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
void mpsl_fem_deactivate_now(mpsl_fem_functionality_t type)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
(void)type;
|
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_abort_set(uint32_t event, uint32_t group)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-08 11:55:41 +01:00
|
|
|
int32_t mpsl_fem_abort_extend(uint32_t channel_to_add, uint32_t group)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
(void)channel_to_add;
|
|
|
|
(void)group;
|
|
|
|
return 0;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-08 11:55:41 +01:00
|
|
|
int32_t mpsl_fem_abort_reduce(uint32_t channel_to_remove, uint32_t group)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
(void)channel_to_remove;
|
|
|
|
(void)group;
|
|
|
|
return 0;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
int32_t mpsl_fem_abort_clear(void)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
2020-12-07 13:47:13 +01:00
|
|
|
return -NRF_EPERM;
|
2020-10-23 12:14:24 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
void mpsl_fem_cleanup(void)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
// Intentionally empty
|
|
|
|
}
|
|
|
|
|
2022-06-30 09:49:04 +02:00
|
|
|
void mpsl_fem_tx_power_split(const mpsl_tx_power_t power,
|
|
|
|
mpsl_tx_power_split_t * const p_tx_power_split)
|
2022-06-02 15:38:51 +02:00
|
|
|
{
|
2022-11-14 09:12:04 +01:00
|
|
|
p_tx_power_split->radio_tx_power = to_radio_tx_power_convert(power);
|
|
|
|
p_tx_power_split->fem.gain_db = 0;
|
|
|
|
p_tx_power_split->fem.private_setting = 0;
|
2022-06-02 15:38:51 +02:00
|
|
|
}
|
|
|
|
|
2022-11-14 09:12:04 +01:00
|
|
|
int32_t mpsl_fem_pa_gain_set(const mpsl_fem_gain_t * p_gain)
|
2022-06-02 15:38:51 +02:00
|
|
|
{
|
2022-11-14 09:12:04 +01:00
|
|
|
(void)p_gain;
|
2022-06-02 15:38:51 +02:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-12-07 13:47:13 +01:00
|
|
|
void mpsl_fem_pa_is_configured(int8_t * const p_gain)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
(void)p_gain;
|
|
|
|
}
|
|
|
|
|
2021-01-04 12:26:47 +01:00
|
|
|
bool mpsl_fem_prepare_powerdown(NRF_TIMER_Type * p_instance,
|
|
|
|
uint32_t compare_channel,
|
|
|
|
uint32_t ppi_id,
|
|
|
|
uint32_t event_addr)
|
2020-10-23 12:14:24 +02:00
|
|
|
{
|
|
|
|
(void)p_instance;
|
|
|
|
(void)compare_channel;
|
|
|
|
(void)ppi_id;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2021-07-12 15:58:52 +02:00
|
|
|
bool mpsl_fem_device_config_254_apply_get(void)
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2022-11-14 09:12:04 +01:00
|
|
|
int8_t nrf_802154_fal_tx_power_split(const uint8_t channel,
|
|
|
|
const int8_t power,
|
|
|
|
nrf_802154_fal_tx_power_split_t * const p_tx_power_split)
|
2022-06-02 15:38:51 +02:00
|
|
|
{
|
|
|
|
(void)channel;
|
|
|
|
|
2022-11-14 09:12:04 +01:00
|
|
|
p_tx_power_split->radio_tx_power = to_radio_tx_power_convert(power);
|
|
|
|
p_tx_power_split->fem.gain_db = 0;
|
|
|
|
p_tx_power_split->fem.private_setting = 0;
|
2022-06-02 15:38:51 +02:00
|
|
|
|
2022-11-14 09:12:04 +01:00
|
|
|
return p_tx_power_split->radio_tx_power;
|
2022-06-02 15:38:51 +02:00
|
|
|
}
|
|
|
|
|
2020-10-23 12:14:24 +02:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|