Skip to content

Commit cf88017

Browse files
cvinayakjhedberg
authored andcommitted
Bluetooth: Controller: nRF54Lx: Fix Radio Tx Power set
Fix incorrectly high Radio Tx Power being set as default. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]> (cherry picked from commit 2ab4138)
1 parent ab0251d commit cf88017

File tree

13 files changed

+741
-261
lines changed

13 files changed

+741
-261
lines changed

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio.c

Lines changed: 5 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -311,29 +311,14 @@ void radio_phy_set(uint8_t phy, uint8_t flags)
311311

312312
void radio_tx_power_set(int8_t power)
313313
{
314-
#if defined(CONFIG_SOC_COMPATIBLE_NRF54LX)
315314
uint32_t value;
316315

317316
value = hal_radio_tx_power_value(power);
318317
NRF_RADIO->TXPOWER = value;
319318

320-
#elif defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
321-
uint32_t value;
322-
323-
/* NOTE: TXPOWER register only accepts upto 0dBm, hence use the HAL
324-
* floor value for the TXPOWER register. Permit +3dBm by using high
325-
* voltage being set for radio.
326-
*/
327-
value = hal_radio_tx_power_floor(power);
328-
NRF_RADIO->TXPOWER = value;
319+
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
329320
hal_radio_tx_power_high_voltage_set(power);
330-
331-
#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */
332-
333-
/* NOTE: valid value range is passed by Kconfig define. */
334-
NRF_RADIO->TXPOWER = (uint32_t)power;
335-
336-
#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET && !CONFIG_SOC_COMPATIBLE_NRF54LX */
321+
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
337322
}
338323

339324
void radio_tx_power_max_set(void)
@@ -346,32 +331,17 @@ void radio_tx_power_max_set(void)
346331

347332
int8_t radio_tx_power_min_get(void)
348333
{
349-
return (int8_t)hal_radio_tx_power_min_get();
334+
return hal_radio_tx_power_min_get();
350335
}
351336

352337
int8_t radio_tx_power_max_get(void)
353338
{
354-
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
355-
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
356-
357-
#else /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
358-
return (int8_t)hal_radio_tx_power_max_get();
359-
360-
#endif /* !CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
339+
return hal_radio_tx_power_max_get();
361340
}
362341

363342
int8_t radio_tx_power_floor(int8_t power)
364343
{
365-
#if defined(CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET)
366-
/* NOTE: TXPOWER register only accepts upto 0dBm, +3dBm permitted by
367-
* use of high voltage being set for radio when TXPOWER register is set.
368-
*/
369-
if (power >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
370-
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
371-
}
372-
#endif /* CONFIG_SOC_COMPATIBLE_NRF5340_CPUNET */
373-
374-
return (int8_t)hal_radio_tx_power_floor(power);
344+
return hal_radio_tx_power_floor(power);
375345
}
376346

377347
void radio_freq_chan_set(uint32_t chan)

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf51.h

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -67,43 +67,77 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
6767
return mode;
6868
}
6969

70-
static inline uint32_t hal_radio_tx_power_min_get(void)
70+
static inline int8_t hal_radio_tx_power_min_get(void)
7171
{
72-
return RADIO_TXPOWER_TXPOWER_Neg30dBm;
72+
return -30; /* -30 dBm */
7373
}
7474

75-
static inline uint32_t hal_radio_tx_power_max_get(void)
75+
static inline int8_t hal_radio_tx_power_max_get(void)
7676
{
77-
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
77+
return 4; /* +4 dBm */
7878
}
7979

80-
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
80+
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
8181
{
82-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
82+
if (tx_power_lvl >= 4) {
83+
return 4;
84+
}
85+
86+
if (tx_power_lvl >= 0) {
87+
return 0;
88+
}
89+
90+
if (tx_power_lvl >= -4) {
91+
return -4;
92+
}
93+
94+
if (tx_power_lvl >= -8) {
95+
return -8;
96+
}
97+
98+
if (tx_power_lvl >= -12) {
99+
return -12;
100+
}
101+
102+
if (tx_power_lvl >= -16) {
103+
return -16;
104+
}
105+
106+
if (tx_power_lvl >= -20) {
107+
return -20;
108+
}
109+
110+
/* Note: The -30 dBm power level is deprecated so ignore it! */
111+
return -40;
112+
}
113+
114+
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
115+
{
116+
if (tx_power_lvl >= 4) {
83117
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
84118
}
85119

86-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
120+
if (tx_power_lvl >= 0) {
87121
return RADIO_TXPOWER_TXPOWER_0dBm;
88122
}
89123

90-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
124+
if (tx_power_lvl >= -4) {
91125
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
92126
}
93127

94-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
128+
if (tx_power_lvl >= -8) {
95129
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
96130
}
97131

98-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
132+
if (tx_power_lvl >= -12) {
99133
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
100134
}
101135

102-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
136+
if (tx_power_lvl >= -16) {
103137
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
104138
}
105139

106-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
140+
if (tx_power_lvl >= -20) {
107141
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
108142
}
109143

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52805.h

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -255,51 +255,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
255255
return mode;
256256
}
257257

258-
static inline uint32_t hal_radio_tx_power_min_get(void)
258+
static inline int8_t hal_radio_tx_power_min_get(void)
259259
{
260-
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
260+
return -40; /* -40 dBm */
261+
}
262+
263+
static inline int8_t hal_radio_tx_power_max_get(void)
264+
{
265+
return 4; /* +4 dBm */
261266
}
262267

