diff --git a/cpu/cc2538/radio/cc2538_rf_radio_ops.c b/cpu/cc2538/radio/cc2538_rf_radio_ops.c index 0ca37c48f9..85546fc5e8 100644 --- a/cpu/cc2538/radio/cc2538_rf_radio_ops.c +++ b/cpu/cc2538/radio/cc2538_rf_radio_ops.c @@ -185,10 +185,15 @@ static int _read(ieee802154_dev_t *dev, void *buf, size_t size, ieee802154_rx_in /* The number of dB above maximum sensitivity detected for the * received packet */ - info->rssi = -CC2538_RSSI_OFFSET + rssi_val + IEEE802154_RADIO_RSSI_OFFSET; + /* Make sure there is no overflow even if no signal with such + low sensitivity should be detected */ + const int hw_rssi_min = IEEE802154_RADIO_RSSI_OFFSET - + CC2538_RSSI_OFFSET; + int8_t hw_rssi = rssi_val > hw_rssi_min ? + (CC2538_RSSI_OFFSET + rssi_val) : IEEE802154_RADIO_RSSI_OFFSET; + info->rssi = hw_rssi - IEEE802154_RADIO_RSSI_OFFSET; corr_val = rfcore_read_byte() & CC2538_CORR_VAL_MASK; - if (corr_val < CC2538_CORR_VAL_MIN) { corr_val = CC2538_CORR_VAL_MIN; } diff --git a/cpu/nrf52/radio/nrf802154/nrf802154_radio.c b/cpu/nrf52/radio/nrf802154/nrf802154_radio.c index 3b36f397f2..592c8d5082 100644 --- a/cpu/nrf52/radio/nrf802154/nrf802154_radio.c +++ b/cpu/nrf52/radio/nrf802154/nrf802154_radio.c @@ -230,11 +230,10 @@ static int _read(ieee802154_dev_t *dev, void *buf, size_t max_size, radio_info->lqi = (uint8_t)(hwlqi > UINT8_MAX/ED_RSSISCALE ? UINT8_MAX : hwlqi * ED_RSSISCALE); - /* Calculate RSSI by subtracting the offset from the datasheet. - * Intentionally using a different calculation than the one from - * figure 122 of the v1.1 product specification. This appears to - * match real world performance better */ - radio_info->rssi = _hwval_to_ieee802154_dbm(hwlqi) + IEEE802154_RADIO_RSSI_OFFSET; + /* We calculate RSSI from LQI, since it's already 8-bit + saturated (see page 321 of product spec v1.1) */ + radio_info->rssi = _hwval_to_ieee802154_dbm(radio_info->lqi) + + IEEE802154_RADIO_RSSI_OFFSET; } memcpy(buf, &rxbuf[1], pktlen); } diff --git a/pkg/openwsn/contrib/radio_hal.c b/pkg/openwsn/contrib/radio_hal.c index e2ebec43b5..28a46dd34c 100644 --- a/pkg/openwsn/contrib/radio_hal.c +++ b/pkg/openwsn/contrib/radio_hal.c @@ -310,7 +310,7 @@ void radio_getReceivedFrame(uint8_t *bufRead, OpenWSN includes IEEE802154_FCS_LEN in its length value */ *lenRead = size + IEEE802154_FCS_LEN; /* get rssi, lqi & crc */ - *rssi = rx_info.rssi; + *rssi = ieee802154_rssi_to_dbm(rx_info.rssi); *lqi = rx_info.lqi; /* only valid crc frames are currently accepted */ *crc = 1;