void cc2538_init(void) { const init_pair_t *pair; for (pair = init_table; pair->reg_addr != NULL; pair++) { *pair->reg_addr = pair->value; } cc2538_set_tx_power(CC2538_RF_POWER_DEFAULT); cc2538_set_chan(CC2538_RF_CHANNEL_DEFAULT); cc2538_set_pan(CC2538_RF_PANID_DEFAULT); cc2538_set_addr_long(cc2538_get_eui64_primary()); /* Select the observable signals (maximum of three) */ RFCORE_XREG_RFC_OBS_CTRL0 = tx_active; RFCORE_XREG_RFC_OBS_CTRL1 = rx_active; RFCORE_XREG_RFC_OBS_CTRL2 = ffctrl_fifo; /* Select output pins for the three observable signals */ #ifdef BOARD_OPENMOTE_CC2538 CCTEST_OBSSEL0 = 0; /* PC0 = USB_SEL */ CCTEST_OBSSEL1 = 0; /* PC1 = N/C */ CCTEST_OBSSEL2 = 0; /* PC2 = N/C */ CCTEST_OBSSEL3 = 0; /* PC3 = USER_BUTTON */ CCTEST_OBSSEL4 = OBSSEL_EN | rfc_obs_sig0; /* PC4 = RED_LED */ CCTEST_OBSSEL5 = 0; /* PC5 = ORANGE_LED */ CCTEST_OBSSEL6 = OBSSEL_EN | rfc_obs_sig1; /* PC6 = YELLOW_LED */ CCTEST_OBSSEL7 = OBSSEL_EN | rfc_obs_sig2; /* PC7 = GREEN_LED */ #else /* Assume BOARD_CC2538DK (or similar). */ CCTEST_OBSSEL0 = OBSSEL_EN | rfc_obs_sig0; /* PC0 = LED_1 (red) */ CCTEST_OBSSEL1 = OBSSEL_EN | rfc_obs_sig1; /* PC1 = LED_2 (yellow) */ CCTEST_OBSSEL2 = OBSSEL_EN | rfc_obs_sig2; /* PC2 = LED_3 (green) */ CCTEST_OBSSEL3 = 0; /* PC3 = LED_4 (red) */ CCTEST_OBSSEL4 = 0; /* PC4 = BTN_L */ CCTEST_OBSSEL5 = 0; /* PC5 = BTN_R */ CCTEST_OBSSEL6 = 0; /* PC6 = BTN_UP */ CCTEST_OBSSEL7 = 0; /* PC7 = BTN_DN */ #endif /* BOARD_OPENMOTE_CC2538 */ if (SYS_CTRL->I_MAP) { NVIC_SetPriority(RF_RXTX_ALT_IRQn, RADIO_IRQ_PRIO); NVIC_EnableIRQ(RF_RXTX_ALT_IRQn); NVIC_SetPriority(RF_ERR_ALT_IRQn, RADIO_IRQ_PRIO); NVIC_EnableIRQ(RF_ERR_ALT_IRQn); } else { NVIC_SetPriority(RF_RXTX_IRQn, RADIO_IRQ_PRIO); NVIC_EnableIRQ(RF_RXTX_IRQn); NVIC_SetPriority(RF_ERR_IRQn, RADIO_IRQ_PRIO); NVIC_EnableIRQ(RF_ERR_IRQn); } /* Flush the receive and transmit FIFOs */ RFCORE_SFR_RFST = ISFLUSHTX; RFCORE_SFR_RFST = ISFLUSHRX; cc2538_on(); }
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; }