mirror of
https://github.com/espressif/openthread.git
synced 2026-08-16 07:37:47 +00:00
Pass link quality of ACK frame to MAC layer from nRF52840 radio driver. (#1849)
This commit is contained in:
@@ -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_
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user