static int _init(netdev2_t *netdev) { cc2538_rf_t *dev = (cc2538_rf_t *) netdev; _dev = netdev; uint16_t pan = cc2538_get_pan(); uint16_t chan = cc2538_get_chan(); uint16_t addr_short = cc2538_get_addr_short(); uint64_t addr_long = cc2538_get_addr_long(); /* Initialise netdev2_ieee802154_t struct */ netdev2_ieee802154_set((netdev2_ieee802154_t *)netdev, NETOPT_NID, &pan, sizeof(pan)); netdev2_ieee802154_set((netdev2_ieee802154_t *)netdev, NETOPT_CHANNEL, &chan, sizeof(chan)); netdev2_ieee802154_set((netdev2_ieee802154_t *)netdev, NETOPT_ADDRESS, &addr_short, sizeof(addr_short)); netdev2_ieee802154_set((netdev2_ieee802154_t *)netdev, NETOPT_ADDRESS_LONG, &addr_long, sizeof(addr_long)); cc2538_set_state(dev, NETOPT_STATE_IDLE); /* set default protocol */ #ifdef MODULE_GNRC_SIXLOWPAN dev->netdev.proto = GNRC_NETTYPE_SIXLOWPAN; #elif MODULE_GNRC dev->netdev.proto = GNRC_NETTYPE_UNDEF; #endif #ifdef MODULE_NETSTATS_L2 memset(&netdev->stats, 0, sizeof(netstats_t)); #endif return 0; }
static int _init(netdev_t *netdev) { cc2538_rf_t *dev = (cc2538_rf_t *) netdev; _dev = netdev; uint16_t pan = cc2538_get_pan(); uint16_t chan = cc2538_get_chan(); uint16_t addr_short = cc2538_get_addr_short(); uint64_t addr_long = cc2538_get_addr_long(); netdev_ieee802154_reset(&dev->netdev); /* Initialise netdev_ieee802154_t struct */ netdev_ieee802154_set(&dev->netdev, NETOPT_NID, &pan, sizeof(pan)); netdev_ieee802154_set(&dev->netdev, NETOPT_CHANNEL, &chan, sizeof(chan)); netdev_ieee802154_set(&dev->netdev, NETOPT_ADDRESS, &addr_short, sizeof(addr_short)); netdev_ieee802154_set(&dev->netdev, NETOPT_ADDRESS_LONG, &addr_long, sizeof(addr_long)); cc2538_set_state(dev, NETOPT_STATE_IDLE); #ifdef MODULE_NETSTATS_L2 memset(&netdev->stats, 0, sizeof(netstats_t)); #endif return 0; }
static int _set(netdev2_t *netdev, netopt_t opt, void *value, size_t value_len) { cc2538_rf_t *dev = (cc2538_rf_t *)netdev; int res = -ENOTSUP; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_ADDRESS: if (value_len > sizeof(uint16_t)) { res = -EOVERFLOW; } else { cc2538_set_addr_short(*((uint16_t*)value)); } break; case NETOPT_ADDRESS_LONG: if (value_len > sizeof(uint64_t)) { res = -EOVERFLOW; } else { cc2538_set_addr_long(*((uint64_t*)value)); } break; case NETOPT_AUTOACK: RFCORE->XREG_FRMCTRL0bits.AUTOACK = ((bool *)value)[0]; res = sizeof(netopt_enable_t); break; case NETOPT_CHANNEL: if (value_len != sizeof(uint16_t)) { res = -EINVAL; } else { uint8_t chan = ((uint8_t *)value)[0]; if (chan < IEEE802154_CHANNEL_MIN || chan > IEEE802154_CHANNEL_MAX) { res = -EINVAL; } else { cc2538_set_chan(chan); } } break; case NETOPT_CHANNEL_PAGE: /* This tranceiver only supports page 0 */ if (value_len != sizeof(uint16_t) || *((uint16_t *)value) != 0 ) { res = -EINVAL; } else { res = sizeof(uint16_t); } break; case NETOPT_IS_WIRED: return -ENOTSUP; case NETOPT_NID: if (value_len > sizeof(uint16_t)) { res = -EOVERFLOW; } else { cc2538_set_pan(*((uint16_t *)value)); } break; case NETOPT_PROMISCUOUSMODE: cc2538_set_monitor(((bool *)value)[0]); res = sizeof(netopt_enable_t); break; case NETOPT_STATE: if (value_len > sizeof(netopt_state_t)) { return -EOVERFLOW; } cc2538_set_state(dev, *((netopt_state_t *)value)); res = sizeof(netopt_state_t); break; case NETOPT_TX_POWER: if (value_len > sizeof(int16_t)) { return -EOVERFLOW; } cc2538_set_tx_power(*((int16_t *)value)); res = sizeof(uint16_t); break; default: break; } if (res == -ENOTSUP) { res = netdev2_ieee802154_set((netdev2_ieee802154_t *)netdev, opt, value, value_len); } return res; }