Pass link quality of ACK frame to MAC layer from nRF52840 radio driver. (#1849)

This commit is contained in:
Hubert Miś
2017-05-31 09:06:30 -07:00
committed by Jonathan Hui
parent 7b478b9320
commit 5943b5d559
4 changed files with 36 additions and 24 deletions
@@ -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_
+22 -11
View File
@@ -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.