From 961c49e2cc138e1ff2089eec173d692122884ec2 Mon Sep 17 00:00:00 2001 From: smlng <s@mlng.net> Date: Fri, 30 Jun 2017 13:47:12 +0200 Subject: [PATCH] drivers, at86rf2xx: simplify internal functions - at86rf2xx_tx_prepare - at86rf2xx_set_state - at86rf2xx_set_option --- drivers/at86rf2xx/at86rf2xx.c | 11 +- drivers/at86rf2xx/at86rf2xx_getset.c | 165 +++++++++++---------------- 2 files changed, 66 insertions(+), 110 deletions(-) diff --git a/drivers/at86rf2xx/at86rf2xx.c b/drivers/at86rf2xx/at86rf2xx.c index b8cb1905ae..7b2592da04 100644 --- a/drivers/at86rf2xx/at86rf2xx.c +++ b/drivers/at86rf2xx/at86rf2xx.c @@ -142,19 +142,10 @@ void at86rf2xx_tx_prepare(at86rf2xx_t *dev) uint8_t state; dev->pending_tx++; - - /* make sure ongoing transmissions are finished */ - do { - state = at86rf2xx_get_status(dev); - } while (state == AT86RF2XX_STATE_BUSY_RX_AACK || - state == AT86RF2XX_STATE_BUSY_TX_ARET); - + state = at86rf2xx_set_state(dev, AT86RF2XX_STATE_TX_ARET_ON); if (state != AT86RF2XX_STATE_TX_ARET_ON) { dev->idle_state = state; } - - at86rf2xx_set_state(dev, AT86RF2XX_STATE_TX_ARET_ON); - dev->tx_frame_len = IEEE802154_FCS_LEN; } diff --git a/drivers/at86rf2xx/at86rf2xx_getset.c b/drivers/at86rf2xx/at86rf2xx_getset.c index fc66c557cc..bfd55da17f 100644 --- a/drivers/at86rf2xx/at86rf2xx_getset.c +++ b/drivers/at86rf2xx/at86rf2xx_getset.c @@ -347,86 +347,58 @@ void at86rf2xx_set_option(at86rf2xx_t *dev, uint16_t option, bool state) DEBUG("set option %i to %i\n", option, state); /* set option field */ - if (state) { - dev->netdev.flags |= option; - /* trigger option specific actions */ - switch (option) { - case AT86RF2XX_OPT_CSMA: + dev->netdev.flags = (state) ? (dev->netdev.flags | option) + : (dev->netdev.flags & ~option); + /* trigger option specific actions */ + switch (option) { + case AT86RF2XX_OPT_CSMA: + if (state) { DEBUG("[at86rf2xx] opt: enabling CSMA mode" \ "(4 retries, min BE: 3 max BE: 5)\n"); /* Initialize CSMA seed with hardware address */ at86rf2xx_set_csma_seed(dev, dev->netdev.long_addr); at86rf2xx_set_csma_max_retries(dev, 4); at86rf2xx_set_csma_backoff_exp(dev, 3, 5); - break; - case AT86RF2XX_OPT_PROMISCUOUS: - DEBUG("[at86rf2xx] opt: enabling PROMISCUOUS mode\n"); - /* disable auto ACKs in promiscuous mode */ - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__CSMA_SEED_1); - tmp |= AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK; - at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, tmp); - /* enable promiscuous mode */ - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__XAH_CTRL_1); - tmp |= AT86RF2XX_XAH_CTRL_1__AACK_PROM_MODE; - at86rf2xx_reg_write(dev, AT86RF2XX_REG__XAH_CTRL_1, tmp); - break; - case AT86RF2XX_OPT_AUTOACK: - DEBUG("[at86rf2xx] opt: enabling auto ACKs\n"); - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__CSMA_SEED_1); - tmp &= ~(AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK); - at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, tmp); - break; - case AT86RF2XX_OPT_TELL_RX_START: - DEBUG("[at86rf2xx] opt: enabling SFD IRQ\n"); - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_MASK); - tmp |= AT86RF2XX_IRQ_STATUS_MASK__RX_START; - at86rf2xx_reg_write(dev, AT86RF2XX_REG__IRQ_MASK, tmp); - break; - default: - /* do nothing */ - break; - } - } - else { - dev->netdev.flags &= ~(option); - /* trigger option specific actions */ - switch (option) { - case AT86RF2XX_OPT_CSMA: + } + else { DEBUG("[at86rf2xx] opt: disabling CSMA mode\n"); /* setting retries to -1 means CSMA disabled */ at86rf2xx_set_csma_max_retries(dev, -1); - break; - case AT86RF2XX_OPT_PROMISCUOUS: - DEBUG("[at86rf2xx] opt: disabling PROMISCUOUS mode\n"); - /* disable promiscuous mode */ - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__XAH_CTRL_1); - tmp &= ~(AT86RF2XX_XAH_CTRL_1__AACK_PROM_MODE); - at86rf2xx_reg_write(dev, AT86RF2XX_REG__XAH_CTRL_1, tmp); - /* re-enable AUTOACK only if the option is set */ - if (dev->netdev.flags & AT86RF2XX_OPT_AUTOACK) { - tmp = at86rf2xx_reg_read(dev, - AT86RF2XX_REG__CSMA_SEED_1); - tmp &= ~(AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK); - at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, - tmp); - } - break; - case AT86RF2XX_OPT_AUTOACK: - DEBUG("[at86rf2xx] opt: disabling auto ACKs\n"); - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__CSMA_SEED_1); - tmp |= AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK; - at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, tmp); - break; - case AT86RF2XX_OPT_TELL_RX_START: - DEBUG("[at86rf2xx] opt: disabling SFD IRQ\n"); - tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_MASK); - tmp &= ~AT86RF2XX_IRQ_STATUS_MASK__RX_START; - at86rf2xx_reg_write(dev, AT86RF2XX_REG__IRQ_MASK, tmp); - break; - default: - /* do nothing */ - break; - } + } + break; + case AT86RF2XX_OPT_PROMISCUOUS: + DEBUG("[at86rf2xx] opt: %s PROMISCUOUS mode\n", + (state ? "enabling" : "disabling")); + /* disable/enable auto ACKs in promiscuous mode */ + tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__CSMA_SEED_1); + tmp = (state) ? (tmp | AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK) + : (tmp & ~AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK); + at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, tmp); + /* enable/disable promiscuous mode */ + tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__XAH_CTRL_1); + tmp = (state) ? (tmp | AT86RF2XX_XAH_CTRL_1__AACK_PROM_MODE) + : (tmp & ~AT86RF2XX_XAH_CTRL_1__AACK_PROM_MODE); + at86rf2xx_reg_write(dev, AT86RF2XX_REG__XAH_CTRL_1, tmp); + break; + case AT86RF2XX_OPT_AUTOACK: + DEBUG("[at86rf2xx] opt: %s auto ACKs\n", + (state ? "enabling" : "disabling")); + tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__CSMA_SEED_1); + tmp = (state) ? (tmp & ~AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK) + : (tmp | AT86RF2XX_CSMA_SEED_1__AACK_DIS_ACK); + at86rf2xx_reg_write(dev, AT86RF2XX_REG__CSMA_SEED_1, tmp); + break; + case AT86RF2XX_OPT_TELL_RX_START: + DEBUG("[at86rf2xx] opt: %s SFD IRQ\n", + (state ? "enabling" : "disabling")); + tmp = at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_MASK); + tmp = (state) ? (tmp | AT86RF2XX_IRQ_STATUS_MASK__RX_START) + : (tmp & ~AT86RF2XX_IRQ_STATUS_MASK__RX_START); + at86rf2xx_reg_write(dev, AT86RF2XX_REG__IRQ_MASK, tmp); + break; + default: + /* do nothing */ + break; } } @@ -476,36 +448,29 @@ uint8_t at86rf2xx_set_state(at86rf2xx_t *dev, uint8_t state) if (state == AT86RF2XX_STATE_FORCE_TRX_OFF) { _set_state(dev, AT86RF2XX_STATE_TRX_OFF, state); - return old_state; - } - - if (state == old_state) { - return old_state; } - - /* we need to go via PLL_ON if we are moving between RX_AACK_ON <-> TX_ARET_ON */ - if ((old_state == AT86RF2XX_STATE_RX_AACK_ON && - state == AT86RF2XX_STATE_TX_ARET_ON) || - (old_state == AT86RF2XX_STATE_TX_ARET_ON && - state == AT86RF2XX_STATE_RX_AACK_ON)) { - _set_state(dev, AT86RF2XX_STATE_PLL_ON, AT86RF2XX_STATE_PLL_ON); - } - /* check if we need to wake up from sleep mode */ - else if (old_state == AT86RF2XX_STATE_SLEEP) { - DEBUG("at86rf2xx: waking up from sleep mode\n"); - at86rf2xx_assert_awake(dev); - } - - if (state == AT86RF2XX_STATE_SLEEP) { - /* First go to TRX_OFF */ - at86rf2xx_set_state(dev, AT86RF2XX_STATE_FORCE_TRX_OFF); - /* Discard all IRQ flags, framebuffer is lost anyway */ - at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_STATUS); - /* Go to SLEEP mode from TRX_OFF */ - gpio_set(dev->params.sleep_pin); - dev->state = state; - } else { - _set_state(dev, state, state); + else if (state != old_state) { + /* we need to go via PLL_ON if we are moving between RX_AACK_ON <-> TX_ARET_ON */ + if ((old_state | state) == (AT86RF2XX_STATE_RX_AACK_ON | AT86RF2XX_STATE_TX_ARET_ON)) { + _set_state(dev, AT86RF2XX_STATE_PLL_ON, AT86RF2XX_STATE_PLL_ON); + } + /* check if we need to wake up from sleep mode */ + if (state == AT86RF2XX_STATE_SLEEP) { + /* First go to TRX_OFF */ + _set_state(dev, AT86RF2XX_STATE_TRX_OFF, + AT86RF2XX_STATE_FORCE_TRX_OFF); + /* Discard all IRQ flags, framebuffer is lost anyway */ + at86rf2xx_reg_read(dev, AT86RF2XX_REG__IRQ_STATUS); + /* Go to SLEEP mode from TRX_OFF */ + gpio_set(dev->params.sleep_pin); + dev->state = state; + } else { + if (old_state == AT86RF2XX_STATE_SLEEP) { + DEBUG("at86rf2xx: waking up from sleep mode\n"); + at86rf2xx_assert_awake(dev); + } + _set_state(dev, state, state); + } } return old_state; -- GitLab