Skip to content

Commit c8b17ec

Browse files
Tobias Aschenbrennergalak
authored andcommitted
fix: kw41z: Use correct mapping for dBm
The radio API expects the setting of the TX-power in dBm. The actual TX-power is however set by a 6bit register, which mapping between register value and power in dBm is a lookup-table in the datasheet. This mapping for the kw41z was off, which not only lead to incorrect output power, but also to a maximal output power of only -1.9 dBm instead of the possible +3.5 dBm. Signed-off-by: Tobias Aschenbrenner <[email protected]> Signed-off-by: Franco Saworski <[email protected]>
1 parent 14aa624 commit c8b17ec

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

drivers/ieee802154/ieee802154_kw41z.c

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ int kw41_dbg_idx;
8787
#define RADIO_0_IRQ_PRIO 0x0
8888
#define KW41Z_FCS_LENGTH 2
8989
#define KW41Z_PSDU_LENGTH 125
90-
#define KW41Z_OUTPUT_POWER_MAX 2
91-
#define KW41Z_OUTPUT_POWER_MIN (-19)
90+
#define KW41Z_OUTPUT_POWER_MAX 4
91+
#define KW41Z_OUTPUT_POWER_MIN (-31)
9292

9393
#define IEEE802154_ACK_LENGTH 5
9494

@@ -122,16 +122,28 @@ enum {
122122
};
123123

124124
/* Lookup table for PA_PWR register */
125-
static const u8_t pa_pwr_lt[22] = {
126-
2, 2, 2, 2, 2, 2, /* -19:-14 dBm */
127-
4, 4, 4, /* -13:-11 dBm */
128-
6, 6, 6, /* -10:-8 dBm */
129-
8, 8, /* -7:-6 dBm */
130-
10, 10, /* -5:-4 dBm */
131-
12, /* -3 dBm */
132-
14, 14, /* -2:-1 dBm */
133-
18, 18, /* 0:1 dBm */
134-
24 /* 2 dBm */
125+
static const u8_t pa_pwr_lt[] = {
126+
1, /* -31.1 dBm: -31 */
127+
2, 2, 2, 2, 2, 2, 2, /* -25.0 dBm: -30, -29, -28, -27, -26, -25 */
128+
4, 4, 4, 4, 4, /* -19.0 dBm: -24, -23, -22, -21, -20, -19 */
129+
6, 6, 6, /* -15.6 dBm: -18, -17, -16 */
130+
8, 8, /* -13.1 dBm: -15, -14 */
131+
10, 10, /* -11.2 dBm: -13, -12 */
132+
12, 12, /* - 9.6 dBm: -11, -10 */
133+
14, /* - 8.3 dBm: -9 */
134+
16, /* - 7.2 dBm: -8 */
135+
18, /* - 6.2 dBm: -7 */
136+
20, /* - 5.3 dBm: -6 */
137+
22, /* - 4.5 dBm: -5 */
138+
24, /* - 3.8 dBm: -4 */
139+
28, /* - 2.5 dBm: -3 */
140+
30, /* - 1.9 dBm: -2 */
141+
34, /* - 1.0 dBm: -1 */
142+
40, /* + 0.3 dBm: 0 */
143+
44, /* + 1.1 dBm: +1 */
144+
50, /* + 2.1 dBm: +2 */
145+
58, /* + 3.1 dBm: +3 */
146+
62 /* + 3.5 dBm: +4 */
135147
};
136148

137149
struct kw41z_context {
@@ -433,13 +445,21 @@ static int kw41z_filter(struct device *dev,
433445
static int kw41z_set_txpower(struct device *dev, s16_t dbm)
434446
{
435447
if (dbm < KW41Z_OUTPUT_POWER_MIN) {
436-
ZLL->PA_PWR = 0;
448+
SYS_LOG_INF("TX-power %d dBm below min of %d dBm, using %d dBm",
449+
dbm,
450+
KW41Z_OUTPUT_POWER_MIN,
451+
KW41Z_OUTPUT_POWER_MIN);
452+
dbm = KW41Z_OUTPUT_POWER_MIN;
437453
} else if (dbm > KW41Z_OUTPUT_POWER_MAX) {
438-
ZLL->PA_PWR = 30;
439-
} else {
440-
ZLL->PA_PWR = pa_pwr_lt[dbm - KW41Z_OUTPUT_POWER_MIN];
454+
SYS_LOG_INF("TX-power %d dBm above max of %d dBm, using %d dBm",
455+
dbm,
456+
KW41Z_OUTPUT_POWER_MAX,
457+
KW41Z_OUTPUT_POWER_MAX);
458+
dbm = KW41Z_OUTPUT_POWER_MAX;
441459
}
442460

461+
ZLL->PA_PWR = pa_pwr_lt[dbm - KW41Z_OUTPUT_POWER_MIN];
462+
443463
return 0;
444464
}
445465

0 commit comments

Comments
 (0)