263-
static inline uint32_t hal_radio_tx_power_max_get(void)
268+
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
264269
{
265-
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
270+
if (tx_power_lvl >= 4) {
271+
return 4;
272+
}
273+
274+
if (tx_power_lvl >= 3) {
275+
return 3;
276+
}
277+
278+
if (tx_power_lvl >= 0) {
279+
return 0;
280+
}
281+
282+
if (tx_power_lvl >= -4) {
283+
return -4;
284+
}
285+
286+
if (tx_power_lvl >= -8) {
287+
return -8;
288+
}
289+
290+
if (tx_power_lvl >= -12) {
291+
return -12;
292+
}
293+
294+
if (tx_power_lvl >= -16) {
295+
return -16;
296+
}
297+
298+
if (tx_power_lvl >= -20) {
299+
return -20;
300+
}
301+
302+
/* Note: The -30 dBm power level is deprecated so ignore it! */
303+
return -40;
266304
}
267305

268-
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
306+
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
269307
{
270-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
308+
if (tx_power_lvl >= 4) {
271309
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
272310
}
273311

274-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
312+
if (tx_power_lvl >= 3) {
275313
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
276314
}
277315

278-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
316+
if (tx_power_lvl >= 0) {
279317
return RADIO_TXPOWER_TXPOWER_0dBm;
280318
}
281319

282-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
320+
if (tx_power_lvl >= -4) {
283321
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
284322
}
285323

286-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
324+
if (tx_power_lvl >= -8) {
287325
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
288326
}
289327

290-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
328+
if (tx_power_lvl >= -12) {
291329
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
292330
}
293331

294-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
332+
if (tx_power_lvl >= -16) {
295333
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
296334
}
297335

298-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
336+
if (tx_power_lvl >= -20) {
299337
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
300338
}
301339

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

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/radio/radio_nrf52810.h

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -274,51 +274,88 @@ static inline uint32_t hal_radio_phy_mode_get(uint8_t phy, uint8_t flags)
274274
return mode;
275275
}
276276

277-
static inline uint32_t hal_radio_tx_power_min_get(void)
277+
static inline int8_t hal_radio_tx_power_min_get(void)
278278
{
279-
return RADIO_TXPOWER_TXPOWER_Neg40dBm;
279+
return -40; /* -40 dBm */
280+
}
281+
282+
static inline int8_t hal_radio_tx_power_max_get(void)
283+
{
284+
return 4; /* +4 dBm */
280285
}
281286

282-
static inline uint32_t hal_radio_tx_power_max_get(void)
287+
static inline int8_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
283288
{
284-
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
289+
if (tx_power_lvl >= 4) {
290+
return 4;
291+
}
292+
293+
if (tx_power_lvl >= 3) {
294+
return 3;
295+
}
296+
297+
if (tx_power_lvl >= 0) {
298+
return 0;
299+
}
300+
301+
if (tx_power_lvl >= -4) {
302+
return -4;
303+
}
304+
305+
if (tx_power_lvl >= -8) {
306+
return -8;
307+
}
308+
309+
if (tx_power_lvl >= -12) {
310+
return -12;
311+
}
312+
313+
if (tx_power_lvl >= -16) {
314+
return -16;
315+
}
316+
317+
if (tx_power_lvl >= -20) {
318+
return -20;
319+
}
320+
321+
/* Note: The -30 dBm power level is deprecated so ignore it! */
322+
return -40;
285323
}
286324

287-
static inline uint32_t hal_radio_tx_power_floor(int8_t tx_power_lvl)
325+
static inline uint32_t hal_radio_tx_power_value(int8_t tx_power_lvl)
288326
{
289-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos4dBm) {
327+
if (tx_power_lvl >= 4) {
290328
return RADIO_TXPOWER_TXPOWER_Pos4dBm;
291329
}
292330

293-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Pos3dBm) {
331+
if (tx_power_lvl >= 3) {
294332
return RADIO_TXPOWER_TXPOWER_Pos3dBm;
295333
}
296334

297-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_0dBm) {
335+
if (tx_power_lvl >= 0) {
298336
return RADIO_TXPOWER_TXPOWER_0dBm;
299337
}
300338

301-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg4dBm) {
339+
if (tx_power_lvl >= -4) {
302340
return RADIO_TXPOWER_TXPOWER_Neg4dBm;
303341
}
304342

305-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg8dBm) {
343+
if (tx_power_lvl >= -8) {
306344
return RADIO_TXPOWER_TXPOWER_Neg8dBm;
307345
}
308346

309-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg12dBm) {
347+
if (tx_power_lvl >= -12) {
310348
return RADIO_TXPOWER_TXPOWER_Neg12dBm;
311349
}
312350

313-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg16dBm) {
351+
if (tx_power_lvl >= -16) {
314352
return RADIO_TXPOWER_TXPOWER_Neg16dBm;
315353
}
316354

317-
if (tx_power_lvl >= (int8_t)RADIO_TXPOWER_TXPOWER_Neg20dBm) {
355+
if (tx_power_lvl >= -20) {
318356
return RADIO_TXPOWER_TXPOWER_Neg20dBm;
319357
}
320358

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

0 commit comments

Comments
 (0)