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); }
static int _set(netdev_t *netdev, netopt_t opt, const void *value, size_t len) { kw2xrf_t *dev = (kw2xrf_t *)netdev; int res = -ENOTSUP; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_ADDRESS: if (len > sizeof(uint16_t)) { res = -EOVERFLOW; } else { kw2xrf_set_addr_short(dev, *((uint16_t *)value)); /* don't set res to set netdev_ieee802154_t::short_addr */ } break; case NETOPT_ADDRESS_LONG: if (len > sizeof(uint64_t)) { return -EOVERFLOW; } else { kw2xrf_set_addr_long(dev, *((uint64_t *)value)); /* don't set res to set netdev_ieee802154_t::short_addr */ } break; case NETOPT_NID: if (len > sizeof(uint16_t)) { return -EOVERFLOW; } else { kw2xrf_set_pan(dev, *((uint16_t *)value)); /* don't set res to set netdev_ieee802154_t::pan */ } break; case NETOPT_CHANNEL: if (len != sizeof(uint16_t)) { res = -EINVAL; } else { uint8_t chan = ((uint8_t *)value)[0]; if (kw2xrf_set_channel(dev, chan)) { res = -EINVAL; break; } dev->netdev.chan = chan; /* don't set res to set netdev_ieee802154_t::chan */ } break; case NETOPT_CHANNEL_PAGE: res = -EINVAL; break; case NETOPT_TX_POWER: if (len < sizeof(uint16_t)) { res = -EOVERFLOW; } else { kw2xrf_set_tx_power(dev, *(int16_t *)value); res = sizeof(uint16_t); } break; case NETOPT_STATE: if (len > sizeof(netopt_state_t)) { res = -EOVERFLOW; } else { res = _set_state(dev, *((netopt_state_t *)value)); } break; case NETOPT_AUTOACK: /* Set up HW generated automatic ACK after Receive */ kw2xrf_set_option(dev, KW2XRF_OPT_AUTOACK, ((bool *)value)[0]); break; case NETOPT_ACK_REQ: kw2xrf_set_option(dev, KW2XRF_OPT_ACK_REQ, ((bool *)value)[0]); break; case NETOPT_PRELOADING: kw2xrf_set_option(dev, KW2XRF_OPT_PRELOADING, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_PROMISCUOUSMODE: kw2xrf_set_option(dev, KW2XRF_OPT_PROMISCUOUS, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_RX_START_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_RX_START, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_RX_END_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_RX_END, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_TX_START_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_TX_START, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_TX_END_IRQ: kw2xrf_set_option(dev, KW2XRF_OPT_TELL_TX_END, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_AUTOCCA: kw2xrf_set_option(dev, KW2XRF_OPT_AUTOCCA, ((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_CCA_THRESHOLD: if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { kw2xrf_set_cca_threshold(dev, *((int8_t*)value)); res = sizeof(uint8_t); } break; case NETOPT_CCA_MODE: if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { switch (*((int8_t*)value)) { case NETDEV_IEEE802154_CCA_MODE_1: case NETDEV_IEEE802154_CCA_MODE_2: case NETDEV_IEEE802154_CCA_MODE_3: kw2xrf_set_cca_mode(dev, *((int8_t*)value)); res = sizeof(uint8_t); break; case NETDEV_IEEE802154_CCA_MODE_4: case NETDEV_IEEE802154_CCA_MODE_5: case NETDEV_IEEE802154_CCA_MODE_6: default: break; } } break; case NETOPT_RF_TESTMODE: #ifdef KW2XRF_TESTMODE if (len < sizeof(uint8_t)) { res = -EOVERFLOW; } else { kw2xrf_set_test_mode(dev, *((uint8_t *)value)); res = sizeof(uint8_t); } #endif break; default: break; } if (res == -ENOTSUP) { res = netdev_ieee802154_set((netdev_ieee802154_t *)netdev, opt, value, len); } return res; }