diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c index 7056f020bc286..c212178043777 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c @@ -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) @@ -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) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf51.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf51.h index faad07f4cbc80..fb81bffda18e5 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf51.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf51.h @@ -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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52805.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52805.h index ee96c07a5fc3c..d511b3520a726 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52805.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52805.h @@ -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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52810.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52810.h index 7b22249ec928c..7ad1c51c9216e 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52810.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52810.h @@ -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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52811.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52811.h index 5caa59470b633..ddd02139f6a50 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52811.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52811.h @@ -444,51 +444,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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52820.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52820.h index ab15f62f68578..a74813973ac0a 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52820.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52820.h @@ -433,71 +433,128 @@ 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 8; /* +8 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_Pos8dBm; + if (tx_power_lvl >= 8) { + return 8; + } + + if (tx_power_lvl >= 7) { + return 7; + } + + if (tx_power_lvl >= 6) { + return 6; + } + + if (tx_power_lvl >= 5) { + return 5; + } + + if (tx_power_lvl >= 4) { + return 4; + } + + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 2) { + return 2; + } + + 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_Pos8dBm) { + if (tx_power_lvl >= 8) { return RADIO_TXPOWER_TXPOWER_Pos8dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) { + if (tx_power_lvl >= 7) { return RADIO_TXPOWER_TXPOWER_Pos7dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) { + if (tx_power_lvl >= 6) { return RADIO_TXPOWER_TXPOWER_Pos6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) { + if (tx_power_lvl >= 5) { return RADIO_TXPOWER_TXPOWER_Pos5dBm; } - 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_Pos2dBm) { + if (tx_power_lvl >= 2) { return RADIO_TXPOWER_TXPOWER_Pos2dBm; } - 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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52832.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52832.h index 10e942cca1e98..a72244859f4bd 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52832.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52832.h @@ -272,51 +272,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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52833.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52833.h index e8c55fc89524c..ab874e5770a71 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52833.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52833.h @@ -443,71 +443,128 @@ 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 8; /* +8 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_Pos8dBm; + if (tx_power_lvl >= 8) { + return 8; + } + + if (tx_power_lvl >= 7) { + return 7; + } + + if (tx_power_lvl >= 6) { + return 6; + } + + if (tx_power_lvl >= 5) { + return 5; + } + + if (tx_power_lvl >= 4) { + return 4; + } + + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 2) { + return 2; + } + + 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_Pos8dBm) { + if (tx_power_lvl >= 8) { return RADIO_TXPOWER_TXPOWER_Pos8dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) { + if (tx_power_lvl >= 7) { return RADIO_TXPOWER_TXPOWER_Pos7dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) { + if (tx_power_lvl >= 6) { return RADIO_TXPOWER_TXPOWER_Pos6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) { + if (tx_power_lvl >= 5) { return RADIO_TXPOWER_TXPOWER_Pos5dBm; } - 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_Pos2dBm) { + if (tx_power_lvl >= 2) { return RADIO_TXPOWER_TXPOWER_Pos2dBm; } - 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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52840.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52840.h index 80ab0f9e2410b..e11fad76b398a 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52840.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52840.h @@ -457,71 +457,128 @@ 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 8; /* +8 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_Pos8dBm; + if (tx_power_lvl >= 8) { + return 8; + } + + if (tx_power_lvl >= 7) { + return 7; + } + + if (tx_power_lvl >= 6) { + return 6; + } + + if (tx_power_lvl >= 5) { + return 5; + } + + if (tx_power_lvl >= 4) { + return 4; + } + + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 2) { + return 2; + } + + 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_Pos8dBm) { + if (tx_power_lvl >= 8) { return RADIO_TXPOWER_TXPOWER_Pos8dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) { + if (tx_power_lvl >= 7) { return RADIO_TXPOWER_TXPOWER_Pos7dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) { + if (tx_power_lvl >= 6) { return RADIO_TXPOWER_TXPOWER_Pos6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) { + if (tx_power_lvl >= 5) { return RADIO_TXPOWER_TXPOWER_Pos5dBm; } - 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_Pos2dBm) { + if (tx_power_lvl >= 2) { return RADIO_TXPOWER_TXPOWER_Pos2dBm; } - 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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5340.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5340.h index a9638b62634ce..72bc10f5370da 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5340.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5340.h @@ -357,13 +357,6 @@ #endif /* !CONFIG_BT_CTLR_TIFS_HW */ #endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */ -/* nRF5340 supports +3dBm Tx Power using high voltage request, define +3dBm - * value for Controller use. - */ -#ifndef RADIO_TXPOWER_TXPOWER_Pos3dBm -#define RADIO_TXPOWER_TXPOWER_Pos3dBm (0x03UL) -#endif - /* HAL abstraction of Radio bitfields */ #define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END #define HAL_RADIO_EVENTS_END EVENTS_END @@ -452,73 +445,130 @@ 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_max_get(void) +static inline int8_t hal_radio_tx_power_max_get(void) { - return RADIO_TXPOWER_TXPOWER_0dBm; + return 3; /* 3 dBm */ } -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_floor(int8_t tx_power_lvl) +{ + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 0) { + return 0; + } + + if (tx_power_lvl >= -1) { + return -1; + } + + if (tx_power_lvl >= -2) { + return -2; + } + + if (tx_power_lvl >= -3) { + return -3; + } + + if (tx_power_lvl >= -4) { + return -4; + } + + if (tx_power_lvl >= -5) { + return -5; + } + + if (tx_power_lvl >= -6) { + return -6; + } + + if (tx_power_lvl >= -7) { + return -7; + } + + 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_0dBm) { + if (tx_power_lvl >= 0) { return RADIO_TXPOWER_TXPOWER_0dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) { + if (tx_power_lvl >= -1) { return RADIO_TXPOWER_TXPOWER_Neg1dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) { + if (tx_power_lvl >= -2) { return RADIO_TXPOWER_TXPOWER_Neg2dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg3dBm) { + if (tx_power_lvl >= -3) { return RADIO_TXPOWER_TXPOWER_Neg3dBm; } - 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_Neg5dBm) { + if (tx_power_lvl >= -5) { return RADIO_TXPOWER_TXPOWER_Neg5dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg6dBm) { + if (tx_power_lvl >= -6) { return RADIO_TXPOWER_TXPOWER_Neg6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg7dBm) { + if (tx_power_lvl >= -7) { return RADIO_TXPOWER_TXPOWER_Neg7dBm; } - 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; } static inline void hal_radio_tx_power_high_voltage_set(int8_t tx_power_lvl) { - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) { + if (tx_power_lvl >= 3) { nrf_vreqctrl_radio_high_voltage_set(NRF_VREQCTRL, true); } } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_txp.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_txp.h index c3bb09fd1b3b3..e916b81a06d56 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_txp.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf5_txp.h @@ -5,63 +5,63 @@ */ #if defined(CONFIG_BT_CTLR_TX_PWR_PLUS_10) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos10dBm +#define RADIO_TXP_DEFAULT (+10) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_9) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos9dBm +#define RADIO_TXP_DEFAULT (+9) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_8) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos8dBm +#define RADIO_TXP_DEFAULT (+8) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_7) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos7dBm +#define RADIO_TXP_DEFAULT (+7) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_6) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos6dBm +#define RADIO_TXP_DEFAULT (+6) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_5) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos5dBm +#define RADIO_TXP_DEFAULT (+5) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_4) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos4dBm +#define RADIO_TXP_DEFAULT (+4) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_3) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos3dBm +#define RADIO_TXP_DEFAULT (+3) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_2) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos2dBm +#define RADIO_TXP_DEFAULT (+2) #elif defined(CONFIG_BT_CTLR_TX_PWR_PLUS_1) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Pos1dBm +#define RADIO_TXP_DEFAULT (+1) #elif defined(CONFIG_BT_CTLR_TX_PWR_0) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_0dBm +#define RADIO_TXP_DEFAULT (0) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_1) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg1dBm +#define RADIO_TXP_DEFAULT (-1) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_2) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg2dBm +#define RADIO_TXP_DEFAULT (-2) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_3) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg3dBm +#define RADIO_TXP_DEFAULT (-3) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_4) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg4dBm +#define RADIO_TXP_DEFAULT (-4) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_5) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg5dBm +#define RADIO_TXP_DEFAULT (-5) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_6) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg6dBm +#define RADIO_TXP_DEFAULT (-6) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_7) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg7dBm +#define RADIO_TXP_DEFAULT (-7) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_8) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg8dBm +#define RADIO_TXP_DEFAULT (-8) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_9) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg9dBm +#define RADIO_TXP_DEFAULT (-9) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_10) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg10dBm +#define RADIO_TXP_DEFAULT (-10) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_12) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg12dBm +#define RADIO_TXP_DEFAULT (-12) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_14) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg14dBm +#define RADIO_TXP_DEFAULT (-14) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_16) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg16dBm +#define RADIO_TXP_DEFAULT (-16) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_20) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg20dBm +#define RADIO_TXP_DEFAULT (-20) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_26) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg26dBm +#define RADIO_TXP_DEFAULT (-26) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_30) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg30dBm +#define RADIO_TXP_DEFAULT (-30) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_40) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg40dBm +#define RADIO_TXP_DEFAULT (-40) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_46) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg46dBm +#define RADIO_TXP_DEFAULT (-46) #elif defined(CONFIG_BT_CTLR_TX_PWR_MINUS_70) -#define RADIO_TXP_DEFAULT RADIO_TXPOWER_TXPOWER_Neg70dBm +#define RADIO_TXP_DEFAULT (-70) #endif diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf52.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf52.h index 099f073f30c3b..71aac5a6183b6 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf52.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf52.h @@ -408,71 +408,128 @@ 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 8; /* +8 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_Pos8dBm; + if (tx_power_lvl >= 8) { + return 8; + } + + if (tx_power_lvl >= 7) { + return 7; + } + + if (tx_power_lvl >= 6) { + return 6; + } + + if (tx_power_lvl >= 5) { + return 5; + } + + if (tx_power_lvl >= 4) { + return 4; + } + + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 2) { + return 2; + } + + 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_Pos8dBm) { + if (tx_power_lvl >= 8) { return RADIO_TXPOWER_TXPOWER_Pos8dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos7dBm) { + if (tx_power_lvl >= 7) { return RADIO_TXPOWER_TXPOWER_Pos7dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos6dBm) { + if (tx_power_lvl >= 6) { return RADIO_TXPOWER_TXPOWER_Pos6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos5dBm) { + if (tx_power_lvl >= 5) { return RADIO_TXPOWER_TXPOWER_Pos5dBm; } - 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_Pos2dBm) { + if (tx_power_lvl >= 2) { return RADIO_TXPOWER_TXPOWER_Pos2dBm; } - 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; } diff --git a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf5340.h b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf5340.h index ff31a6693cfe3..725cf1789e873 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf5340.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_sim_nrf5340.h @@ -355,13 +355,6 @@ #endif /* !CONFIG_BT_CTLR_TIFS_HW */ #endif /* !CONFIG_BT_CTLR_RADIO_ENABLE_FAST */ -/* nRF5340 supports +3dBm Tx Power using high voltage request, define +3dBm - * value for Controller use. - */ -#ifndef RADIO_TXPOWER_TXPOWER_Pos3dBm -#define RADIO_TXPOWER_TXPOWER_Pos3dBm (0x03UL) -#endif - /* HAL abstraction of Radio bitfields */ #define HAL_NRF_RADIO_EVENT_END NRF_RADIO_EVENT_END #define HAL_RADIO_EVENTS_END EVENTS_END @@ -432,73 +425,130 @@ 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_max_get(void) +static inline int8_t hal_radio_tx_power_max_get(void) { - return RADIO_TXPOWER_TXPOWER_0dBm; + return 3; /* 3 dBm */ } -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_floor(int8_t tx_power_lvl) +{ + if (tx_power_lvl >= 3) { + return 3; + } + + if (tx_power_lvl >= 0) { + return 0; + } + + if (tx_power_lvl >= -1) { + return -1; + } + + if (tx_power_lvl >= -2) { + return -2; + } + + if (tx_power_lvl >= -3) { + return -3; + } + + if (tx_power_lvl >= -4) { + return -4; + } + + if (tx_power_lvl >= -5) { + return -5; + } + + if (tx_power_lvl >= -6) { + return -6; + } + + if (tx_power_lvl >= -7) { + return -7; + } + + 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_0dBm) { + if (tx_power_lvl >= 0) { return RADIO_TXPOWER_TXPOWER_0dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg1dBm) { + if (tx_power_lvl >= -1) { return RADIO_TXPOWER_TXPOWER_Neg1dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg2dBm) { + if (tx_power_lvl >= -2) { return RADIO_TXPOWER_TXPOWER_Neg2dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg3dBm) { + if (tx_power_lvl >= -3) { return RADIO_TXPOWER_TXPOWER_Neg3dBm; } - 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_Neg5dBm) { + if (tx_power_lvl >= -5) { return RADIO_TXPOWER_TXPOWER_Neg5dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg6dBm) { + if (tx_power_lvl >= -6) { return RADIO_TXPOWER_TXPOWER_Neg6dBm; } - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg7dBm) { + if (tx_power_lvl >= -7) { return RADIO_TXPOWER_TXPOWER_Neg7dBm; } - 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; } static inline void hal_radio_tx_power_high_voltage_set(int8_t tx_power_lvl) { - if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) { + if (tx_power_lvl >= 3) { nrf_vreqctrl_radio_high_voltage_set(NRF_VREQCTRL, true); } }