Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 5 additions & 35 deletions subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c
Original file line number Diff line number Diff line change
Expand Up @@ -311,29 +311,14 @@ void radio_phy_set(uint8_t phy, uint8_t flags)

void radio_tx_power_set(int8_t power)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF54LX)
uint32_t value;

value = hal_radio_tx_power_value(power);
NRF_RADIO->TXPOWER = value;

#elif defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
uint32_t value;

/* NOTE: TXPOWER register only accepts upto 0dBm, hence use the HAL
* floor value for the TXPOWER register. Permit +3dBm by using high
* voltage being set for radio.
*/
value = hal_radio_tx_power_floor(power);
NRF_RADIO->TXPOWER = value;
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
hal_radio_tx_power_high_voltage_set(power);

#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */

/* NOTE: valid value range is passed by Kconfig define. */
NRF_RADIO->TXPOWER = (uint32_t)power;

#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
}

void radio_tx_power_max_set(void)
Expand All @@ -346,32 +331,17 @@ void radio_tx_power_max_set(void)

int8_t radio_tx_power_min_get(void)
{
return (int8_t)hal_radio_tx_power_min_get();
return hal_radio_tx_power_min_get();
}

int8_t radio_tx_power_max_get(void)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
return RADIO_TXPOWER_TXPOWER_Pos3dBm;

#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
return (int8_t)hal_radio_tx_power_max_get();

#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
return hal_radio_tx_power_max_get();
}

int8_t radio_tx_power_floor(int8_t power)
{
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
/* NOTE: TXPOWER register only accepts upto 0dBm, +3dBm permitted by
* use of high voltage being set for radio when TXPOWER register is set.
*/
if (power >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */

return (int8_t)hal_radio_tx_power_floor(power);
return hal_radio_tx_power_floor(power);
}

void radio_freq_chan_set(uint32_t chan)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,43 +67,77 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}

static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg30dBm;
return -30; /* -30 dBm */
}

static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_max_get(void)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
return 4; /* +4 dBm */
}

static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
if (tx_power_lvl >= 4) {
return 4;
}

if (tx_power_lvl >= 0) {
return 0;
}

if (tx_power_lvl >= -4) {
return -4;
}

if (tx_power_lvl >= -8) {
return -8;
}

if (tx_power_lvl >= -12) {
return -12;
}

if (tx_power_lvl >= -16) {
return -16;
}

if (tx_power_lvl >= -20) {
return -20;
}

/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}

static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,51 +255,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}

static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}

static inline int8_t hal_radio_tx_power_max_get(void)
{
return 4; /* +4 dBm */
}

static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}

if (tx_power_lvl >= 3) {
return 3;
}

if (tx_power_lvl >= 0) {
return 0;
}

if (tx_power_lvl >= -4) {
return -4;
}

if (tx_power_lvl >= -8) {
return -8;
}

if (tx_power_lvl >= -12) {
return -12;
}

if (tx_power_lvl >= -16) {
return -16;
}

if (tx_power_lvl >= -20) {
return -20;
}

/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}

static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}

/* Note: The -30 dBm power level is deprecated so ignore it! */
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -274,51 +274,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
return mode;
}

static inline uint32_t hal_radio_tx_power_min_get(void)
static inline int8_t hal_radio_tx_power_min_get(void)
{
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
return -40; /* -40 dBm */
}

static inline int8_t hal_radio_tx_power_max_get(void)
{
return 4; /* +4 dBm */
}

static inline uint32_t hal_radio_tx_power_max_get(void)
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
{
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
if (tx_power_lvl >= 4) {
return 4;
}

if (tx_power_lvl >= 3) {
return 3;
}

if (tx_power_lvl >= 0) {
return 0;
}

if (tx_power_lvl >= -4) {
return -4;
}

if (tx_power_lvl >= -8) {
return -8;
}

if (tx_power_lvl >= -12) {
return -12;
}

if (tx_power_lvl >= -16) {
return -16;
}

if (tx_power_lvl >= -20) {
return -20;
}

/* Note: The -30 dBm power level is deprecated so ignore it! */
return -40;
}

static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
{
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
if (tx_power_lvl >= 4) {
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
if (tx_power_lvl >= 3) {
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
if (tx_power_lvl >= 0) {
return RADIO_TXPOWER_TXPOWER_0dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
if (tx_power_lvl >= -4) {
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
if (tx_power_lvl >= -8) {
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
if (tx_power_lvl >= -12) {
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
if (tx_power_lvl >= -16) {
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
}

if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
if (tx_power_lvl >= -20) {
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
}

/* Note: The -30 dBm power level is deprecated so ignore it! */
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
}

Expand Down
Loading
Loading