Merge pull request #14596 from benpicco/drivers/at86rf2xx-retries

drivers/at86rf2xx: support frame retry reporting on AT86RFR2
This commit is contained in:
Alexandre Abadie 2020-09-09 10:27:05 +02:00 committed by GitHub
commit fdaf7fd822
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 5 deletions

View File

@ -142,6 +142,13 @@ void at86rf2xx_reset(at86rf2xx_t *dev)
/* enable interrupts */
at86rf2xx_reg_write(dev, AT86RF2XX_REG__IRQ_MASK,
AT86RF2XX_IRQ_STATUS_MASK__TRX_END);
/* enable TX start interrupt for retry counter */
#ifdef AT86RF2XX_REG__IRQ_MASK1
at86rf2xx_reg_write(dev, AT86RF2XX_REG__IRQ_MASK1,
AT86RF2XX_IRQ_STATUS_MASK1__TX_START);
#endif
/* clear interrupt flags */
at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_STATUS);
@ -186,10 +193,14 @@ size_t at86rf2xx_tx_load(at86rf2xx_t *dev, const uint8_t *data,
return offset + len;
}
void at86rf2xx_tx_exec(const at86rf2xx_t *dev)
void at86rf2xx_tx_exec(at86rf2xx_t *dev)
{
netdev_t *netdev = (netdev_t *)dev;
#if AT86RF2XX_HAVE_RETRIES
dev->tx_retries = -1;
#endif
/* write frame length field in FIFO */
at86rf2xx_sram_write(dev, 0, &(dev->tx_frame_len), 1);
/* trigger sending of pre-loaded frame */

View File

@ -690,7 +690,7 @@ static void _isr_send_complete(at86rf2xx_t *dev, uint8_t trac_status)
return;
}
/* Only radios with the XAH_CTRL_2 register support frame retry reporting */
#if AT86RF2XX_HAVE_RETRIES
#if AT86RF2XX_HAVE_RETRIES && defined(AT86RF2XX_REG__XAH_CTRL_2)
dev->tx_retries = (at86rf2xx_reg_read(dev, AT86RF2XX_REG__XAH_CTRL_2)
& AT86RF2XX_XAH_CTRL_2__ARET_FRAME_RETRIES_MASK) >>
AT86RF2XX_XAH_CTRL_2__ARET_FRAME_RETRIES_OFFSET;
@ -821,6 +821,26 @@ static void _isr(netdev_t *netdev)
#if defined(MODULE_AT86RFA1) || defined(MODULE_AT86RFR2)
/**
* @brief ISR for transceiver's TX_START interrupt
*
* In procedure TX_ARET the TRX24_TX_START interrupt is issued separately for every
* frame transmission and frame retransmission.
* Indicates the frame start of a transmitted acknowledge frame in procedure RX_AACK.
*
* Flow Diagram Manual p. 52 / 63
*/
#if AT86RF2XX_HAVE_RETRIES
ISR(TRX24_TX_START_vect){
/* __enter_isr(); is not neccessary as there is nothing which causes a
* thread_yield and the interrupt can not be interrupted by an other ISR */
at86rf2xx_t *dev = (at86rf2xx_t *) at86rfmega_dev;
dev->tx_retries++;
}
#endif
/**
* @brief ISR for transceiver's receive end interrupt
*

View File

@ -87,6 +87,9 @@ extern "C" {
#define AT86RF2XX_REG__TRX_RPC (&TRX_RPC)
#define AT86RF2XX_REG__ANT_DIV (&ANT_DIV)
#define AT86RF2XX_REG__IRQ_MASK (&IRQ_MASK)
#ifdef IRQ_MASK1
#define AT86RF2XX_REG__IRQ_MASK1 (&IRQ_MASK1)
#endif
#define AT86RF2XX_REG__IRQ_STATUS (&IRQ_STATUS)
#define AT86RF2XX_REG__IRQ_STATUS1 (&IRQ_STATUS1)
#define AT86RF2XX_REG__VREG_CTRL (&VREG_CTRL)

View File

@ -120,7 +120,7 @@ extern "C" {
# define MIN_RX_SENSITIVITY (-101)
#endif
#if defined(DOXYGEN) || defined(MODULE_AT86RF232) || defined(MODULE_AT86RF233)
#if defined(DOXYGEN) || defined(MODULE_AT86RF232) || defined(MODULE_AT86RF233) || defined(MODULE_AT86RFR2)
/**
* @brief Frame retry counter reporting
*
@ -284,7 +284,7 @@ typedef struct {
return to @ref at86rf2xx_t::idle_state */
#if AT86RF2XX_HAVE_RETRIES
/* Only radios with the XAH_CTRL_2 register support frame retry reporting */
uint8_t tx_retries; /**< Number of NOACK retransmissions */
int8_t tx_retries; /**< Number of NOACK retransmissions */
#endif
/** @} */
} at86rf2xx_t;
@ -621,7 +621,7 @@ size_t at86rf2xx_tx_load(at86rf2xx_t *dev, const uint8_t *data,
*
* @param[in] dev device to trigger
*/
void at86rf2xx_tx_exec(const at86rf2xx_t *dev);
void at86rf2xx_tx_exec(at86rf2xx_t *dev);
/**
* @brief Perform one manual channel clear assessment (CCA)