static int _set_state(kw2xrf_t *dev, netopt_state_t state) { switch (state) { case NETOPT_STATE_SLEEP: kw2xrf_set_power_mode(dev, KW2XRF_DOZE); break; case NETOPT_STATE_IDLE: kw2xrf_set_power_mode(dev, KW2XRF_AUTODOZE); kw2xrf_set_sequence(dev, dev->idle_state); break; case NETOPT_STATE_TX: if (dev->netdev.flags & KW2XRF_OPT_PRELOADING) { kw2xrf_tx_exec(dev); } break; case NETOPT_STATE_RESET: kw2xrf_reset_phy(dev); break; case NETOPT_STATE_OFF: /* TODO: Replace with powerdown (set reset input low) */ kw2xrf_set_power_mode(dev, KW2XRF_HIBERNATE); break; default: return -ENOTSUP; } return sizeof(netopt_state_t); }
void kw2xrf_reset_phy(kw2xrf_t *dev) { netdev_ieee802154_reset(&dev->netdev); dev->tx_power = KW2XRF_DEFAULT_TX_POWER; kw2xrf_set_tx_power(dev, dev->tx_power); kw2xrf_set_channel(dev, KW2XRF_DEFAULT_CHANNEL); kw2xrf_set_pan(dev, KW2XRF_DEFAULT_PANID); kw2xrf_set_address(dev); kw2xrf_set_cca_mode(dev, 1); kw2xrf_set_rx_watermark(dev, 1); kw2xrf_set_option(dev, KW2XRF_OPT_AUTOACK, true); kw2xrf_set_option(dev, KW2XRF_OPT_ACK_REQ, true); kw2xrf_set_option(dev, KW2XRF_OPT_AUTOCCA, true); kw2xrf_set_power_mode(dev, KW2XRF_AUTODOZE); kw2xrf_set_sequence(dev, dev->idle_state); kw2xrf_clear_dreg_bit(dev, MKW2XDM_PHY_CTRL2, MKW2XDM_PHY_CTRL2_SEQMSK); kw2xrf_enable_irq_b(dev); DEBUG("[kw2xrf] init phy and (re)set to channel %d and pan %d.\n", KW2XRF_DEFAULT_CHANNEL, KW2XRF_DEFAULT_PANID); }
void kw2xrf_setup(kw2xrf_t *dev, const kw2xrf_params_t *params) { netdev_t *netdev = (netdev_t *)dev; netdev->driver = &kw2xrf_driver; /* initialize device descriptor */ memcpy(&dev->params, params, sizeof(kw2xrf_params_t)); dev->idle_state = XCVSEQ_RECEIVE; dev->state = 0; dev->pending_tx = 0; kw2xrf_spi_init(dev); kw2xrf_set_power_mode(dev, KW2XRF_IDLE); DEBUG("[kw2xrf] setup finished\n"); }