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 _get(netdev_t *netdev, netopt_t opt, void *value, size_t max_len) { cc2538_rf_t *dev = (cc2538_rf_t *)netdev; if (dev == NULL) { return -ENODEV; } switch (opt) { case NETOPT_ADDRESS: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } else { *(uint16_t*)value = cc2538_get_addr_short(); } return sizeof(uint16_t); case NETOPT_ADDRESS_LONG: if (max_len < sizeof(uint64_t)) { return -EOVERFLOW; } else { *(uint64_t*)value = cc2538_get_addr_long(); } return sizeof(uint64_t); case NETOPT_AUTOACK: if (RFCORE->XREG_FRMCTRL0bits.AUTOACK) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_CHANNEL: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = (uint16_t)cc2538_get_chan(); return sizeof(uint16_t); case NETOPT_CHANNEL_PAGE: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } /* This tranceiver only supports page 0 */ *((uint16_t *)value) = 0; return sizeof(uint16_t); case NETOPT_DEVICE_TYPE: if (max_len < sizeof(uint16_t)) { return -EOVERFLOW; } *((uint16_t *) value) = NETDEV_TYPE_IEEE802154; return sizeof(uint16_t); case NETOPT_IS_CHANNEL_CLR: if (cc2538_channel_clear()) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_IS_WIRED: return -ENOTSUP; case NETOPT_PROMISCUOUSMODE: if (cc2538_get_monitor()) { *((netopt_enable_t *)value) = NETOPT_ENABLE; } else { *((netopt_enable_t *)value) = NETOPT_DISABLE; } return sizeof(netopt_enable_t); case NETOPT_STATE: if (max_len < sizeof(netopt_state_t)) { return -EOVERFLOW; } *((netopt_state_t *)value) = dev->state; return sizeof(netopt_state_t); case NETOPT_TX_POWER: if (max_len < sizeof(int16_t)) { return -EOVERFLOW; } *((uint16_t *)value) = cc2538_get_tx_power(); return sizeof(uint16_t); default: break; } int res; if (((res = netdev_ieee802154_get((netdev_ieee802154_t *)netdev, opt, value, max_len)) >= 0) || (res != -ENOTSUP)) { return res; } return -ENOTSUP; }