Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions drivers/at86rf2xx/at86rf2xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ void at86rf2xx_setup(at86rf2xx_t *dev, const at86rf2xx_params_t *params)
netdev->driver = &at86rf2xx_driver;
/* initialize device descriptor */
memcpy(&dev->params, params, sizeof(at86rf2xx_params_t));
/* State to return after receiving or transmitting */
dev->idle_state = AT86RF2XX_STATE_TRX_OFF;
/* radio state is P_ON when first powered-on */
dev->state = AT86RF2XX_STATE_P_ON;
Expand Down Expand Up @@ -123,6 +124,8 @@ void at86rf2xx_reset(at86rf2xx_t *dev)
/* clear interrupt flags */
at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_STATUS);

/* State to return after receiving or transmitting */
dev->idle_state = AT86RF2XX_STATE_RX_AACK_ON;
/* go into RX state */
at86rf2xx_set_state(dev, AT86RF2XX_STATE_RX_AACK_ON);

Expand Down
26 changes: 23 additions & 3 deletions drivers/at86rf2xx/at86rf2xx_netdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,11 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info)
uint8_t phr;
size_t pkt_len;

/* frame buffer protection will be unlocked as soon as at86rf2xx_fb_stop()
* is called*/
/* frame buffer protection will be unlocked as soon as at86rf2xx_fb_stop() is called,
* Set receiver to PLL_ON state to be able to free the SPI bus and avoid loosing data. */
at86rf2xx_set_state(dev, AT86RF2XX_STATE_PLL_ON);

/* start frame buffer access */
at86rf2xx_fb_start(dev);

/* get the size of the received packet */
Expand All @@ -141,14 +144,27 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info)
/* ignore MSB (refer p.80) and substract length of FCS field */
pkt_len = (phr & 0x7f) - 2;

/* just return length when buf == NULL */
/* return length when buf == NULL */
if (buf == NULL) {
/* release SPI bus */
at86rf2xx_fb_stop(dev);

/* drop packet, continue receiving */
if (len > 0) {
/* set device back in operation state which was used before last transmission.
* e.g RX_AACK_ON */
at86rf2xx_set_state(dev, dev->idle_state);
}

return pkt_len;
}

/* not enough space in buf */
if (pkt_len > len) {
at86rf2xx_fb_stop(dev);
/* set device back in operation state which was used before last transmission.
* e.g RX_AACK_ON */
at86rf2xx_set_state(dev, dev->idle_state);
return -ENOBUFS;
}
#ifdef MODULE_NETSTATS_L2
Expand Down Expand Up @@ -202,6 +218,10 @@ static int _recv(netdev_t *netdev, void *buf, size_t len, void *info)
at86rf2xx_fb_stop(dev);
}

/* set device back in operation state which was used before last transmission.
* e.g RX_AACK_ON */
at86rf2xx_set_state(dev, dev->idle_state);

return pkt_len;
}

Expand Down