diff --git a/examples/platforms/nrf52840/openthread-core-nrf52840-config.h b/examples/platforms/nrf52840/openthread-core-nrf52840-config.h index 5aad771d5..7330486ac 100644 --- a/examples/platforms/nrf52840/openthread-core-nrf52840-config.h +++ b/examples/platforms/nrf52840/openthread-core-nrf52840-config.h @@ -131,12 +131,4 @@ */ #define OPENTHREAD_CONFIG_MBEDTLS_HEAP_SIZE_NO_DTLS 2048 -/** - * @def OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE - * - * Define to 1 if you want use legacy transmit done. - * - */ -#define OPENTHREAD_CONFIG_LEGACY_TRANSMIT_DONE 1 - #endif // OPENTHREAD_CORE_NRF52840_CONFIG_H_ diff --git a/examples/platforms/nrf52840/radio.c b/examples/platforms/nrf52840/radio.c index dd31e5870..e68092c9f 100644 --- a/examples/platforms/nrf52840/radio.c +++ b/examples/platforms/nrf52840/radio.c @@ -76,7 +76,7 @@ static otRadioFrame sReceivedFrames[RADIO_RX_BUFFERS]; static otRadioFrame sTransmitFrame; static uint8_t sTransmitPsdu[OT_RADIO_FRAME_MAX_SIZE + 1] __attribute__((section("nrf_radio_buffer.sTransmiPsdu"))); -static uint8_t *sAckPsdu; +static otRadioFrame sAckFrame; static uint32_t sEnergyDetectionTime; static uint8_t sEnergyDetectionChannel; @@ -104,7 +104,7 @@ static void dataInit(void) sReceivedFrames[i].mPsdu = NULL; } - sAckPsdu = NULL; + memset(&sAckFrame, 0, sizeof(sAckFrame)); } static void convertShortAddress(uint8_t *aTo, uint16_t aFrom) @@ -518,24 +518,24 @@ void nrf5RadioProcess(otInstance *aInstance) if (isPendingEventSet(kPendingEventFrameTransmitted)) { - bool pendingBit = ((sAckPsdu != NULL) && (sAckPsdu[1] & PENDING_BIT)) ? true : false; - #if OPENTHREAD_ENABLE_DIAG if (otPlatDiagModeGet()) { + bool pendingBit = ((sAckFrame.mPsdu != NULL) && (sAckFrame.mPsdu[1] & PENDING_BIT)) ? true : false; otPlatDiagRadioTransmitDone(aInstance, &sTransmitFrame, pendingBit, OT_ERROR_NONE); } else #endif { - otPlatRadioTransmitDone(aInstance, &sTransmitFrame, pendingBit, OT_ERROR_NONE); + otRadioFrame *ackPtr = (sAckFrame.mPsdu == NULL) ? NULL : &sAckFrame; + otPlatRadioTxDone(aInstance, &sTransmitFrame, ackPtr, OT_ERROR_NONE); } - if (sAckPsdu != NULL) + if (sAckFrame.mPsdu != NULL) { - nrf_drv_radio802154_buffer_free(sAckPsdu); - sAckPsdu = NULL; + nrf_drv_radio802154_buffer_free(sAckFrame.mPsdu - 1); + sAckFrame.mPsdu = NULL; } resetPendingEvent(kPendingEventFrameTransmitted); @@ -552,7 +552,7 @@ void nrf5RadioProcess(otInstance *aInstance) else #endif { - otPlatRadioTransmitDone(aInstance, &sTransmitFrame, false, OT_ERROR_CHANNEL_ACCESS_FAILURE); + otPlatRadioTxDone(aInstance, &sTransmitFrame, NULL, OT_ERROR_CHANNEL_ACCESS_FAILURE); } resetPendingEvent(kPendingEventChannelAccessFailure); @@ -606,9 +606,20 @@ void nrf_drv_radio802154_received(uint8_t *p_data, int8_t power, int8_t lqi) receivedFrame->mChannel = nrf_drv_radio802154_channel_get(); } -void nrf_drv_radio802154_transmitted(uint8_t *aAckPsdu) +void nrf_drv_radio802154_transmitted(uint8_t *aAckPsdu, int8_t aPower, int8_t aLqi) { - sAckPsdu = aAckPsdu; + if (aAckPsdu == NULL) + { + sAckFrame.mPsdu = NULL; + } + else + { + sAckFrame.mPsdu = &aAckPsdu[1]; + sAckFrame.mLength = aAckPsdu[0]; + sAckFrame.mPower = aPower; + sAckFrame.mLqi = aLqi; + sAckFrame.mChannel = nrf_drv_radio802154_channel_get(); + } setPendingEvent(kPendingEventFrameTransmitted); } diff --git a/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.c b/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.c index ef7d90192..498ea5223 100644 --- a/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.c +++ b/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.c @@ -1222,9 +1222,12 @@ void RADIO_IRQHandler(void) } break; + case RADIO_STATE_RX_ACK: + nrf_radio_task_trigger(NRF_RADIO_TASK_RSSISTART); + break; + case RADIO_STATE_TX_ACK: case RADIO_STATE_TX_FRAME: - case RADIO_STATE_RX_ACK: case RADIO_STATE_CCA: // This could happen at the beginning of transmission procedure. break; @@ -1439,7 +1442,7 @@ void RADIO_IRQHandler(void) if (!ack_is_requested(mp_tx_data)) { - nrf_drv_radio802154_transmitted(NULL); + nrf_drv_radio802154_transmitted(NULL, 0, 0); state_set(RADIO_STATE_WAITING_RX_FRAME); } @@ -1464,7 +1467,9 @@ void RADIO_IRQHandler(void) (nrf_radio_crc_status_get() == NRF_RADIO_CRC_STATUS_OK)) { mp_current_rx_buffer->free = false; - nrf_drv_radio802154_transmitted(mp_current_rx_buffer->psdu); + nrf_drv_radio802154_transmitted(mp_current_rx_buffer->psdu, // psdu + nrf_drv_radio802154_rssi_last_get(), // rssi + RX_FRAME_LQI(mp_current_rx_buffer->psdu)); // lqi nrf_radio_mhmu_search_pattern_set(0); nrf_radio_event_clear(NRF_RADIO_EVENT_MHRMATCH); @@ -1679,9 +1684,11 @@ void __attribute__((weak)) nrf_drv_radio802154_received(uint8_t * p_data, int8_t (void) lqi; } -void __attribute__((weak)) nrf_drv_radio802154_transmitted(uint8_t * p_ack) +void __attribute__((weak)) nrf_drv_radio802154_transmitted(uint8_t * p_ack, int8_t power, int8_t lqi) { (void) p_ack; + (void) power; + (void) lqi; } void __attribute__((weak)) nrf_drv_radio802154_busy_channel(void) diff --git a/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.h b/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.h index 6282ca7ae..7dd77d228 100644 --- a/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.h +++ b/third_party/NordicSemiconductor/drivers/nrf_drv_radio802154.h @@ -233,8 +233,10 @@ void nrf_drv_radio802154_received(uint8_t * p_data, int8_t power, int8_t lqi); * @param[in] p_ack Pointer to received ACK buffer. The first byte in the buffer is length of the * frame and following bytes are the ACK frame itself (after PHR). * If ACK was not requested @p p_ack is set to NULL. + * @param[in] power RSSI of received ACK frame or 0 if ACK was not requested. + * @param[in] lqi LQI of received ACK frame or 0 if ACK was not requested. */ -void nrf_drv_radio802154_transmitted(uint8_t * p_ack); +void nrf_drv_radio802154_transmitted(uint8_t * p_ack, int8_t power, int8_t lqi); /** * @brief Notify that frame was not transmitted due to busy channel.